為什么Kubernetes從節(jié)點(diǎn)會(huì)Join失敗
本文轉(zhuǎn)載自微信公眾號(hào)「程序員jinjunzhu」,作者jinjunzhu 。轉(zhuǎn)載本文請(qǐng)聯(lián)系程序員jinjunzhu公眾號(hào)。
有段時(shí)間沒(méi)有鼓搗Kubernetes了,今天重置Kubernetes集群后,slave節(jié)點(diǎn)不能加入master節(jié)點(diǎn)了,我把問(wèn)題和解決方案分享給大家。
我本地的Kubernetes集群包括一個(gè)主節(jié)點(diǎn)和一個(gè)從節(jié)點(diǎn),如下圖:
問(wèn)題
主節(jié)點(diǎn)啟動(dòng)后,從節(jié)點(diǎn)加入,命令如下:
- kubeadm join 192.168.59.149:6443 --token nf2hbm.h1d67djxey0jv90h --discovery-token-ca-cert-hash sha256:12e71102d6f44c85c1717079f26c36a706cb11894c36af6d055fa39036e805ae
等了一段時(shí)間后,報(bào)了下面的錯(cuò)誤:
- error execution phase preflight: couldn't validate the identity of the API Server: abort connecting to API servers after timeout of 5m0s
日志不夠完整,在命令后面加 --v=5,重新執(zhí)行來(lái)查看詳細(xì)日志,發(fā)現(xiàn)下面這個(gè)失敗日志反復(fù)打?。?/p>
- Failed to request cluster info: [Get https://192.168.59.149:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s: x509: certificate has expired or is not yet valid。
問(wèn)題排查
token過(guò)期
首先想到的是token過(guò)期,查看token,命令和輸出如下:
- [root@master ~]# kubeadm token list
- failed to list bootstrap tokens: Get https://192.168.59.149:6443/api/v1/namespaces/kube-system/secrets?fieldSelector=type%3Dbootstrap.kubernetes.io%2Ftoken: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
這個(gè)輸出有點(diǎn)詭異,網(wǎng)上說(shuō)是內(nèi)存不夠了,我查看了內(nèi)存,并不緊張:
- [root@master ~]# free -h
- total used free shared buff/cache available
- Mem: 3.7G 1.1G 132M 30M 2.4G 2.1G
- Swap: 0B 0B 0B
仔細(xì)查看了輸出,有個(gè)x509,想起了以前的解決方法,執(zhí)行下面三個(gè)命令:
- mkdir -p $HOME/.kube
- sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- sudo chown $(id -u):$(id -g) $HOME/.kube/config
再次查看token,可以了,輸出如下:
- kubeadm token list
- TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
- o898hy.0y2s6cqsidpwmbkh 23h 2021-05-10T23:26:55+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
重新生成token和秘鑰,命令和輸出如下:
- [root@master ~]# kubeadm token create
- nf2hbm.h1d67djxey0jv90h
- [root@master ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
- 12e71102d6f44c85c1717079f26c36a706cb11894c36af6d055fa39036e805ae
生成后,在從節(jié)點(diǎn)上用新的token和秘鑰繼續(xù)執(zhí)行加入命令,問(wèn)題依舊。
時(shí)間問(wèn)題
Kubernetes的token有效期是24小時(shí),但是秘鑰是新生成的,不可能過(guò)期。
那是不是系統(tǒng)時(shí)間有問(wèn)題?查看了一下系統(tǒng)時(shí)間,果然找到了貓膩。系統(tǒng)時(shí)間如下:
主節(jié)點(diǎn)系統(tǒng)時(shí)間:
- [root@master ~]# date
- 2021年 05月 10日 星期一 07:22:42 CST
2021年 05月 10日 星期一 07:22:42 CST
從節(jié)點(diǎn)系統(tǒng)時(shí)間:
- [root@worker1 ~]# date
- Sun May 9 11:22:28 EDT 2021
主節(jié)點(diǎn)的時(shí)間晚于從節(jié)點(diǎn),這就是問(wèn)題所在。
解決問(wèn)題
在主節(jié)點(diǎn)和從節(jié)點(diǎn)執(zhí)行如下命令:
- [root@master ~]# ntpdate ntp1.aliyun.com
- 9 May 23:23:00 ntpdate[39100]: step time server 120.25.115.20 offset -28801.403856 sec
- [root@worker1 ~]# ntpdate ntp1.aliyun.com
- 9 May 11:23:18 ntpdate[22420]: adjust time server 120.25.115.20 offset -0.001241 sec
這下時(shí)間一致了。
重新生成token和秘鑰,問(wèn)題解決。