拒绝手动安装K8S,从我做起。在经历过无数踩坑之后,我选择使用Kubeasz提供的K8S解决方案来进行K8S集群的安装
- kubeasz github 仓库:github.com/easzlab/kub…
- 在实践过程中借鉴的博客
- 其他同学的 kubeasz 实践经历: blog.csdn.net/sltin/artic…
0. 一些经验
-
务必一步一步安装,不要直接 all,做完每一步之后对照每一步的文档进行验证并查看报错信息
-
如果有什么问题可以进行ezctl destroy [集群名称]的操作
ezctl destroy k8s-01 rm -rf clusters/k8s-01/ # 记得重新启动,否则可能会出现各种问题 ezctl new k8s-01 cp ./host-template ./clusters/k8s-01/hosts ezctl setup k8s-01 01 ......
-
因为对 containerd 的不熟悉,所以选用依然支持 docker 的 k8s 1.23 版本进行安装,kubeasz 3.2.0
-
排查错误的常用脚本:
systemctl status kubelet.service journalctl -u kubelet.service
- systemctl status 【service名称】查看当前机器上的服务进程状态,通常来说看 kubelet 就行
- journalctl -u 【service 名称】查看某个服务的日志,shift+G 直接拉到底。一定要仔细看这个,这个才是导致安装失败的主要原因!!!
1. 事前准备
-
ssh 免密登录和 link python 脚本
-
下载 github.com/easzlab/kub… 中的 ezdown 脚本,执行如下三条指令
- ezdown -D:在部署的机器上下载 docker,kubeasz 等操作,kubeasz 会被下载到 /etc/kubeasz 这个默认目录下
- ezdown -S:运行一个 kubeasz 的容器,为了方便后续的搭建容器的操作。感觉这里容器的作用应该主要是为了省去在本机上安装 kubeasz 本身的依赖,可以直接放到 docker 里面
-
【bug】之前的配置导致了说我们的 path 连接到了 /etc/kubeasz,导致这个目录一删除docker 就找不到了(为啥),现在把这个移除了,ezdown 就不会出问题了
-
【config】config.yaml 设置离线访问,这里的离线访问并不用拷贝 /etc/kubeaez 文件夹:向这里一样:github.com/easzlab/kub… 这里表示的是安装 kubeasz,跟安装 k8s 集群不是一回事,安装集群只需要在 config 里面配置 offline 就好了
- 我的设置:设置为离线安装,网络插件设置为 flannel (自己比较熟),打开 chrony(设置一个server就行了),更换 runtime 为 docker(自己比较熟)
2. 安装 etcd
-
第二步的验证代码路径有问题,应该是这样的(我已经提了issue,maintainer已经改掉了)
export NODE_IPS="10.176.56.150 10.176.56.151 10.176.56.153" for ip in ${NODE_IPS}; do ETCDCTL_API=3 etcdctl --endpoints=https://${ip}:2379 --cacert=/etc/kubernetes/ssl/ca.pem --cert=/etc/kubernetes/ssl/etcd.pem --key=/etc/kubernetes/ssl/etcd-key.pem endpoint health; done
-
【原有 etcd 安装影响】如果这里出了问题journalctl 里面报错
request cluster ID mismatch
,那么表示你的 etcd 的 cluster 信息配置的不对,通常是因为 etcd 中的某个节点之前安装过 etcd,然后这次安装 kubeasz 就没有给他重新安装,导致旧etcd 与 新 etcd mismatch 。- 解决办法:把所有的etcd 的节点 /var/lib/etcd 这个路径删除,让 kubeasz 重新安装即可。这个路径需要是 kubeasz 对 ETCD_DATA_DIR 这个变量的默认设置,可以去源代码中确认一下
- 但是需要注意的是,删除这个目录会导致你 K8S 所有的信息,包括节点信息和 Pod 信息全部清除,谨慎操作!!
-
服务器间时间不同步会导致etcd启动不成功,下面为实例日志(systemctl status etcd.service)
Nov 21 07:42:51 localhostlocaldomain etcd[32071: "level"."warn" "ts"."2022-11-21T07:42:51,101-0500" "callen"."embed/config logging.go:169""msg":"rejected connection" "remote-addr", "10.176.62.223:50548" "server-name" .mn "erron"."nemote error: tls: bad certificate"1
这证明你服务器时间是有问题的,建议在配置中安装 chrony
3. 安装 docker
-
【错误 1】第三步安装docker的时候会发现不能在我们的集群上启动docker,因为我们集群的底层存储是 vfs。我们需要把/etc/docker/daemon.json文件中的改为"storage-driver": "vfs”才可以成功启动docker。
ansible workers -m copy -a "src=/root/daemon.json dest=/etc/docker/daemon.json" # shoot 是我自己写的ansible 脚本,相当于 ansible workers -m shell -a shoot systemctl restart docker shoot systemctl status docker | grep Active
我在这里直接用了 ansible 进行所有机器的修改。当然,这里可能大家的报错都不一样,如果你发现你的 kube-node 也无法进入 Ready 状态,你需要参照 0.4 查看 kubelet 状态进行排错。
-
【错误 2】扩展node时kubelet无法达到Ready状态,排查发现原因是k8s执行的cgroup驱动为cgroupfs,但是docker指定的时systemd,需要修改docker的cgroup driver.
# 查看kubelet状态以及日志信息 systemctl status kubelet journalctl -u kubelet # 发现报错 >> kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd" # 修改docker配置后重启 vim /etc/docker/daemon.json >> "exec-opts": ["native.cgroupdriver=cgroupfs"], systemctl daemon-reload && systemctl restart docker
当然,这个可能大家的配置都不一样,需要按照具体的报错信息更改
-
【通用解法】:为了解决下面两个问题,可以直接修改 docker 的配置文件
/etc/kubeasz/roles/docker/templates/daemon.json.j2
,kubeasz 会填充这个来复制到 /etc/docker/daemon.json 中。我后面为了为了方便 harbor 的安装,在 config 中也更改 INSECURE_REG: '["harbor.bz.com:8443"]' 来直接达到配置所有机器daemon.json 的功效
4. 安装 kube-node
从这里开始,就非常容易出问题了,这里说下我排查问题的步骤:
- 之前的每一步,务必用对应的 readme 里面的脚本(比如 github.com/easzlab/kub…)检查一下当前的状态是否正确。确认前面的每一步都正确之后,才能将问题的范围缩小到这次步骤的 playbook
- 查看报错的信息,最早是从哪里进行报错的。然后我们需要(1)查看 playbook 的对应的指令(2)到对应的机器上执行出错的指令,复现问题,找到问题地原因并解决。我在这个步骤上遇到过两个问题
kube-lb 启动失败
-
执行
开启kube-lb服务
这个任务的时候报错退出,首先我们要找到对应的指令,有两种方法- 这个步骤是 05,role 只有 kube-node 和 kube-lb 这两个,我们可以在
/etc/kubeasz/roles/kube-lb/tasks/main.yml
这里找到这个 task - 当然因为是汉字,所以可以直接在 roles 里面做全局搜索,能搜到对应的任务
- 这个步骤是 05,role 只有 kube-node 和 kube-lb 这两个,我们可以在
-
可以看出这个任务执行的是
systemctl restart kube-lb
,启动 kube-lb 的服务的功能,通过 journalctl 查看日志发现是 kube-lb 的端口被占用了,将占用这个端口的程序删除即可
kube-node 启动失败
- 通过 playbook 查看到主要是启动了 kube-proxy 和 kubelet 两个服务,查看日志发现报错证书过期,于是发现是当前的系统时间不对,多配置了一些 chrony 来同步时间
7. 安装集群插件
- 这里记得不要忘记安装这个步骤!
- coreDNS:有很多 K8S 组件是依赖于域名进行工作的,coreDNS 给每个 Pod 维护了一个域名到 IP 的映射(DNS),让 Pod 可以在组件内部通过内置的域名访问到其他 Pod。安装完记得验证一下!!
- 待补充……