在用二進(jìn)制方式安裝k8s集群時矾麻,安裝完master組件時誊册,使用systemctl status
命令查看master各組件狀態(tài)時都正常,接著加入node組件珊擂,使用kubectl get nodes
查看節(jié)點(diǎn)狀態(tài)圣勒,結(jié)果顯示no resource,這顯然是kubelet沒有注冊成功摧扇,接下來使用journalctl -xeu kubelet
來查看kubelet的日志。
發(fā)現(xiàn)一個這樣的錯誤:
E0309 14:38:08.191651 1046698 reflector.go:123] k8s.io/kubernetes/pkg/kubelet/kubelet.go:459: Failed to list *v1.Node: nodes "192.168.88.180" is forbidden: User "system:anonymous" ...
看到這里我就很奇怪了挚歧,因?yàn)槲乙呀?jīng)開啟了bootstrap認(rèn)證扛稽,并且綁定了對應(yīng)的角色,這里是不應(yīng)該用anonymous去和apiserver通信的滑负。
之后查閱資料發(fā)現(xiàn)bootstrap認(rèn)證是需要kube-controller-manager參與的在张,接下來就是查看kube-controller-manager的日志,發(fā)現(xiàn)以下錯誤:
F0309 14:36:22.461671 1048173 client_builder.go:238] unable to get token for service account: timed out waiting for the condition
看到這里就可以知道應(yīng)該是和kube-controller-manager的service-account-private-key-file參數(shù)有關(guān)矮慕,但是我能肯定這個參數(shù)設(shè)置的值沒有問題帮匾,接下來突然發(fā)現(xiàn)kube-apiserver有個類似的參數(shù)service-account-key-file,這時才發(fā)現(xiàn)是這個參數(shù)錯了痴鳄,這兩個參數(shù)所對應(yīng)的key和crt應(yīng)該是一一對應(yīng)的瘟斜,而我service-account-key-file的值是之前卸載時殘留下來的,導(dǎo)致二者不匹配,所以kube-controller-manager拿不到service account對應(yīng)的token螺句,從而所有使用bootstrap token和kube-apiserver通信的組件都無法與kube-apiserver通信虽惭。
既然知道了原因,解決方法就很簡單了蛇尚,重新生成一個service-account-key-file需要的證書芽唇,并與service-account-private-key-file參數(shù)指定的key對應(yīng)就可以了。