K8s详细搭建master-POD守护进程方式
K8s所有运行组件
简单部署方式使用kubeadm k8s官方发布的简单部署工具。
- k8s自己的组件以容器的方式运行在node上
- k8s 自己的组件以守护进程的方式运行在系统上
master 包括 api server etcd controller-manager scheduler
环境:
Master,etcd:10.80.2.90
Node1:10.80.2.91
Node2:10.80.2.92
前提:
- 基于主机名通信:/etc/hosts
- 时间同步
- 关闭firewalld和IP tables.service
OS:centos 7 extras仓库
安装配置步骤:
- etcd cluster ,仅master节点
- flannel,集群所有节点
- 配置k8s 的master:仅master节点部署kubernetes-master
- 启动服务:
Kube-apiserver,kube-scheduler,kube-controller-manager
- 配置K8s的各个node节点,
Kubernetes-node
先设定启动docker服务;
启动的k8s服务:
Kube-proxy,kubeletkubeadm
MASTER部署
- master,nodes:安装kubelet,kubeadm,docker
- master:kubeadm init 初始化
- nodes:kubeadm 加入到集群
RPM包安装k8s
然后是RPM包选择阿里云的镜像,地址是:
https://mirrors.aliyun.com/kubernetes/
稳定版位置:
https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
上边连接做yum仓库的路径来配置yum源
然后gpgcheck **路径指定位置
https://mirrors.aliyun.com/kubernetes/yum/doc/
配置yum仓库
cd /etc/yum.repos.d/
先部署docker仓库:
https://mirrors.aliyun.com/docker-ce/linux/centos/
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
复制连接地址然后
Wget 到/etc/yum.repos.d/下
Kubernetes的仓库手动创建
Vim kubernetes.repo
综上yum源指定完毕,接下来使用命令刷新仓库
yum repolist
然后master上的配置完毕,需要把两个k8s 和docker的repo文件scp到node1 node2 上
然后在master上安装yum程序包:
yum install -y kubectl docker-ce kubelet kubeadm
Kubectl如果是源码安装需要下载上图的位置
以上可以先不是用-y 命令 分别查看各种包的版本
注意kubectl 和kubelet的版本
依赖关系也来至于kubernetes的包
如果提示验证检查错误
我们需要把gpgcheck=1 改成0 不检测,然后手动下载yum-key.gpg到本地
还有rpm-package-key.gpg也需要下载到本地
导入key
Rpm - -import yum-key.gpg
rpm - -import rpm-package-key.gpg
再次使用
yum install -y kubectl docker-ce kubelet kubeadm
安装docker时候报错需要先卸载之前的docker
yum list installed | grep docker
docker version
yum erase docker
yum erase docker-common
yum erase container-selinux
获取key
Wget https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
rpm --import yum-key.gpg
wget https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
rpm --import rpm-package-key.gpg导入key
yum install kubelete kubeadm docker-ce kubectl
如果安装过程中报错如下
则需要手动卸载以前的老版本冲突的依赖包
rpm -e kubernetes-client-1.5.2-0.7.git269f928.el7.x86_64卸载
如果提示被kubernetes-master-1.5.2-0.7.git269f928.el7.x86_64依赖 则继续卸载主程序包
rpm -e kubernetes-master-1.5.2-0.7.git269f928.el7.x86_64
并删除备份文件rm -f /etc/kubernetes/apiserver.rpmsave
yum install kubectl docker-ce kubelet kubeadm 重新安装即可
systemctl start docker启动docker时候报错是因为dockers存储指定配置文件
vim /etc/docker/daemon.json
如果没有json格式的文件或则格式错误,则需要手动修改并添加内容如下:
{
"storage-driver"
:
"devicemapper"
}
改变存储设备
Systemctl start docker 启动docker时候
Docker info 会警告存储设备问题 解决办法:
在****收藏了使用方法存储问题 ,在生产上必须做lvm之后在弄这个。
此处可以忽略警告,继续安装
一切就绪之后就用kubeadm init 初始化
kubeadm init –help 查看命令
[[email protected] system]# kubeadm init --pod-network-cidr=10.244.0.0/16 --service-cidr=10.254.0.0/12
I0121 17:10:19.909579 8467 version.go:94] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get https://storage.googleapis.com/kubernetes-release/release/stable-1.txt: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
I0121 17:10:19.909790 8467 version.go:95] falling back to the local client version: v1.13.2
[init] Using Kubernetes version: v1.13.2
[preflight] Running pre-flight checks
[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 18.09.0. Latest validated version: 18.06
[WARNING Hostname]: hostname "master.localdomain" could not be reached
[WARNING Hostname]: hostname "master.localdomain": lookup master.localdomain on 114.114.114.114:53: no such host
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
[ERROR Swap]: running with swap on is not supported. Please disable swap
[ERROR DirAvailable--var-lib-etcd]: /var/lib/etcd is not empty
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
[[email protected] system]#
如果报以上错误则需使用禁用swap错误参数
[[email protected] /]# cat /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"添加
继续执行kubeadm init --pod-network-cidr=10.244.0.0/16 --service-cidr=10.254.0.0/12
--ignore-preflight-errors=Swap
会提示镜像pull不到,办法(1)是在/usr/lib/systemd/system/docker.service中添加代理
Environment=”NO_PROXY=127.0.0.0/8,10.80.2.90”
办法(2)手动下载镜像,docker pull 下来并改名。
我在此处写了一个脚本k8s.sh,然后执行脚本再修改下载下来的标签即可。
#!/bin/bash
Images=(kube-apiserver:v1.13.2 kube-controller-manager:v1.13.2 kube-scheduler:v1.13.2
kube-proxy:v1.13.2 pause:3.1 etcd:3.2.24)
for imageName in ${images[@]} ; do
docker pull mirrorgooglecontainers/$imageName
docker tag mirrorgooglecontainers/$imageName k8s.gcr.io/$imageName
docker rmi mirrorgooglecontainers/$imageName
done
docker tag coredns/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6
docker rmi coredns/coredns:1.2.6
脚本执行完成后用docker images 查看脚本标签是否改了过来
如图,没有问题然后继续初始化命令
[[email protected] ~]# kubeadm init --kubernetes-version=v1.13.2 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.254.0.0/12 --ignore-preflight-errors=Swap
保存令牌留作node加入集群命令
kubeadm join 10.80.2.90:6443 --token q7igu9.vwuiakylpgfk01j4 --discovery-token-ca-cert-hash sha256:ca5ea98580d8a5ea66393c5a2504b34fc3f7d75ae972db78552c6e6390970b2d
使用netstat 查看服务是否启动如图:
然后查看家目录下是否存在.kube 的目录或则
Mkdir -p $HOME/.KUBE
Cp -i /etc/kubernetes/admin.conf $HOME/.kube/config把配置文件复制到家目录下
至此安装完毕
可以用kubectl get获取相关信息
Kubectl get componentstatus组件状态 就简写为cs
Kubectl get cs
查看状态啊正常,通过自己测试重启reboot后可以 开机自启动没有问题。
[[email protected] ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master.localdomain NotReady master 64m v1.13.2
[[email protected] ~]#
状态为notready状态是因为master还缺一个网络组件flannel。
https://github.com/coreos/flannel github的地址为
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
可以看到flannel镜像已经下载完
然后查看nodes状态
Kubectl get nodes 如图
已经是ready状态
然后通过kubectl get pods -n kube-system查看 pod中flannel是否运行起来的状态
Kubenetes有三个命名空间namespace -n参数指定命名空间来查看pods
NODES节点部署
Yum 配置
yum安装需要的nodes节点需要的包
此处node的yum配置跟master是一样的
然后把需要的配置文件scp到本地相应位置,与master一样。
可以在node1和node2分别用下边命令执行
scp [email protected]:/root/rpm-package-key.gpg /root/
scp [email protected]:/root/yum-key.gpg /root/
[email protected]:/usr/lib/systemd/system/docker.service /usr/lib/systemd/system/docker.service
scp [email protected]:/etc/yum.repos.d/docker-ce.repo /etc/yum.repos.d/
scp [email protected]:/etc/yum.repos.d/kubernetes.repo /etc/yum.repos.d/
然后导入gpg验证
rpm --import /root/rpm-package-key.gpg
rpm --import /root/yum-key.gpg
yum repolist 查看是否导入了阿里云的源
yum install -y docker-ce kubelet kubeadm
有一点需要注意
scp [email protected]:/etc/sysconfig/kubelet /etc/sysconfig/kubelet
需要在kubelet安装完之后copy过来 或则自己手动更改
[[email protected] ~]# cat /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"
还需要确定
[[email protected] ~]# cat /etc/docker/daemon.json
{
"storage-driver"
:
"devicemapper"
}
[[email protected] ~]#
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
确定开启了转发功能iptables
接下来安装成功后,先启动docker ,加载之前的配置
systemctl daemon-reload
systemctl start docker
docker info 查看docker 状态
systemctl enable docker kubelet 开机自启
执行k8s.sh脚本下载所需node节点的容器镜像
#!/bin/bash
images=(kube-proxy:v1.13.2 pause:3.1)
for imageName in ${images[@]} ; do
docker pull mirrorgooglecontainers/$imageName
docker tag mirrorgooglecontainers/$imageName k8s.gcr.io/$imageName
docker rmi mirrorgooglecontainers/$imageName
done
docker pull coredns/coredns:1.2.6
docker tag coredns/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6
docker rmi coredns/coredns:1.2.6
docker pull registry.cn-shenzhen.aliyuncs.com/cp_m/flannel:v0.10.0-amd64 docker tag registry.cn-shenzhen.aliyuncs.com/cp_m/flannel:v0.10.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64
此处flannel需要手动下载
[[email protected] ~]# docker pull quay.io/coreos/flannel:v0.10.0-amd64
从quay.io和gcr.io进行镜像拉取,我们知道,国内访问外网是被屏蔽了的。可以将其替换为 quay-mirror.qiniu.com 和 registry.aliyuncs.com
例如
下拉镜像:quay.io/coreos/flannel:v0.10.0-s390x
如果拉取较慢,可以改为:quay-mirror.qiniu.com/coreos/flannel:v0.10.0-s390x
下拉镜像:gcr.io/google_containers/kube-proxy
可以改为: registry.aliyuncs.com/google_containers/kube-proxy
然后现在就开始把node加入到集群命令是之前生成的
kubeadm join 10.80.2.90:6443 --token q7igu9.vwuiakylpgfk01j4 --discovery-token-ca-cert-hash sha256:ca5ea98580d8a5ea66393c5a2504b34fc3f7d75ae972db78552c6e6390970b2d --ignore-preflight-errors=Swap
执行上边命令后
在master上查看节点是否加入
[[email protected] ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master.localdomain Ready master 6h27m v1.13.2
node1.localdomain Ready <none> 43m v1.13.2
node2.localdomain Ready <none> 106s v1.13.2
至此,所有的master和node都已经安装完成并加入到了集群。
集群命令kubelet
kubectl describe node master 描述master信息
kubectl cluster-info 集群信息包括IP地址coredns
kubectl version 版本信息 client版本 server版本
怎么使用kubernetes
K8s最小调动单位是pod
kubectl run –help Create and run a particular image, possibly replicated.创建并运行一个特定的镜像,一副本形式运行。
Usage:
kubectl run NAME --image=image [--env="key=value"] [--port=port] [--replicas=replicas] [--dry-run=bool]
[--overrides=inline-json] [--command] -- [COMMAND] [args...] [options]
栗子创建pod
[email protected] ~]# kubectl run nginx-deploy --image=nginx:1.14-alpine --port=80 --replicas=1 --dry-run=true
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx-deploy created (dry run)
以dry-run模式创建,并没有实际创建pod
--image 指定镜像 --port 指定端口 --replicas 指定副本数量 pod数量
当去掉--dry-run=true 选项时候即为真是创建了pod
查看创建的pod的命令:
kubectl get pods 或者 kubectl get deployment
kubectl get pods -o wide 显示更详细信息 包括pod的IP地址
通过上边的命令已经获取到了所部署的容器的服务名称IP地址启动状态等,接下来根据其IP地址在nonde1上访问下是否能访问到nginx的页面。如下图:
[[email protected] ~]# curl 10.244.2.2
通过此处的IP10.244.2.2在集群外部浏览器是无法打开的,说明通过pod网络地址只能在集群内部访问,如过需要外部访问,还需要service地址跟node转发。
但是pod的IP是不稳定的,当删除pod时候根据副本控制器replicas=1会重新创建一个新的,如图IP地址已经更改。
所以,要想访问pod的服务,需要找到一个固定的端点servcie IP 来替代。
创建service
命令 kubectl expose(暴露)--help 此处为创建的意思
Usage:
kubectl expose (-f FILENAME | TYPE NAME) [--port=port] [--protocol=TCP|UDP|SCTP] [--target-port=number-or-name]
[--name=name] [--external-ip=external-ip-of-service] [--type=type] [options]
[[email protected] ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deploy-84cbfc56b6-jx8gt 1/1 Running 0 19m
[[email protected] ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 1/1 1 1 58m
创建service
[[email protected] ~]# kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80
service/nginx exposed
[[email protected] ~]# kubectl get svc (services)
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.240.0.1 <none> 443/TCP 25h
nginx ClusterIP 10.245.13.107 <none> 80/TCP 38s
通过clusterip可以在node上来访问,但是还是无法正在集群外部访问,通常serviceIP是为pod提供的固定访问地址。
另外通过service服务名称也可以来访问nginx,需要coredns来解析域名关系
[[email protected] ~]# kubectl get pods -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-86c58d9df4-2dvfl 1/1 Running 0 28h 10.244.0.4 master.localdomain <none> <none>
coredns-86c58d9df4-5t9p6 1/1 Running 0 28h 10.244.0.2 master.localdomain <none> <none>
etcd-master.localdomain 1/1 Running 1 28h 10.80.2.90 master.localdomain <none> <none>
kube-apiserver-master.localdomain 1/1 Running 1 28h 10.80.2.90 master.localdomain <none> <none>
kube-controller-manager-master.localdomain 1/1 Running 2 28h 10.80.2.90 master.localdomain <none> <none>
kube-flannel-ds-amd64-5kmqb 1/1 Running 0 26h 10.80.2.90 master.localdomain <none> <none>
kube-flannel-ds-amd64-8prsw 1/1 Running 1 21h 10.80.2.92 node2.localdomain <none> <none>
kube-flannel-ds-amd64-t5zm9 1/1 Running 1 22h 10.80.2.91 node1.localdomain <none> <none>
kube-proxy-g2c6v 1/1 Running 1 28h 10.80.2.90 master.localdomain <none> <none>
kube-proxy-kcdgv 1/1 Running 0 22h 10.80.2.91 node1.localdomain <none> <none>
kube-proxy-mf4mq 1/1 Running 0 21h 10.80.2.92 node2.localdomain <none> <none>
kube-scheduler-master.localdomain 1/1 Running 2 28h 10.80.2.90 master.localdomain <none> <none>
[[email protected] ~]# kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.240.0.10 <none> 53/UDP,53/TCP 28h
[[email protected] ~]# 此处为kube-dns自己的地址所以需要指定这个地址来解析nginx
这里使用10.240.0.10 kube-dns 在解析
yum install -y bind-utils
dig -t A nginx.default.svc.cluster.local @10.240.0.10 其中nginx.default.svc.cluster.local 是本地pod解析域,可以在创建pod时候使用 -i -t 选项直接进入pod的交互式
cat /etc/resolv.conf 查看
上图箭头指向为解析出来的IP与上边获取到的IP一致。
使用service名称解析是在pod内部,需要登陆到内部才可以直接访问
[[email protected] mapper]# kubectl describe svc nginx
Name: nginx
Namespace: default
Labels: run=nginx-deploy
Annotations: <none>
Selector: run=nginx-deploy
Type: ClusterIP
IP: 10.245.13.107
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.2:80
Session Affinity: None
Events: <none>
[[email protected] mapper]# 详细描述nginx服务service的详细信息。
如果pod的资源被挡掉或则被删掉。对应的endpoints 地址就会更换掉。
[[email protected] mapper]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx-deploy-84cbfc56b6-jx8gt 1/1 Running 0 4h6m pod-template-hash=84cbfc56b6,run=nginx-deploy
显示标签
Kubectl edit svc nginx 编辑service 显示ymal格式的文件包阔IP 端口 name
也可以编辑
kubectl get deployment -w -w选项显示的是一直监听的状态
改变副本数量命令
Usage:
kubectl scale [--resource-version=version] [--current-replicas=count] --replicas=COUNT (-f FILENAME | TYPE NAME)
[options]
栗子:
[[email protected] mapper]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 1/1 1 1 5h24m
[[email protected] mapper]# kubectl scale --replicas=2 deployment nginx-deploy
deployment.extensions/nginx-deploy scaled
[[email protected] mapper]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deploy 2/2 2 2 5h25m
[[email protected] mapper]#
更改pod容器版本命令
Kubectl set –help 查看命令格式
Usage:
kubectl set image (-f FILENAME | TYPE NAME) CONTAINER_NAME_1=CONTAINER_IMAGE_1 ... CONTAINER_NAME_N=CONTAINER_IMAGE_N
[options]
更改镜像版本
Kubectl set image deployment myapp myapp=ikubernetes/myapp:v2
查看滚动升级的状态
Kubectl rollout status deployment nginx
回滚命令
Kubectl rollout undo deployment nginx
iptables -vnL -t nat 命令
集群内部网络通信是通过ipvs
如果集群外部访问需要更改service的type类型为NodePort
Kubectl edit svc nginx
如图服务类型变成了nodport 端口映射到了32647
然后我们来访问试试
[[email protected] ~]# kubectl exec -it nginx-deploy -c nginx-deploy -- /bin/sh
可以直接进入到容器进行配置