Kubernetes 集群上沒有可訪問或可調度的 Pod
我在 IBM 雲中有 2 個 Kubernetes 集群,一個有 2 個節點,另一個有 4 個。
一個有 4 個節點的節點工作正常,但在另一個節點上,由於金錢原因,我不得不暫時移除工作節點(不應該在空閒時支付)。
當我重新啟動這兩個節點時,一切似乎都正常啟動,只要我不嘗試與 Pod 互動,它表面上看起來仍然很好,沒有關於不可用或嚴重健康狀態的消息。好的,我刪除了兩個
Namespace
卡在Terminating
狀態中的過時的 s,但是我可以通過重新啟動集群節點來解決該問題(不再確切知道它是哪一個)。當一切正常時,我嘗試訪問 kubernetes 儀表板(之前所做的一切都是在 IBM 管理級別或命令行中完成的),但令人驚訝的是,我發現它無法訪問,瀏覽器中的錯誤頁面顯示:
503服務不可用
該頁面底部有一條小的 JSON 消息,內容是:
{ "kind": "Status", "apiVersion": "v1", "metadata": { }, "status": "Failure", "message": "error trying to reach service: read tcp 172.18.190.60:39946-\u003e172.19.151.38:8090: read: connection reset by peer", "reason": "ServiceUnavailable", "code": 503 }
我發送了一個
kubectl logs kubernetes-dashboard-54674bdd65-nf6w7 --namespace=kube-system
顯示Pod
為正在執行的位置,但結果不是要查看的日誌,而是這條消息:Error from server: Get "https://10.215.17.75:10250/containerLogs/kube-system/kubernetes-dashboard-54674bdd65-nf6w7/kubernetes-dashboard": read tcp 172.18.135.195:56882->172.19.151.38:8090: read: connection reset by peer
然後我發現我既無法獲取該集群中執行的任何
Pod
日誌,也無法部署任何需要調度的新自定義 kubernetes 對象(我實際上可以應用Service
s 或s ,ConfigMap
但沒有Pod
,或類似的) .ReplicaSet``Deployment
我已經嘗試過
- 重新載入工作池中的工作節點
- 重啟workerpool中的worker節點
- 重新啟動 kubernetes-dashboard
Deployment
不幸的是,上述操作都沒有改變
Pod
s.還有另一件事可能是相關的(雖然我不太確定它是否真的是):
在另一個執行良好的集群中,有三個 calico
Pod
正在執行,並且所有三個都啟動,而在有問題的集群中,三個 calicoPod
中只有兩個啟動並執行,第三個保持Pending
狀態並kubectl describe pod calico-blablabla-blabla
顯示原因,一個Event
Warning FailedScheduling 13s default-scheduler 0/2 nodes are available: 2 node(s) didn't have free ports for the requested pod ports.
有沒有人知道該集群中發生了什麼並可以指出可能的解決方案?我真的不想刪除集群並生成一個新集群。
編輯
結果
kubectl describe pod kubernetes-dashboard-54674bdd65-4m2ch --namespace=kube-system
:Name: kubernetes-dashboard-54674bdd65-4m2ch Namespace: kube-system Priority: 2000000000 Priority Class Name: system-cluster-critical Node: 10.215.17.82/10.215.17.82 Start Time: Mon, 15 Nov 2021 09:01:30 +0100 Labels: k8s-app=kubernetes-dashboard pod-template-hash=54674bdd65 Annotations: cni.projectcalico.org/containerID: ca52cefaae58d8e5ce6d54883cb6a6135318c8db53d231dc645a5cf2e67d821e cni.projectcalico.org/podIP: 172.30.184.2/32 cni.projectcalico.org/podIPs: 172.30.184.2/32 container.seccomp.security.alpha.kubernetes.io/kubernetes-dashboard: runtime/default kubectl.kubernetes.io/restartedAt: 2021-11-10T15:47:14+01:00 kubernetes.io/psp: ibm-privileged-psp Status: Running IP: 172.30.184.2 IPs: IP: 172.30.184.2 Controlled By: ReplicaSet/kubernetes-dashboard-54674bdd65 Containers: kubernetes-dashboard: Container ID: containerd://bac57850055cd6bb944c4d893a5d315c659fd7d4935fe49083d9ef8ae03e5c31 Image: registry.eu-de.bluemix.net/armada-master/kubernetesui-dashboard:v2.3.1 Image ID: registry.eu-de.bluemix.net/armada-master/kubernetesui-dashboard@sha256:f14f581d36b83fc9c1cfa3b0609e7788017ecada1f3106fab1c9db35295fe523 Port: 8443/TCP Host Port: 0/TCP Args: --auto-generate-certificates --namespace=kube-system State: Running Started: Mon, 15 Nov 2021 09:01:37 +0100 Ready: True Restart Count: 0 Requests: cpu: 50m memory: 100Mi Liveness: http-get https://:8443/ delay=30s timeout=30s period=10s #success=1 #failure=3 Readiness: http-get https://:8443/ delay=10s timeout=30s period=10s #success=1 #failure=3 Environment: <none> Mounts: /certs from kubernetes-dashboard-certs (rw) /tmp from tmp-volume (rw) /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-sc9kw (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: kubernetes-dashboard-certs: Type: Secret (a volume populated by a Secret) SecretName: kubernetes-dashboard-certs Optional: false tmp-volume: Type: EmptyDir (a temporary directory that shares a pod's lifetime) Medium: SizeLimit: <unset> kube-api-access-sc9kw: Type: Projected (a volume that contains injected data from multiple sources) TokenExpirationSeconds: 3607 ConfigMapName: kube-root-ca.crt ConfigMapOptional: <nil> DownwardAPI: true QoS Class: Burstable Node-Selectors: <none> Tolerations: node-role.kubernetes.io/master:NoSchedule node.kubernetes.io/not-ready:NoExecute op=Exists for 600s node.kubernetes.io/unreachable:NoExecute op=Exists for 600s Events: <none>
問題解決了……
問題的原因是集群更新到 kubernetes 版本 1.21,而我的集群滿足以下條件:
- 已啟用私有和公共服務端點
- 禁用 VRF
根本原因:
在 Kubernetes 版本 1.21 中,Konnectivity 取代 OpenVPN 作為網路代理,用於保護 Kubernetes API 伺服器主節點與集群中的工作節點的通信。
使用 Konnectivity 時,當滿足上述所有條件時,主節點與集群節點之間的通信存在問題。
解決步驟:
- 通過使用命令禁用私有服務端點(公共端點似乎不是問題)
ibmcloud ks cluster master private-service-endpoint disable --cluster <CLUSTER_NAME>
(此命令是特定於提供商的,如果您在使用不同的提供商或本地安裝時遇到相同的問題,請了解如何禁用它私有服務端點)
刷新了集群主伺服器
ibmcloud ks cluster master refresh --cluster <CLUSTER_NAME>
,最後使用重新載入所有工作節點(在 Web 控制台中,也應該可以通過命令)
等了大約30分鐘:
- 儀表板可用/可再次訪問
Pod
s 可訪問且可再次調度一般建議:
在將任何集群更新到 Kubernetes 1.21 之前,請檢查您是否啟用了私有服務端點。如果有,請禁用它或延遲更新直到可以,或者啟用 VRF(虛擬路由和轉發),我不能但被告知它可能會解決問題。