針對適用於 Amazon EKS Pod 的安全群組設定適用於 Kubernetes 的 Amazon VPC CNI 外掛程式 - Amazon EKS

協助改進此頁面

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

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

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

針對適用於 Amazon EKS Pod 的安全群組設定適用於 Kubernetes 的 Amazon VPC CNI 外掛程式

若您將 Pod 與 Amazon EC2 執行個體配合使用,則需針對安全群組設定適用於 Kubernetes 的 Amazon VPC CNI 外掛程式

若您僅使用 Fargate Pod,且叢集中沒有任何 Amazon EC2 節點,請參閱 使用適用於 Amazon EKS Pod 的安全群組政策

  1. 使用下列命令檢查您目前適用於 Kubernetes 的 Amazon VPC CNI 外掛程式版本:

    kubectl describe daemonset aws-node --namespace kube-system | grep amazon-k8s-cni: | cut -d : -f 3

    範例輸出如下。

    v1.7.6

    若適用於 Kubernetes 的 Amazon VPC CNI 外掛程式版本早於 1.7.7,則請將外掛程式更新至 1.7.7 版或更新版本。如需詳細資訊,請參閱使用 Amazon VPC CNI 將 IP 指派給 Pod

  2. 新增 AmazonEKSVPCResourceController 受管 IAM 政策至與您的 Amazon EKS 叢集關聯的叢集角色。此政策允許角色管理網路介面、其私有 IP 地址以及其與網路執行個體之間的連接和分離。

    1. 擷取叢集 IAM 角色的名稱,並存放在變數中。使用您叢集的名稱取代 my-cluster

      cluster_role=$(aws eks describe-cluster --name my-cluster --query cluster.roleArn --output text | cut -d / -f 2)
    2. 將政策連接到角色。

      aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController --role-name $cluster_role
  3. 藉由將 ENABLE_POD_ENI 變數設定為 aws-node DaemonSet 中的 true,啟用 Amazon VPC CNI 附加程式來管理 Pod 的網路介面。一旦此設定設定為 true,對於叢集中的每個節點,該附加元件會建立一個 cninode 自訂資源。VPC 資源控制器會建立並連接一個稱為幹線網路介面與描述 aws-k8s-trunk-eni 的特殊網路介面。

    kubectl set env daemonset aws-node -n kube-system ENABLE_POD_ENI=true
    注意

    幹線網路介面包含在執行個體類型所支援的最大網路介面數量中。如需每種執行個體類型所支援的介面數量上限的清單,請參閱 Amazon EC2 使用者指南中的每種執行個體類型每個網路介面的 IP 位址。如果您的節點已經連接到標準網路介面的最大數量,那麼 VPC 資源控制器將保留一個空間。您將不得不縮減正在執行的 Pod 的規模,以便控制器分開並刪除標準網路介面,建立幹線網路介面,並將其連接到執行個體。

  4. 您可以使用以下命令查看您的哪些節點擁有 CNINode 自訂資源。如果傳回 No resources found,則等待幾秒鐘後再重試一次。上一步驟要求重新啟動適用於 Kubernetes Pod 的 Amazon VPC CNI 外掛程式,這需要幾秒鐘的時間。

    kubectl get cninode -A NAME FEATURES ip-192-168-64-141.us-west-2.compute.internal [{"name":"SecurityGroupsForPods"}] ip-192-168-7-203.us-west-2.compute.internal [{"name":"SecurityGroupsForPods"}]

    如果您使用的 VPC CNI 版本低於 1.15,則會使用節點標籤而非 CNINode 自訂資源。您可以使用以下命令查看您的哪些節點已將節點標籤 aws-k8s-trunk-eni 設定為 true。如果傳回 No resources found,則等待幾秒鐘後再重試一次。上一步驟要求重新啟動適用於 Kubernetes Pod 的 Amazon VPC CNI 外掛程式,這需要幾秒鐘的時間。

    kubectl get nodes -o wide -l vpc.amazonaws.com/has-trunk-attached=true

    一旦建立幹線網路介面,Pod 就可以從幹線或標準網路介面指派次要 IP 位址。如果刪除節點,則會自動刪除幹線介面。

    當您在稍後的步驟中為 Pod 部署安全群組時,VPC 資源控制器會建立稱為分支網路介面aws-k8s-branch-eni 的描述,並將安全群組與其關聯。除了連接至節點的標準和幹線網路介面之外,還會建立分支網路介面。

    如果您使用的是存活或整備探查,則還需要停用 TCP 早期的 demux,以便 kubelet 可以透過 TCP 連接到分支網路介面上的 Pod。若要停用 TCP 早期的 demux,請執行下列命令:

    kubectl patch daemonset aws-node -n kube-system \ -p '{"spec": {"template": {"spec": {"initContainers": [{"env":[{"name":"DISABLE_TCP_EARLY_DEMUX","value":"true"}],"name":"aws-vpc-cni-init"}]}}}}'
    注意

    若您使用的是適用於 Kubernetes 附加元件的 Amazon VPC CNI 外掛程式 1.11.0 版或更新版本,並設定 POD_SECURITY_GROUP_ENFORCING_MODE=standard,如下一個步驟所述,則不需要執行之前的命令。

  5. 若您的叢集使用 NodeLocal DNSCache,或者您希望將 Calico 網路政策與具有自己的安全群組的 Pod 搭配使用,或者您的 Kubernetes 服務類型為 NodePortLoadBalancer,其使用的執行個體目標中您欲指派安全群組的 Pod 的 externalTrafficPolicy 設定為 Local,則必須使用適用於 Kubernetes 附加元件的 Amazon VPC CNI 外掛程式 1.11.0 版或更新版本,且必須啟用下列設定:

    kubectl set env daemonset aws-node -n kube-system POD_SECURITY_GROUP_ENFORCING_MODE=standard

    重要事項:Pod 安全群組規則不會套用至介於 Pod 之間或介於 Pod 與服務之間的流量,例如位於同一個節點上的 kubeletnodeLocalDNS。在相同節點上使用不同安全群組的 Pod 無法進行通訊,這是因為它們在不同子網路中設定,且這些子網路之間已停用路由。來自 Pod 的傳出流量傳輸到 VPC 外部的地址是轉換為執行個體主要網路介面的 IP 位址的網路地址 (除非您還設定了 AWS_VPC_K8S_CNI_EXTERNALSNAT=true)。對於此流量,將使用主要網路介面的安全群組中的規則,而不是使用 Pod 安全群組中的規則。** 若要將此設定套用至現有的 Pod,您必須重新啟動 Pod 或 Pod 正在執行之節點。

  6. 如需了解如何使用適用於 Pod 的安全群組政策,請參閱 使用適用於 Amazon EKS Pod 的安全群組政策