View a markdown version of this page

對控制平面輸出問題進行故障診斷 - Amazon EKS

協助改進此頁面

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

對控制平面輸出問題進行故障診斷

使用CUSTOMER_ROUTED控制平面輸出模式時,您必須負責控制平面 ENIs 的網路連線。此頁面涵蓋常見問題及其解決方案。

偵測失敗的 Webhook

當控制平面無法連線到 Webhook 伺服器或 OIDC 供應商時,症狀通常會顯示為 Webhook 逾時。若要確認,請建立或修改觸發 Webhook 的資源,並檢查錯誤:

kubectl apply -f my-resource.yaml

連線或 DNS 失敗通常會傳回類似以下的錯誤:

Error from server (InternalError): error when creating "my-resource.yaml": Internal error occurred: failed calling webhook "my-webhook.example.com": failed to call webhook: Post "https://my-webhook.example.com/validate?timeout=10s": context deadline exceeded

您也可以檢查叢集中最近的事件是否有 Webhook 錯誤:

kubectl get events --all-namespaces --field-selector reason=FailedCreate

沒有輸出路由到所需的端點

徵狀:

  • 許可 Webhook 逾時。

  • OIDC 提供者探索失敗。

  • 叢集建立或更新停滯。

原因:

控制平面網路介面子網路沒有控制平面需要到達的端點的工作路由。最常見的是,子網路路由表缺少輸出裝置的預設路由。或者,該裝置設定錯誤。輸出裝置通常是 NAT 閘道。不過,它可以是 NAT 執行個體、防火牆或代理設備,或是集中式輸出 VPC 的傳輸閘道。

解決方案

  1. 識別您的叢集用於控制平面網路介面的子網路:

    aws eks describe-cluster --name my-cluster \ --query "cluster.resourcesVpcConfig.subnetIds"
  2. 針對每個子網路,檢查相關聯的路由表:

    aws ec2 describe-route-tables \ --filters "Name=association.subnet-id,Values=subnet-ExampleID1"
  3. 確認您的輸出裝置指向 0.0.0.0/0(或涵蓋端點的路由) 的路由存在。如果遺失,請新增路由。下列範例新增 NAT 閘道路由;取代您自己的輸出目標 (例如傳輸閘道或網路界面):

    aws ec2 create-route \ --route-table-id rtb-ExampleID \ --destination-cidr-block 0.0.0.0/0 \ --nat-gateway-id nat-ExampleID

封鎖 Webhook 或控制平面流量NACLs

徵狀:

  • 許可 Webhook 呼叫逾時 (錯誤:failed calling webhook)。

  • 建立或修改使用變動或驗證 Webhook 的 Kubernetes 資源時發生間歇性失敗。

原因:

控制平面 ENI 子網路上的網路 ACLs 會封鎖 Webhook 端點的傳出流量,或封鎖傳入暫時性連接埠傳回流量。

解決方案

  1. 識別與您的控制平面子網路相關聯的 NACLs:

    aws ec2 describe-network-acls \ --filters "Name=association.subnet-id,Values=subnet-ExampleID1"
  2. 確保存在下列規則:

    Direction 通訊協定 連接埠範圍 目的地/來源 Action

    傳出

    TCP

    443

    0.0.0.0/0 (或 Webhook CIDR)

    允許

    傳出

    TCP

    10250

    VPC CIDR

    允許

    傳入

    TCP

    1024–65535

    0.0.0.0/0

    允許 (暫時性傳回流量)

    注意

    NACLs 是無狀態的。您必須明確允許傳入規則中暫時性連接埠 (1024–65535) 上的傳回流量。

    這些規則涵蓋兩個不同的路徑。連接埠 443 規則適用於傳出流量到 Webhook 和 OIDC 端點,這會透過您的輸出裝置離開 VPC。連接埠 10250 規則適用於 kubelet API,其會在控制平面和節點之間保留在您的 VPC 內。遺失的輸出裝置不會影響連接埠 10250,但限制性網路 ACL 可以封鎖它。

防止存取的安全群組

徵狀:

  • Webhook 呼叫失敗。

  • 控制平面無法連線到節點上的 kubelet API (連接埠 10250)。

  • kubectl execkubectl logskubectl port-forward 失敗。

原因:

連接到控制平面 ENIs 的安全群組 (叢集安全群組) 不允許必要連接埠上的傳出流量。

解決方案

  1. 識別叢集安全群組:

    aws eks describe-cluster --name my-cluster \ --query "cluster.resourcesVpcConfig.clusterSecurityGroupId"
  2. 驗證傳出規則允許:

    通訊協定 站點 目標

    TCP

    443

    0.0.0.0/0 (webhook 端點、OIDC 供應商)

    TCP

    10250

    節點安全群組或 VPC CIDR (kubelet API)

  3. 如果傳出規則具有限制性,請新增所需流量的規則:

    aws ec2 authorize-security-group-egress \ --group-id sg-ExampleClusterSG \ --protocol tcp \ --port 443 \ --cidr 0.0.0.0/0
    注意

    如果您有嚴格的輸出要求,而且您知道 Webhook 和 OIDC 端點的 IP 範圍,您可以將連接埠 443 規則範圍限定為這些特定的 CIDRs,而不是 0.0.0.0/0。連接埠 10250 (kubelet API) 規則為 VPC 內部;將其範圍限定於節點安全群組或 VPC CIDR,而非網際網路。

DHCP 選項集重新整理失敗

徵狀:

  • DNS 解析從控制平面失敗。

  • 需要 DNS 查詢 (OIDC 探索、Webhook 解析) 的叢集操作失敗。

  • 問題會在 VPC DHCP 選項變更後或控制平面更新後出現。

原因:

VPC DHCP 選項集已變更。或者,它不包括在其網域名稱伺服器AmazonProvidedDNS中。它也可能缺少另一個解析程式,可以解析控制平面所需的名稱。控制平面會自動偵測 DHCP 選項集變更,並套用新的 DNS 設定,通常在一小時內。只有在叢集 IAM 角色授予所需的 Amazon EC2 讀取許可時,控制平面才能執行此操作。

解決方案

  1. 驗證 VPC 的 DHCP 選項集:

    aws ec2 describe-vpcs --vpc-ids vpc-ExampleID \ --query "Vpcs[0].DhcpOptionsId" \ --region region-code
    aws ec2 describe-dhcp-options --dhcp-options-ids dopt-ExampleID --region region-code
  2. 確認 domain-name-servers 包含 AmazonProvidedDNS(Amazon 提供的 DNS 解析程式,這是 VPC IPv4 CIDR 的基礎加上兩個),或另一個解析程式可以解析控制平面所需的名稱。

  3. 確認叢集 IAM 角色授予 ec2:DescribeVpcsec2:DescribeDhcpOptions。如果沒有這些許可,控制平面將無法讀取更新的 DHCP 選項,也無法重新整理其 DNS 設定。如需詳細資訊,請參閱 Amazon EKS 叢集 IAM 角色

  4. DHCP 選項變更後,控制平面最多需要一小時的時間來自動偵測和套用新設定。不需要叢集更新或執行個體替換。如果 DNS 解析在一小時後仍然失敗,且上述許可已就緒,請聯絡 AWS Support。

IPv6 路由問題

徵狀:

  • IPv6 叢集無法連線到外部 OIDC 或 Webhook 端點。

  • 節點註冊可透過 IPv4 運作,但 IPv6 服務失敗。

原因:

子網路路由表缺少僅輸出網際網路閘道的::/0路由,或安全群組/NACLs不允許 IPv6 流量。

解決方案

  1. 驗證輸出限定網際網路閘道是否存在,並連接到 VPC:

    aws ec2 describe-egress-only-internet-gateways \ --filters "Name=attachment.vpc-id,Values=vpc-ExampleID"
  2. 檢查控制平面子網路的路由表是否具有::/0路由:

    aws ec2 describe-route-tables \ --filters "Name=association.subnet-id,Values=subnet-ExampleID1" \ --query "RouteTables[0].Routes[?DestinationIpv6CidrBlock=='::/0']"
  3. 如果遺失,請新增路由:

    aws ec2 create-route \ --route-table-id rtb-ExampleID \ --destination-ipv6-cidr-block ::/0 \ --egress-only-internet-gateway-id eigw-ExampleID
  4. 確保 NACLs 和安全群組允許連接埠 443 和傳入暫時性連接埠上的 IPv6 傳出。

無法連線 OIDC 提供者

徵狀:

  • IAM roles for service accounts (IRSA) 失敗 — Pod 無法擔任角色。

  • 叢集事件會顯示 OIDC 探索錯誤。

原因:

控制平面無法到達 OIDC 提供者端點 (例如 oidc.eks.region-code.amazonaws.com),因為輸出遭到封鎖。

解決方案

  1. 確認輸出路徑和路由表允許傳出 HTTPS 流量。如需輸出路由遺失或設定錯誤時的疑難排解步驟,請參閱 沒有輸出路由到所需的端點

  2. 確認叢集安全群組允許傳出 TCP 443 0.0.0.0/0(請參閱 防止存取的安全群組)。

📝 在 GitHub 上編輯此頁面