集群中兩個節點的calico-node無法啟動
問題
生產集群中node-4及node-9兩個節點的calico-node
無法啟動一直處於crashloopbackoff
。calicoctl node status
中的INFO
列這兩個節點顯示為Active Socket: Connection refused
。kubectl describe
發現Event中有報錯:
Liveness probe failed: Get http://127.0.0.1:9099/liveness: dial tcp 192.168.99.7:9099: getsockopt: connection refused
追蹤
嘗試將兩個pod重啟
$ kubectl get pods -n kube-system --no-headers --field-selector=status.phase !=Running | grep "calico-node" | awk '{print $1}' | xargs kubectl delete pod -n kube-system
重啟完成后pod仍然處於crashloopbackoff
狀態,失敗。
進入Github搜索相關issue,基本都是因為calico自動獲取的ip不是目前在用的ip,但檢查日志發現日志中獲取的ip就是本地bond0網卡的地址。失敗。
檢查日志發現日志很短,並且兩個節點的calico-node
都是這種情況:執行到Using node name就結束了。比對正確節點的calico-node
啟動日志,與正常節點沒有區別。
2020-12-30 12:50:55.337 [INFO][10] startup.go 256: Early log level set to info
2020-12-30 12:50:55.337 [INFO][10] startup.go 272: Using NODENAME environment for node name
2020-12-30 12:50:55.337 [INFO][10] startup.go 284: Determined node name: node-4
2020-12-30 12:50:55.436 [INFO][10] startup.go 97: Skipping datastore connection test
2020-12-30 12:50:55.438 [INFO][10] startup.go 476: Using IPv4 address from environment: IP=172.16.200.103
2020-12-30 12:50:55.440 [INFO][10] startup.go 509: IPv4 address 172.16.200.103 discovered on interface bond0
2020-12-30 12:50:55.440 [INFO][10] startup.go 647: No AS number configured on node resource, using global value
2020-12-30 12:50:55.440 [INFO][10] startup.go 149: Setting NetworkUnavailable to False
2020-12-30 12:50:55.639 [INFO][10] startup.go 530: FELIX_IPV6SUPPORT is false through environment variable
2020-12-30 12:50:55.644 [INFO][10] startup.go 181: Using node name: node-4
靈感:在某個github issue中提到雖然就緒探針readinessProbe
不會導致crashloopbackoff
,但是livenessProbe
可能。檢查calico-node的配置文件中有關探針的部分
$ kubectl get daemonsets.apps -n kube-system calico-node -o yaml
...
livenessProbe:
httpGet:
host: 127.0.0.1
path: /liveness
port: 9099
scheme: HTTP
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
failureThreshold: 6
timeoutSeconds: 1
...
- liveness探針自pod啟動后5s后開始探測
- 每隔10s進行一次探測
- 檢查失敗后進入成功狀態最少連續探測次數為1次
- 檢查成功后進入失敗狀態最少連續探測次數為6次
- 探測檢測超時為1s
如果是配置文件有問題,那么所有的calico-node
都會有問題,但現在只有node-4及node-9上的calico-node
有問題。會不會是這兩個節點異常導致calico-node
啟動后5s沒有pod並沒有啟動完成,存活探針無法訪問9099端口觸發pod自動重啟,不斷反復導致pod處於crashloopbackoff
?登錄node-4及node-9發現兩個節點的負載竟然比正常節點高了幾十倍。原因就顯而易見了:高負載導致pod啟動緩慢,存活探針判斷失敗觸發pod不斷自動重啟引發pod狀態異常。
解決
驅逐node-4及node-9上的pod
$ kubectl drain node-4 --delete-local-data --ignore-daemonsets --force
$ kubectl drain node-9 --delete-local-data --ignore-daemonsets --force
重啟兩個節點
$ reboot
重啟完成后兩個節點上的calico-node
處於Running
狀態