kubeadm搭建高可用K8s集群

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kubeadm搭建高可用K8s集群相关的知识,希望对你有一定的参考价值。

参考技术A

准备3台机器,分别设置hostname如下所示(此处主要是为了便于标识不同的机器,其实不设置hostname也可以正常搭建):

参考《 使用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/ 目录下:

注意:一定要删除etcd相关的证书,否则会把整个k8s集群搞挂。

在第一步master1搭建完成后,会得到如下的 kubeadm join 命令。这一步在master2和master3分别执行该 kubeadm join 命令即可。
注意:一定要加上参数 --experimental-control-plane

登录master1,修改 /etc/kubernetes/manifests/etcd.yaml 。这一步的目的是启动只有一个etcd节点的集群,然后往这个集群中添加新节点等待数据同步。

然后重启kubelet

通过 sudo docker ps 查看启动的etcd容器ID

通过 sudo docker exec -it b69913e36ce1 sh 进入容器内。
通过下面的命令可以查看当前etcd集群的节点列表:

可以看到当前集群中只有一个节点:

此时,apiserver已经可以正常访问etcd,可以通过 kubectl get nodes 验证一下:

如果不小心在master节点上执行了 sudo kubeadm reset -f ,导致节点重置,etcd容器被kill,数据清空。直接通过 kubeadm join xxx 并不能直接将该节点添加回去,而会报出下面的错误:

解决方案参考文档: Kubernetes master无法加入etcd 集群解决方法

解决方法:

1.在kubeadm-config删除的状态不存在的etcd节点:

把上边的删掉:

我尝试了方案一,然后重新执行下面的命令,问题就成功解决了。

效果如下:

在执行kubectl join xxx命令时,出现这种情况是和docker残留信息有关系,可以考虑重启docker:

这样反复多试几次就成功了(个人经验)。

出现这种情况的原因是:该master节点安装flannel失败了。

此时,如果查看kubelet的状态,一般是启动失败的状态。通过 sudo journalctl xe - no-pager 可以看到如下报错误信息:

这种情况可以尝试手动安装flannel,然后重启机器就可以解决,flannel安装过程参考《 安装Kubernetes报错:STATUS NotReady 》

如果上述方式不管用,可以尝试下面的方式:

以上是关于kubeadm搭建高可用K8s集群的主要内容,如果未能解决你的问题,请参考以下文章

使用kubeadm搭建高可用的K8S集群(2022年1月亲测有效)

Kubeadm搭建高可用(k8s)Kubernetes v1.24.0集群

Kubeadm搭建高可用(k8s)Kubernetes v1.24.0集群

(四)从零开始搭建k8s集群—— 使用KubeKey一键式搭建高可用k8s集群

k8s 开船记:升级为豪华邮轮(高可用集群)与遇到奇怪故障(dns解析异常)

Kubernetes通过kind在本机搭建高可用集群