热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

kubeadm搭建高可用K8s集群

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

准备

准备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)集群》在master2master3安装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集群搞挂了怎么办?

登录master1,修改/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

kubeadm搭建高可用K8s集群

通过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

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

kubeadm搭建高可用K8s集群

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

kubeadm搭建高可用K8s集群

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

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

解决方法:

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

`kubectl edit configmaps -n kube-system kubeadm-config`

把上边的删掉:

kubeadm搭建高可用K8s集群

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

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

效果如下:

kubeadm搭建高可用K8s集群

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》

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

sudo rm -f /var/run/dockershim.sock
sudo rm -f /var/run/docker.sock
sudo systemctl restart docker
sudo systemctl restart kubelet

推荐阅读
author-avatar
书友31443126_163
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有