我試圖在 EC2 實例上支援一對 kubernetes 工作線程,但遇到了一個問題:該服務似乎無法「看到」它應該能夠看到的所有 pod。
我的確切環境是一對 AWS Snowball(紅色和藍色),我的群集類似於control
、worker-red
和worker-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
答案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 共有的位址。
我希望這能澄清您的困惑!