【笔记】记一次因go版本问题导致K8S控制节点初始化不成功的过程
虽然不是很明白图5的报错是什么意思,但感觉可能和rpc有关,于是灵关一闪,想到会不会是因为docker使用的go版本与kubeadm使用的go版本不兼容导致的(由rpc想到客户端服务端进行调用)。于是将docker版本切换为20.10.9,该docker版本使用的go版本为1.16.8,如图6所示。重新使用kubeadm进行初始化,即可初始化成功(如图7),我们也可以看到,所有k8s组件也都正常启
0.背景
最近在使用kubeadm搭建一套新的k8s集群的过程中,控制节点一直初始化不成功。卡点在当kubeadm启动kubelet后,一直报错显示无法连接6443端口。根据这个报错信息第一时间想到可能是kube-apiserver的问题,docker ps一看,发现果然kube-apiserver的镜像没有起来。百思不得其解,最终通过不断地尝试,发现原来是docker使用的go版本与kubeadm使用的go版本不一致导致,以下是整个过程的复现。
1.部署过程复现
首先从kubernetes官网上下载下来kubeadm、kubectl、kubelet三个初始化k8s控制节点及部署k8s集群的核心组件,并将它们放置在/usr/bin/目录下,如图1。其中kubeadm的版本如图2所示,可以看到,它使用的go版本是1.20.11。
图1
图2
从图3我们可以看到,该机器的docker以及dockerd版本为18.09.1,使用的go版本为1.10.6
图3
此时,如果我们我们运行以下命令,会出现图4的报错。
kubeadm init --apiserver-advertise-address 10.0.0.9 --pod-network-cidr=10.244.0.0/16 -v=9
图4
根据报错信息,我初步判断是因为kube-apiserver没有启动(因为6443端口连接被拒绝) ,查看docker服务的日志信息,发现如下报错。
dockerd: time="2023-11-26T03:16:03.619906121+08:00" level=error msg="failed to get event" error="rpc error: code = Unavailable desc = all SubConns are in TransientFailure, latest connection error: connection error: desc = \"transport: Error while dialing dial unix:///run/containerd/containerd.sock: timeout\"" module=libcontainerd namespace=moby
图5
虽然不是很明白图5的报错是什么意思,但感觉可能和rpc有关,于是灵光一闪,想到会不会是因为docker使用的go版本与kubeadm使用的go版本不兼容导致的(由rpc想到客户端服务端进行调用)。于是将docker版本切换为20.10.9,该docker版本使用的go版本为1.16.8,如图6所示。
图6
完成切换后,重置前面的所有操作
sudo rm -rf /etc/kubernetes/
sudo rm -rf /var/lib/etcd
sudo rm -rf /var/lib/kubelet
sudo systemctl restart docker
sudo kubeadm reset
重新使用kubeadm进行初始化,即可初始化成功(如图7),我们也可以看到,所有k8s组件也都正常启动了(图8),通过kubectl get nodes命令,我们也可以成功获取控制节点的信息了。
kubeadm init --apiserver-advertise-address 10.0.0.9 --pod-network-cidr=10.244.0.0/16 -v=9
图7
图8
图9
2.总结
在本次部署过程问题就出在kubeadm以及其使用的其他k8s组件的go版本与机器上的docker使用的go版本不一致。解决方法也比较简单,切换docker版本即可。需要注意的是,本文中是docker使用的go版本过低导致,但这不代表只要版本足够高就能避免该问题,也许会出现go版本过高而导致相同的问题出现。那么关于具体的版本兼容性问题,就需要读者自行去探索了。赶快试一试吧!
更多推荐
所有评论(0)