當我連線至託管在 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集的服務時,會出現連線逾時。
簡短描述
您無法連線至 Amazon EKS 叢集中服務的兩個最常見原因是:
- 安全群組或網路存取控制清單 (網路 ACL) 限制阻止流量到達 Pod 端點。
- 由於標籤不相符,服務未選擇 Pod 端點。
若要解決這些問題,請檢查與您的工作節點執行個體和負載平衡器關聯的安全群組和網路 ACL。此外,請確認您的服務是否為 Pod 選擇了正確的標籤。
**注意:**疑難排解因不同的服務類型而異。對無法存取的服務進行疑難排解時,以下解決方案適用。若要進一步了解 Kubernetes 服務類型,請參閲如何公開 Amazon EKS 叢集上執行的 Kubernetes 服務?
解決方案
檢查您的安全群組和網路 ACL
叢集 IP
叢集 IP 服務類型用於在同一 Amazon EKS 叢集中執行的微型服務間的通訊。請確認,連接至目的地 Pod 所在執行個體的安全群組具有允許用戶端 Pod 執行個體通訊的入站規則。
在大多數情況下,設有 self 規則,以允許透過工作節點安全群組中的所有連接埠進行的所有通訊。如果使用多個節點群組,每個節點群組均有其自己的安全群組,請確認允許安全群組之間的所有通訊。這可讓跨多個節點執行的微型服務輕鬆通訊。
若要進一步了解,請參閲 Amazon EKS 安全群組考量。
節點連接埠
工作節點安全群組應允許 NodePort 服務定義中所指定連接埠上的傳入流量。如果未在服務定義中指定,則該連接埠參數的值與 targetPort 參數的值相同。該連接埠在 Amazon EKS 叢集的所有節點上公開。
請檢查連結至工作節點子網路的網路 ACL。請確認您的用戶端 IP 地址位於服務所用連接埠允許清單中。
如果您透過網際網路存取 Kubernetes 服務,請確認節點具有公有 IP 地址。若要存取服務,必須使用節點的公有 IP 地址和連接埠組合。
負載平衡器
請確認負載平衡器安全群組允許接聽程式連接埠。此外,請確認工作節點安全群組允許透過執行應用程式容器的連接埠,從負載平衡器安全群組傳入的流量。
如果服務定義中指定的連接埠與 targetPort 不同,則必須允許透過工作節點安全群組中的連接埠,從負載平衡器安全群組傳入的流量。連接埠和 targetPort 通常在服務定義中相同。
網路 ACL 必須允許用戶端 IP 地址到達接聽程式連接埠的負載平衡器。如果您透過網際網路存取負載平衡器,則請確認已建立公有負載平衡器。
檢查您的服務是否正確選擇 Pod 端點
如果您的 Pod 未註冊為服務的後端,則可能會收到逾時錯誤。當您從瀏覽器存取服務或執行 curl podIP:podPort 命令時,可能會發生這種情況。
檢查 Pod 的標籤,並確認服務是否具有適當的標籤選擇器 (來自 Kubernetes 網站)。
執行以下命令以確認您的 Kubernetes 服務是否正確選擇並註冊 Pod。
命令:
kubectl get pods -o wide
範例輸出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-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: none
Session 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 叢集中執行的服務後端。