2020.5.6更,flannel CrashLoopBackOff
不知道是多節點k8s集群的通病,還是因為是公網部署的緣故,使用flannel時可能出現CrashLoopBackOff的錯誤,網上找到的個人覺得應該可行的解決方案(幾台服務器都過期沒續費,沒空測試):
- kubernetes使用flannel網絡插件服務狀態顯示CrashLoopBackOff
- Kubernetes pod狀態出現CrashLoopBackOff 的原因
- K8s問題【flannel一直重啟問題,CrashLoopBackOff】
其它方案自行百度,注意查看報錯信息是否與百度到的解決方案一致。
2020.4.12更,此貼作廢
這是之前剛開始玩k8s時候寫的,那時候對k8s理解不夠深入,隨便搗鼓幾台學生機玩玩就算是入門了。后來一直沒空再學習就放下來了,這幾天稍微有點兒空,又折騰了下,發現k8s沒那么簡單。
雖然修改etcd可以通過公網ip部署集群,而且可以運行應用,但是集群節點信息里是沒有公網ip的,而且貌似k8s是讓kubelet直接與apiserver通過內網通信的,使用kubectl log等命令時還是用的內網IP,所以會提示timeout。要想真正實現公網ip部署k8s還是配置iptables進行重定向或其它更專業的方式。傳送門1 傳送門2
貼就不刪了,給有需要的孩紙提供點而思路,不用走那么多彎路。
更新
以下方法比較笨拙,實用性不高,這里貼出知乎上一位大佬的文章——Kubernetes——部署基於公網的k8s集群
大佬給出的解決方案有兩種,一是虛擬出一個綁定公網IP的網卡;二是使用k8s v1.8.0 + 版本引入的分段初始化方法,在初始化etcd的時候指定配置文件——傳送門——kubeadm init phase;
公網部署的資料少得可憐,當初在找資料的時候,百度、谷歌、官網翻了好久,居然沒發現這篇文章。。。ε=(´ο`*)))唉。
===2020.4.6更
背景
一般情況下,"kubeadm"部署集群時指定"--apiserver-advertise-address=<public_ip>"參數,即可在其他機器上,通過公網ip join到本機器,然而,阿里雲ecs里沒配置公網ip,etcd會無法啟動,導致初始化失敗。
環境、工具
阿里雲ECS學生機、ECS對應的公網ip、kubeadm1.15.4、kubelet1.15.4、kubectl1.15.4、ubuntu18.04.3、linux4.15.0-66-generic、docker18.9.7
步驟
准備
該實現需要在kubeadm初始化過程中對etcd進行修改,而kubeadm初始化是阻塞的,因此,需要建立兩個ssh對話,即用ssh工具新建兩個標簽,一個用來初始化節點,另一個在初始化過程中修改配置文件。注意是初始化過程中,每次運行kubeadm init,kubeadm都會生成etcd的配置文件,如果提前修改了配置文件,在運行kubeadm init時會把修改的結果覆蓋,那么也就沒有作用了。
運行kubeadm
輸入命令"kubeadm init --kubernetes-version=<your_versin> --apiserver-advertise-address=<public_ip>"
此時會卡在
[wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
[kubelet-check] Initial timeout of 40s passed.
修改etcd.yaml
在輸入上述命令后,kubeadm即開始了master節點的初始化,但是由於etcd配置文件不正確,所以etcd無法啟動,要對該文件進行修改。
文件路徑"/etc/kubernetes/manifests/etcd.yaml"。
修改前
修改后
此處"xxx"為公網ip,要關注的是"--listen-client-urls"和"--listen-peer-urls"。需要把--listen-client-urls 和 --listen-peer-urls 都改成0.0.0.0:xxx
舊: 需要把"--listen-client-urls"后面的公網ip刪除,把"--listen-peer-urls"改為本地的地址。
連接master節點
稍等片刻之后,master節點就初始化好了
拷貝"root"后面的連接token,在其他服務器,如騰訊雲或阿里雲ecs上就可以join這台master。
此時再安裝好網絡插件即可
過程記錄
-
當指定"--apiserver-advertise-address"為公網ip時,kubeadm會在"[kubelet-check] Initial timeout of 40s passed."后卡很長時間,然后提示說初始化失敗:
-
查看kubelet日志,未發現有價值的錯誤提示。於是進行了第二次嘗試,並新建了一個ssh對話,用來查看在初始化的時候docker容器的狀態。
-
發現etcd的容器處於退出狀態:
-
於是對該容器打個log:
顯示無法指定ip,ip為公網ip -
查看kubeadm生成的etcd配置文件,"xxx"為我的公網ip:
發現kubeadm自動把"--listen-peer-urls"改為了kubeadm初始化時指定的"--apiserver-advertise-address",即公網ip,而且"--listen-client-urls=",后面也加上了公網ip。這兩個參數大概意思是指定要監聽的ip地址,而阿里雲學生機ecs的網卡沒有配置公網ip,因此就無法指定該ip,導致etcd無法正常啟動。對其進行修改即可,經測試,worker node 可以通過指定的公網ip join到master node,可以完成項目部署。