准备
准备3台机器,分别设置hostname如下所示(此处主要是为了便于标识不同的机器,其实不设置hostname也可以正常搭建):
机器IP | hostname |
---|---|
10.103.24.18 | master1 |
10.120.162.6 | master2 |
10.136.22.7 | master3 |
kubeadm搭建高可用K8s集群
第一步:初始化第一个master节点
参考《使用Kubeadm搭建Kubernetes(1.13.1)集群》在master1
搭建一个单master节点的k8s集群。
第二步:拷贝证书
参考《使用Kubeadm搭建Kubernetes(1.13.1)集群》在master2
和master3
安装docker、kubeadm 、 kubectl、flannel
,但不要执行kubeadm init
。(如果执行了kubeadm init
也没关系,再执行kubeadm reset
就行了)。
然后在master1
节点 /etc/kubernetes/ 目录下执行tar -czvf pki.tar.gz pki
对 pki 目录进行压缩生成 pki.tar.gz 文件。
将pki.tar.gz文件上传到第二和第三个master节点{$HOME}/~目录下(可以用scp、rsync、sz/rz等命令都可以)。
然后在第二和第三个master节点{$HOME}/~目录下执行如下命令将证书拷贝到/etc/kubernetes/pki/
目录下:
# 解压缩文件
tar -xzvf pki.tar.gz
# 移除已处在的文件
rm -rf /etc/kubernetes/pki/*
# 删除etcd相关的证书
rm -f ~/pki/etcd/peer* ~/pki/etcd/server* ~/pki/etcd/healthcheck-client*
# 拷贝证书到/etc/kubernetes/pki/目录下
sudo cp -ar pki/* /etc/kubernetes/pki/
注意:一定要删除etcd相关的证书,否则会把整个k8s集群搞挂。
第三步:加入其它master节点
在第一步master1搭建完成后,会得到如下的kubeadm join
命令。这一步在master2和master3分别执行该kubeadm join
命令即可。
注意:一定要加上参数 --experimental-control-plane
sudo kubeadm join 10.136.21.13:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:9e6fcf8e46473f8158bb4214af4ab93c01247a442b45887a0cf82c312298abb9 --experimental-control-plane
Q&A
1.如果第二步执行出错,把k8s集群搞挂了怎么办?
登录master0,修改/etc/kubernetes/manifests/etcd.yaml
。这一步的目的是启动只有一个etcd节点的集群,然后往这个集群中添加新节点等待数据同步。
# 添加下面两个参数
- --initial-cluster-state=new
- --force-new-cluster=true
# 添加上面两个参数
image: docker2.yidian.com:5000/k8simages/etcd:3.2.24
然后重启kubelet
sudo systemctl restart kubelet
通过sudo docker ps
查看启动的etcd容器ID
通过sudo docker exec -it b69913e36ce1 sh
进入容器内。
通过下面的命令可以查看当前etcd集群的节点列表:
etcdctl \
--ca-file=/etc/kubernetes/pki/etcd/ca.crt \
--cert-file=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
--key-file=//etc/kubernetes/pki/etcd/healthcheck-client.key \
--endpoints=https://127.0.0.1:2379 \
member list
可以看到当前集群中只有一个节点:
此时,apiserver已经可以正常访问etcd,可以通过kubectl get nodes
验证一下:
2.不小心重置了master节点怎么办?
如果不小心在master节点上执行了 sudo kubeadm reset -f ,导致节点重置,etcd容器被kill,数据清空。直接通过 kubeadm join xxx
并不能直接将该节点添加回去,而会报出下面的错误:
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file
[etcd] Checking Etcd cluster health
error syncing endpoints with etc: dial tcp 10.120.162.6:2379: connect: connection refused</pre>
解决方案参考文档:Kubernetes master无法加入etcd 集群解决方法
解决方法:
1.在kubeadm-config删除的状态不存在的etcd节点:
`kubectl edit configmaps -n kube-system kubeadm-config`
把上边的删掉:
我尝试了方案一,然后重新执行下面的命令,问题就成功解决了。
sudo kubeadm reset -f
sudo ipvsadm --clear
sudo cp -ar pki/* /etc/kubernetes/pki/
sudo kubeadm join 10.136.21.13:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:9e6fcf8e46473f8158bb4214af4ab93c01247a442b45887a0cf82c312298abb9 --experimental-control-plane
效果如下:
3. error uploading configuration: the server was unable to return a response in the time allotted, but may still be processing the request (get configmaps kubeadm-config)
在执行kubectl join xxx命令时,出现这种情况是和docker残留信息有关系,可以考虑重启docker:
sudo systemctl restart docker
如果重启docker还不好使,就删除掉 /var/run/dockershim.sock 文件
sudo rm -f /var/run/dockershim.sock
这样反复多试几次就成功了(个人经验)。
4. join成功后,master始终是NotReady状态
出现这种情况的原因是:该master节点安装flannel失败了。
此时,如果查看kubelet的状态,一般是启动失败的状态。通过 sudo journalctl xe -no-pager 可以看到如下报错误信息:
kubelet[45748]: E0222 23:29:19.444759 45748 kubelet.go:1308] Image garbage collection failed once. Stats initialization may not have completed yet: failed to get imageFs info: unable to find data in memory cache
kubelet[45748]: F0222 23:29:19.444777 45748 server.go:174] Failed to create listener for podResources endpoint: listen unix /var/lib/kubelet/pod-resources/kubelet.sock: bind: no such file or directory
这种情况可以尝试手动安装flannel,然后重启机器就可以解决,flannel安装过程参考《安装Kubernetes报错:STATUS NotReady》
网友评论