View a markdown version of this page

EKS 混合節點閘道入門 - Amazon EKS

協助改進此頁面

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

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

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

EKS 混合節點閘道入門

此頁面會逐步解說 Amazon EKS 混合節點閘道的先決條件、環境準備、安裝、驗證和移除。如需閘道及其架構的簡介,請參閱 Amazon EKS 混合節點閘道

先決條件

安裝混合節點閘道之前,請確認您的環境符合下列要求:

  • EKS 叢集支援 Cilium CNI 和 VTEP — 您的 EKS 叢集必須使用 EKS 版本的 Cilium 作為混合節點上的 CNI,並且必須啟用 Cilium VTEP。如需詳細資訊,請參閱設定混合節點閘道的 CNI

  • AWS 雲端節點上的 VPC CNI — 叢集中的閘道節點和其他雲端節點必須使用 AWS VPC CNI。閘道依賴 VPC 原生路由來轉送 VPC 和 VXLAN 通道之間的流量。

  • 混合連線 — 您的 VPC 與內部部署環境之間需要私有連線。您可以使用 AWS Direct Connect、 AWS Site-to-Site VPN 或您自己的 VPN 解決方案。如需詳細資訊,請參閱準備混合節點的聯網

  • 允許 VXLAN 流量 — 連接到閘道 EC2 執行個體的安全群組必須允許連接埠 8472 上的傳入和傳出 UDP 流量。在混合節點端,內部部署防火牆規則也必須允許 UDP 連接埠 8472 往返閘道節點 IP 地址的流量。

  • 路由表管理的 IAM 許可 — 閘道需要下列 EC2 動作來管理 VPC 路由表:

    • ec2:DescribeRouteTables

    • ec2:CreateRoute

    • ec2:ReplaceRoute

    • ec2:DescribeInstances

      您可以使用下列其中一種方法授予這些許可:

      EKS Pod Identity (recommended)

      使用 EKS Pod Identity 僅將許可授予閘道 Pod 的服務帳戶。

      1. 如果尚未安裝 EKS Pod Identity Agent 附加元件,請在叢集上安裝:

        aws eks create-addon \ --cluster-name CLUSTER_NAME \ --addon-name eks-pod-identity-agent
      2. 使用 EKS Pod Identity 所需的 EC2 許可和信任政策建立 IAM 角色:

        cat > gateway-trust-policy.json << 'EOF' { "Version": "2012-10-17" , "Statement": [ { "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": ["sts:AssumeRole", "sts:TagSession"] } ] } EOF aws iam create-role \ --role-name EKSHybridNodesGatewayRole \ --assume-role-policy-document file://gateway-trust-policy.json aws iam put-role-policy \ --role-name EKSHybridNodesGatewayRole \ --policy-name HybridNodesGatewayRouteTable \ --policy-document '{ "Version": "2012-10-17" , "Statement": [{ "Effect": "Allow", "Action": [ "ec2:DescribeRouteTables", "ec2:CreateRoute", "ec2:ReplaceRoute", "ec2:DescribeInstances" ], "Resource": "*" }] }'
      3. 建立將 IAM 角色連結至閘道服務帳戶的 Pod 身分關聯:

        aws eks create-pod-identity-association \ --cluster-name CLUSTER_NAME \ --namespace eks-hybrid-nodes-gateway \ --service-account eks-hybrid-nodes-gateway \ --role-arn arn:aws:iam::ACCOUNT_ID:role/EKSHybridNodesGatewayRole
      Node IAM role

      將具有必要許可的內嵌或受管政策連接至與閘道節點執行個體描述檔相關聯的 IAM 角色:

      aws iam put-role-policy \ --role-name NODE_ROLE_NAME \ --policy-name HybridNodesGatewayRouteTable \ --policy-document '{ "Version": "2012-10-17" , "Statement": [{ "Effect": "Allow", "Action": [ "ec2:DescribeRouteTables", "ec2:CreateRoute", "ec2:ReplaceRoute", "ec2:DescribeInstances" ], "Resource": "*" }] }'

      閘道節點上的所有 Pod 都將具有這些許可。

  • EKS 自動模式 (如果閘道節點使用自動模式) — 如果您計劃使用 EKS 自動模式來佈建閘道節點,則必須在 EKS 叢集上啟用自動模式。如需詳細資訊,請參閱啟用 EKS 自動模式

準備閘道節點

閘道至少需要兩個 EC2 節點才能實現高可用性。閘道支援兩個節點組態選項:

  • EKS Auto 模式 (建議) — 節點會使用 NodePool和 自動佈建NodeClass。來源/目的地檢查、標籤和污點都是以宣告方式設定。

  • 受管節點群組 — 您可以使用受管節點群組或自我管理節點佈建節點。可以透過受管節點群組 API 設定標籤,也可以使用自訂啟動範本搭配使用者資料來停用來源/目的地檢查。

EKS Auto 模式 (建議)

使用 EKS Auto Mode 時,您必須先建立 NodePool和 ,NodeClass再安裝 Helm Chart。NodePool 會使用正確的標籤、污點和來源/目的地檢查組態來佈建 EC2 執行個體。您不需要手動佈建或設定節點。

將下列資源套用至您的叢集,取代預留位置值:

  • YOUR_NODE_ROLE — EKS Auto Mode 用來佈建節點的節點 IAM 角色名稱。這是您在叢集上啟用自動模式時所設定 (或 EKS 建立的角色)。如需詳細資訊,請參閱建立 EKS Auto Mode 的節點 IAM 角色

  • YOUR_CLUSTER_NAME — EKS 叢集名稱。

  • SUBNET_ID_1SUBNET_ID_2 — 不同可用區域中IDs,其中將佈建閘道節點。

apiVersion: eks.amazonaws.com/v1 kind: NodeClass metadata: name: hybrid-gateway spec: advancedNetworking: sourceDestCheck: DisabledPrimaryENI role: YOUR_NODE_ROLE securityGroupSelectorTerms: - tags: aws:eks:cluster-name: YOUR_CLUSTER_NAME subnetSelectorTerms: - id: SUBNET_ID_1 - id: SUBNET_ID_2 --- apiVersion: karpenter.sh/v1 kind: NodePool metadata: name: hybrid-gateway spec: template: metadata: labels: hybrid-gateway-node: "true" spec: expireAfter: 336h nodeClassRef: group: eks.amazonaws.com kind: NodeClass name: hybrid-gateway requirements: - key: karpenter.sh/capacity-type operator: In values: - on-demand - key: eks.amazonaws.com/instance-category operator: In values: - c - m - r - key: eks.amazonaws.com/instance-generation operator: Gt values: - "4" - key: kubernetes.io/arch operator: In values: - amd64 - key: kubernetes.io/os operator: In values: - linux taints: - key: hybrid-gateway-node effect: NoSchedule terminationGracePeriod: 24h0m0s disruption: budgets: - nodes: 10% consolidateAfter: 30s consolidationPolicy: WhenEmptyOrUnderutilized

此組態中的金鑰欄位:

  • advancedNetworking.sourceDestCheck: DisabledPrimaryENI — 停用節點主要 ENI 的 EC2 來源/目的地檢查,讓閘道可以將未定址的流量轉送給自己。

  • taintshybrid-gateway-node: NoSchedule 污點可確保這些節點上只有具有相符容錯排程的閘道 Pod。

  • labels — Helm Chart 的節點選擇器會使用 hybrid-gateway-node: "true"標籤,將閘道 Pod 目標設為這些節點。

  • nodeClassRef — 使用來源/目的地檢查組態將 NodePool 連結至 NodeClass。

受管節點群組

使用受管節點群組時,請為閘道建立專用節點群組,其中包含必要的標籤、污點和自訂啟動範本,以在啟動時停用來源/目的地檢查。

步驟 1:建立啟動範本

使用使用者資料建立啟動範本,以在執行個體開機時停用主要 ENI 的來源/目的地檢查:

# Create the launch template with user data to disable source/dest check USERDATA=$(cat <<'SCRIPT' | base64 -w 0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==BOUNDARY==" --==BOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" \ -H "X-aws-ec2-metadata-token-ttl-seconds: 60") MAC=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \ http://169.254.169.254/latest/meta-data/mac) ENI_ID=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \ "http://169.254.169.254/latest/meta-data/network/interfaces/macs/${MAC}/interface-id") REGION=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \ http://169.254.169.254/latest/meta-data/placement/region) aws ec2 modify-network-interface-attribute \ --network-interface-id "$ENI_ID" \ --no-source-dest-check \ --region "$REGION" --==BOUNDARY==-- SCRIPT ) aws ec2 create-launch-template \ --launch-template-name YOUR_CLUSTER_NAME-gateway-lt \ --launch-template-data "{\"UserData\":\"${USERDATA}\",\"MetadataOptions\":{\"HttpTokens\":\"required\",\"HttpPutResponseHopLimit\":2}}"
注意

節點的 IAM 角色必須具有ec2:ModifyNetworkInterfaceAttribute許可,使用者資料指令碼才能成功。MIME 分段格式可確保使用者資料與 EKS 引導指令碼一起執行。

步驟 2:建立受管節點群組

從步驟 1 建立具有閘道標籤、污點和啟動範本的專用受管節點群組:

aws eks create-nodegroup \ --cluster-name YOUR_CLUSTER_NAME \ --nodegroup-name YOUR_CLUSTER_NAME-gateway-nodes \ --subnets SUBNET_ID_1 SUBNET_ID_2 \ --node-role YOUR_NODE_ROLE_ARN \ --instance-types INSTANCE_TYPE \ --ami-type AL2023_x86_64_STANDARD \ --scaling-config desiredSize=2,maxSize=2,minSize=2 \ --labels hybrid-gateway-node=true \ --taints "key=hybrid-gateway-node,effect=NO_SCHEDULE" \ --launch-template "name=YOUR_CLUSTER_NAME-gateway-lt,version=1"

這會建立 2 節點受管節點群組,其中:

  • --labels 會設定 ,hybrid-gateway-node=true讓 Helm Chart 的節點選擇器以這些節點為目標。

  • --taints NoSchedule 新增了污點,因此只有閘道 Pod 在這些節點上具有相符的容錯排程。

  • --launch-template 連接啟動範本,該範本會在開機時停用來源/目的地檢查。

在不同可用區域中使用子網路以獲得高可用性。

使用 Helm 安裝

EKS 自動模式

執行下列命令以使用 EKS Auto 模式安裝閘道:

helm install eks-hybrid-nodes-gateway \ oci://public.ecr.aws/eks/eks-hybrid-nodes-gateway \ --version 1.0.0 \ --namespace eks-hybrid-nodes-gateway \ --create-namespace \ --set vpcCIDR=VPC_CIDR \ --set podCIDRs=POD_CIDRS \ --set routeTableIDs=ROUTE_TABLE_IDS

受管節點群組或自我管理節點

對於受管節點群組或自我管理節點,設定 autoMode.enabled=false

helm install eks-hybrid-nodes-gateway \ oci://public.ecr.aws/eks/eks-hybrid-nodes-gateway \ --version 1.0.0 \ --namespace eks-hybrid-nodes-gateway \ --create-namespace \ --set autoMode.enabled=false \ --set vpcCIDR=VPC_CIDR \ --set podCIDRs=POD_CIDRS \ --set routeTableIDs=ROUTE_TABLE_IDS

必要的 Helm 值

所有安裝都需要下列值:

Value Description

vpcCIDR

EKS 叢集 VPC 的 CIDR 區塊 (例如 10.0.0.0/16)。用於 Cilium VTEP 組態,以便混合節點透過閘道路由 VPC 繫結流量。

podCIDRs

Cilium 在混合節點上使用的 Pod CIDRs 逗號分隔清單 (例如 10.100.0.0/16,10.101.0.0/16)。閘道會為這些 CIDRs 建立 VPC 路由表項目和 VXLAN 路由。

routeTableIDs

要程式設計的 VPC 路由表 IDs 逗號分隔清單 (例如 rtb-0abc1234def567890,rtb-0fed9876cba543210)。閘道會在這些資料表中建立將混合 Pod CIDRs 指向作用中閘道執行個體的路由。

如需可設定值的完整清單,請參閱 Amazon EKS 混合節點閘道組態參考

驗證安裝

安裝閘道之後,請確認閘道正在執行且運作狀態良好。

檢查 Pod 狀態

確認兩個閘道 Pod 正在執行:

kubectl get pods -n eks-hybrid-nodes-gateway

您應該會看到類似以下的輸出:

NAME READY STATUS RESTARTS AGE eks-hybrid-nodes-gateway-5d4f6a7b8c-abc12 1/1 Running 0 2m eks-hybrid-nodes-gateway-5d4f6a7b8c-def34 1/1 Running 0 2m

檢查領導者選擇

確認一個 Pod 已取得領導者選擇租用:

kubectl get lease -n eks-hybrid-nodes-gateway

輸出會在 HOLDER欄中顯示目前的領導者:

NAME HOLDER AGE hybrid-gateway-leader eks-hybrid-nodes-gateway-5d4f6a7b8c-abc12 2m

檢查運作狀態端點

驗證運作狀態端點是否使用連接埠轉送來回應領導 Pod:

kubectl port-forward -n eks-hybrid-nodes-gateway LEADER_POD_NAME 8088:8088 & curl -s http://localhost:8088/healthz

運作狀態良好的閘道會傳回 HTTP 200 回應。

驗證 VPC 路由表項目

在 Amazon VPC 主控台或使用 AWS CLI 中,確認您的 VPC 路由表包含指向領導閘道執行個體 ENI 的混合式 Pod CIDRs 項目:

aws ec2 describe-route-tables \ --route-table-ids ROUTE_TABLE_ID \ --query "RouteTables[].Routes[?DestinationCidrBlock=='[.replaceable]`POD_CIDR`']"

每個混合 Pod CIDR 都應有一個路由,並將 NetworkInterfaceId設定為領導執行個體的主要 ENI。

解除安裝

若要移除混合節點閘道,請執行:

helm uninstall eks-hybrid-nodes-gateway --namespace eks-hybrid-nodes-gateway
注意

解除安裝 Helm Chart 不會自動移除閘道建立的 VPC 路由表項目。解除安裝後,從 VPC 路由表手動刪除混合 Pod CIDRs的路由,以避免將流量路由到不再執行閘道的執行個體。您可以使用 CLI AWS 移除路由:

aws ec2 delete-route \ --route-table-id ROUTE_TABLE_ID \ --destination-cidr-block POD_CIDR

後續步驟