Kubernetes 服務在存取不同工作執行緒上的 pod 時逾時

Kubernetes 服務在存取不同工作執行緒上的 pod 時逾時

我試圖在 EC2 實例上支援一對 kubernetes 工作線程,但遇到了一個問題:該服務似乎無法「看到」它應該能夠看到的所有 pod。

我的確切環境是一對 AWS Snowball(紅色和藍色),我的群集類似於controlworker-redworker-blue[1]。我正在部署一個虛擬 python 伺服器,該伺服器在連接埠 8080 上等待 GET,並使用本機主機名稱進行回應。我已經為它設置了足夠的副本,worker-red並且worker-blue每個副本都至少有一個 pod。最後,我創建了一個服務,其規格如下

spec:
    type: NodePort
    selector:
        app: hello-server
    ports:
        - port: 8080
          targetPort: 8080
          nodePort: 30080

我現在可以檢查我的 Pod 是否已啟動

kubectl get pods -o wide
NAME                                      READY   STATUS    RESTARTS   AGE   IP              NODE          NOMINATED NODE   READINESS GATES
hello-world-deployment-587468bdb7-hf4dq   1/1     Running   0          27m   192.168.1.116   worker.red    <none>           <none>
hello-world-deployment-587468bdb7-mclhm   1/1     Running   0          27m   192.168.1.126   worker.blue   <none>           <none>

現在我可以嘗試捲曲它們

curl worker-red:30080
greetings from hello-world-deployment-587468bdb7-hf4dq
curl worker-blue:30080
greetings from hello-world-deployment-587468bdb7-mclhm

大約有一半的情況會發生這種情況。另一半時間,curl 會因為逾時錯誤而失敗。具體來說 - 捲曲工人紅色只會產生來自 hf4dq 的回應,捲曲工人藍色只會產生來自 mclhm 的回應。如果我封鎖並排空工人藍色,以便我的兩個 Pod 都在工人紅色上運行,則永遠不會超時,並且兩個 Pod 都會響應。

NodePort 服務似乎無法到達不在我正在捲曲的主機上的 Pod。據我了解,這不是服務應該如何運作的。我缺什麼?

[1] 如果我設定為在 Red 上有兩個工作人員,則會發生我所描述的相同問題,但這是我的主要用例,因此這是我將重點關注的用例。

答案1

很難簡單地說出這裡可能出了什麼問題,但您可以採取一些步驟來解決您的問題:

  1. 調試 Pod,特別檢查日誌中是否有可疑內容:
  • kubectl logs ${POD_NAME} ${CONTAINER_NAME}

  • kubectl logs --previous ${POD_NAME} ${CONTAINER_NAME}

  1. 偵錯服務,例如透過檢查:
  • 該服務是否存在?

  • 該服務是否透過 DNS 名稱運作?

  • 該服務是否透過 IP 運作?

  • 服務定義是否正確?

  • 該服務有端點嗎?

  • kube-proxy 是否正常運作?

完成這些步驟將幫助您找到問題的原因,並更了解服務背後的機制。

答案2

您正在使用NodePort類型服務,在這種情況下您所觀察到的內容是非常值得期待的。

您的服務會配對在兩個不同節點上執行的 2 個 Pod。由於服務的類型為NodePort,因此服務的 pod 與其運行的節點之間存在固有關聯。如果你捲曲worker-red端點,你會僅有的取得來自 pod 的回應worker-red,這是因為另一個 pod 綁定到另一個端點worker-blue:<node-port>,並且無法從該worker-red端點存取。是的,它是相同的服務,但它由 2 個端點支持,每個端點都有不同的主機名稱。

這基本上就是NodePort服務的運作方式。

當您將它們捆綁在同一節點上時,可以從相同節點主機名稱存取兩個 pod,因此將它們捲曲都可以。從現在起,兩個端點都映射到不同的端口,但是相同的主機名

作為加深您對此的理解的一種方式。您可以嘗試將您的服務類型變更為LoadBalancer。您會注意到,您將能夠使用相同的主機名稱存取兩個 Pod,無論它們被安排在哪裡。此主機名稱/IP 位址將是LoadBalancer服務中所有 Pod 共有的位址。

我希望這能澄清您的困惑!

相關內容