Kubernetes

Kubernetes 集群上沒有可訪問或可調度的 Pod

  • November 19, 2021

我在 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 對象(我實際上可以應用Services 或s ,ConfigMap但沒有Pod,或類似的) .ReplicaSet``Deployment

我已經嘗試過

  • 重新載入工作池中的工作節點
  • 重啟workerpool中的worker節點
  • 重新啟動 kubernetes-dashboardDeployment

不幸的是,上述操作都沒有改變Pods.

還有另一件事可能是相關的(雖然我不太確定它是否真的是):

在另一個執行良好的集群中,有三個 calicoPod正在執行,並且所有三個都啟動,而在有問題的集群中,三個 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分鐘:

    • 儀表板可用/可再次訪問
    • Pods 可訪問且可再次調度

一般建議:

將任何集群更新到 Kubernetes 1.21 之前,請檢查您是否啟用了私有服務端點。如果有,請禁用它或延遲更新直到可以,或者啟用 VRF(虛擬路由和轉發),我不能但被告知它可能會解決問題。

引用自:https://serverfault.com/questions/1083392