當我連線至我在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集中託管的 Service 時,收到連線逾時錯誤。
簡短說明
由於安全群組或網路存取控制清單 (network ACL) 會限制來自 Pod 端點的流量,因此會發生最常見的 Service 連線問題。
若要解決此問題,請檢查與您的工作節點執行個體和負載平衡器相關聯的安全群組和網路 ACL。如果您使用 Network Load Balancer,請確認您的 Service 為您的 Pod 選取正確的標籤。
注意: 下列解決方法適用於無法存取的 Service。若要進一步了解 Kubernetes Service 類型,請參閱我如何公開在我的 Amazon EKS 叢集上執行的 Kubernetes 服務?
解決方法
檢查您的安全群組和網路 ACL
叢集 IP
叢集 IP Service 類型用於在同一 Amazon EKS 叢集中執行的微型服務之間的通訊。請確定目的地 Pod 執行個體的安全群組具有允許用戶端 Pod 執行個體進行通訊的傳入規則。
在大多數情況下,有一個 self 規則允許透過工作節點安全群組中的所有連接埠進行所有通訊。如果您使用多個節點群組,每個群組都有自己的安全群組,因此請允許安全群組之間的所有通訊。如此便可讓橫跨多個節點執行的微型服務輕鬆地進行通訊。
若要了解更多資訊,請參閱 Amazon EKS 安全群組要求和考量。
節點連接埠
工作節點安全群組必須允許透過 NodePort Service 定義中所指定連接埠傳輸的傳入流量。如果未在 Service 定義中指定,則連接埠參數的值會與 targetPort 參數相同。連接埠會在 Amazon EKS 叢集中的所有節點上公開。
檢查連結至工作節點子網路的網路 ACLS。請確定您的用戶端 IP 位址位於 Service 所使用連接埠的允許清單中。
如果您透過網際網路存取 Kubernetes Service,請確認您的節點是否具有公有 IP 位址。若要存取 Service,則須使用節點的公有 IP 位址和連接埠組合。
負載平衡器
請確定以下條件為 true:
- 負載平衡器安全群組允許傳入接聽程式連接埠。
- 負載平衡器安全群組允許在目標流量連接埠上的傳出流量。
- 工作節點安全群組允許透過應用程式容器執行的連接埠,傳輸來自負載平衡器安全群組的傳入流量。
- 如果您使用的網路負載平衡器無使用用戶端 IP 保留的安全群組關聯,則工作節點允許用戶端流量。
- 如果不同於 Service 中對應的連接埠,工作節點則允許與 targetPort 相符的流量。
- 網路 ACL 允許您的用戶端 IP 位址連線接聽程式連接埠的負載平衡器。
- 如果您透過網際網路存取負載平衡器,則已建立面向網際網路的負載平衡器。
確認您的 Service 是否已正確選取 Pod 端點
如果您的 Pod 未註冊為 Service 服務的後端,則會收到逾時錯誤。從瀏覽器存取 Service 時,則會發生這種情況。或者,執行 curl podIP:podPort 命令時,也會發生這種情況。
檢查 Pod 的標籤,並確認 Service 是否具有適當的標籤選取器。如需詳細資訊,請參閱 Kubernetes 網站上的標籤和選取器。
執行下列命令以確認您的 Kubernetes Service 是否已正確選取並註冊您的 Pod。
命令:
kubectl get pods -o wide
範例輸出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-6799fc88d8-2rtn8 1/1 Running 0 3h4m 172.31.33.214 ip-172-31-33-109.us-west-2.compute.internal none none
命令:
kubectl describe svc your_service_name -n your_namespace
注意: 將 your_service_name 取代為您的服務名稱,並將 your_namespace 取代為您的名稱空間。
範例輸出:
Events: noneSession Affinity: none
Endpoints: 172.31.33.214:80
....
在範例輸出中,172.31.33.214 是從 kubectl get pods -o wide 命令傳回的 Pod IP 位址。172.31.33.214 IP 位址也可作為在 Amazon EKS 叢集中執行之服務的後端。