Kubeadm offline installer 升級到 1.7.0 版本遇到的坑_Kubernetes中文社群
本來做這玩意的初衷就是,Kubeadm 和 Kubernetes 是一家人,升級比較方便跟得住。未曾想第一次大版本升級,就遇到了個不大不小的坑,導致安裝無法完成。這個 Issue 會在 1.7.1 修補,下面介紹一下曲線救國的安裝方式。
這一問題的似乎是 kubeadm 的更新破壞了 TLS 自動授權過程造成的,具體症狀是:主節點的kubeadm init完成之後,在其他節點上使用kubeadm join –token=xxxx host_ip:host_port命令加入叢集時,叢集會反覆輸出錯誤資訊,大意是kube-public名稱空間中名為cluster-info的 ConfigMap 中沒有對應 token 的簽署記錄。
使用 kubectl 檢視該 ConfigMap,和 1.6.6 的叢集作對照(是的,安裝的夠快,想要什麼版本都容易),發現 1.7.0 裡面這個 ConfigMap 的元素列表確缺少這一塊內容。
既然如此,看樣子手工簽署也是要廢不少工夫,乾脆轉頭使用上一版本(1.6.6)的 kubeadm,使用指定版本的方式來安裝 1.7.0 的叢集。
kubeadm init過程會順利完成,然而在kubeadm join過程中,會卡在CSR階段,經過翻查文件,1.7.0 的自動授權方式有變化,廢棄了原有的根據 Group 自動通過的開關,一不做二不休,在 Playbook 的 Master Role 中新建一個 Cron Job,每分鐘執行一次如下命令:
#!/bin/shTOKEN=`kubectl get csr | grep csr | grep -i pending | cut -f1 -d " " | head -n 1`if [[ -n "$TOKEN" ]]; then kubectl certificate approve $TOKEN echo "CSR: $TOKEN had been approved." >> /var/log/auto_approval.logelse echo "CSR not found." >> /var/log/auto_approval.logfi
簡單說就是獲取在途的 CSR,進行 Approve。
這樣在後面的節點進行加入的時候,主節點會每分鐘進行一次 Approve,在所有節點成功加入之後,呼叫 Cleanup 角色,禁用這一功能即可。
最後,Github 不建議在版本庫中存放二進位制檔案,這裡我將所有二進位制檔案集中到了根目錄的files目錄下,要順利使用這一指令碼,一定要在 Release 頁面中下載相應的壓縮包來使用。