我的 Pod 無法連線到 Amazon Elastic Kubernetes Service (Amazon EKS) 中的其他 Pod。
簡短描述
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確定您使用的是最新的 AWS CLI 版本。
如果您的 Pod 無法與其他 Pod 連線,則視您的應用程式而定,您可能會收到下列錯誤。
如果來自工作節點的安全群組不允許節點間通訊,則會收到下列錯誤:
curl: (7) Failed to connect to XXX.XXX.XX.XXX port XX: Connection timed out
如果 DNS 無法運作,則會收到下列錯誤:
curl nginx
curl: (6) Could not resolve host: nginx
如果 DNS 正常運作,但有 Pod 連線問題,則會收到下列錯誤:
Error: RequestError: send request failed caused by: Post dial tcp 1.2.3.4.5:443: i/o timeout
如果您嘗試解析未透過服務公開的 Pod 的 DNS,則會收到下列錯誤:
kubectl exec -it busybox -- nslookup nginx
Server: 10.100.0.10
Address: 10.100.0.10:53
** server can't find nginx.default.svc.cluster.local: NXDOMAIN
*** Can't find nginx.svc.cluster.local: No answer
*** Can't find nginx.cluster.local: No answer
*** Can't find nginx.ap-southeast-2.compute.internal: No answer
*** Can't find nginx.default.svc.cluster.local: No answer
*** Can't find nginx.svc.cluster.local: No answer
*** Can't find nginx.cluster.local: No answer
*** Can't find nginx.ap-southeast-2.compute.internal: No answer
若要解決這些錯誤,請檢查您的環境設定是否正確:
- 您的安全群組符合 Amazon EKS 準則。
- 網路存取控制清單 (network ACL) 不會拒絕連線。
- 您的子網路具有可在 Amazon Virtual Private Cloud (Amazon VPC) 內進行通訊的本機路由。
- 子網路中有足夠的 IP 地址可用。
- 您的 Pod 安全群組允許 Pod 彼此通訊。
- 您的工作節點已開啟 IP 轉送功能。
- 您符合 Kubernetes 的網路需求 (不包括任何故意的 NetworkPolicy)。
- 您的 Pod 正確地使用 DNS 相互通訊。
- 您的 Pod 已排定並處於「執行中」狀態。
- 您擁有適用於 Kubernetes 的建議版本的 Amazon VPC Container Network Interface (CNI) 外掛程式。
解決方法
您的安全群組符合 Amazon EKS 準則
若要限制您在工作節點的安全群組上允許的流量,請建立輸入規則。針對工作節點用於節點間通訊的任何通訊協定或任何連接埠建立這些規則。
最佳做法是允許工作節點的安全群組的所有流量。您不需要在每次建立具有新連接埠的新 Pod 時變更安全群組規則。
如需詳細資訊,請參閱 Amazon EKS 安全群組需求和考量。
網路 ACL 不會拒絕連線
1. 確認您的 Amazon EKS 叢集和 VPC CIDR 之間的流量可以在您的網路 ACL上自由流動。
2. (選用) 若要為 VPC 新增額外的安全性層,請考慮使用類似於安全群組的規則來設定網路 ACL。
您的子網路具有可在 VPC 內進行通訊的本機路由
確認您的子網路具有可在 VPC 內進行通訊的預設路由。
子網路中有足夠的可用 IP 位址
確認您指定的子網路具有足夠的可用 IP 位址供跨帳戶彈性網路介面和 Pod 使用。
如需詳細資訊,請參閱 Amazon EKS VPC 和子網路需求和考量事項。
若要檢查可用的 IP 位址,請執行下列 AWS CLI 命令:
$ aws ec2 describe-subnets --subnet-id YOUR-SUBNET-ID --query 'Subnets[0].AvailableIpAddressCount'
您的 Pod 安全群組允許 Pod 彼此通訊
如果您對 Pod 或 CNI 自訂網路使用安全群組,則可以將任何安全群組分配給 Pod 。在此案例中,請確認安全群組允許 Pod 之間正確的通訊。
您的工作節點已啟用 IP 轉送
如果您使用自訂 AMI,則必須確定已開啟 net.ipv4.ip\ _forward 核心變數。若要驗證工作節點上的此設定,請執行下列其中一個命令:
# sysctl net.ipv4.ip_forward
# cat /proc/sys/net/ipv4/ip_forward
如果輸出為 0,請使用下列其中一個命令來啟動 net.ipv4.ip\ _forward 核心變數。
# sysctl -w net.ipv4.ip_forward=1
# echo 1 > /proc/sys/net/ipv4/ip_forward
對於 containerd 執行期中的 Amazon EKS AMI,請參閱 install-worker.sh 指令碼的第 184-188 行 (位於 GitHub 上),瞭解該設定的啟用情況。由於 containerd 是 Amazon EKS 1.24 版及更新版本的預設執行期,因此需要執行此步驟才能疑難排解點對 Pod 網路連線的問題。
您符合 Kubernetes 的網路需求 (不包括任何有意的 NetworkPolicy)
確認您符合 Kubernetes 網路需求 (來自 Kubernetes 網站)。
依預設, Pod 不會隔離。Pod 接受來自任何來源的流量。Pod 會透過具有選取 Pod 的 NetworkPolicy 而隔離。
**注意:**如需 NetworkPolicy 設定,請參閱安裝 Calico 網路政策引擎附加元件。
您的 Pod 正確使用 DNS 互相通訊
您必須先透過服務公開您的 Pod。如果不這樣做,則您的 Pod 無法取得 DNS 名稱,而且只能透過其特定 IP 位址連線。
下列範例輸出顯示嘗試解析 nginx 服務的 DNS 名稱。在此情況下,會傳回 ClusterIP 10.100.94.70:
$ kubectl run nginx --image=nginx --replicas=5 -n web
deployment.apps/nginx created
$ kubectl expose deployment nginx --port=80 -n web
service/nginx exposed
$ kubectl get svc -n web
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx ClusterIP 10.100.94.70 <none> 80/TCP 2s
# kubectl exec -ti busybox -n web -- nslookup nginx
Server: 10.100.0.10
Address 1: 10.100.0.10 ip-10-100-0-10.ap-southeast-2.compute.internal
Name: nginx
Address 1: 10.100.94.70 ip-10-100-94-70.ap-southeast-2.compute.internal
如果您的 Pod 仍無法解析 DNS,請參閱如何使用 Amazon EKS 疑難排解 DNS 故障?
**注意:**如需詳細資訊,請參閱 Kubernetes 網站上的 Pods、服務和無周邊服務。
您的 Pod 已排程且處於「執行中」狀態
確認您的 Pod 已排程且處於「執行中」狀態。
若要疑難排解您的 Pod 狀態,請參閱如何疑難排解 Amazon EKS 中的 Pod 狀態?
您擁有適用於 Kubernetes 的建議版本的 Amazon VPC CNI 外掛程式
如果您沒有適用於 Kubernetes 的 建議版本 的 Amazon VPC CNI 外掛程式,請升級至最新版本。
如果您使用的是建議版本,但遇到問題,請參閱如何解決 Amazon EKS 的 kubelet 或 CNI 外掛程式問題?