設定 Amazon VPC CNI plugin for Kubernetes 適用於 Amazon EKS 的安全群組 Pods - Amazon EKS

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

設定 Amazon VPC CNI plugin for Kubernetes 適用於 Amazon EKS 的安全群組 Pods

如果您使用 Pods 使用 Amazon EC2 執行個體時,您需要設定 Amazon VPC CNI plugin for Kubernetes 適用於安全群組

如果您使用 Fargate Pods 僅限 ,而且叢集中沒有任何 Amazon EC2 節點,請參閱 使用 Amazon EKS 的安全群組政策 Pod

  1. 檢查您目前的 Amazon VPC CNI plugin for Kubernetes 具有下列命令的 版本:

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

    範例輸出如下。

    v1.7.6

    如果您的 Amazon VPC CNI plugin for Kubernetes 版本早於 1.7.7,然後將外掛程式更新至版本 1.7.7 或更新版本。如需詳細資訊,請參閱 Amazon VPC CNI

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

    1. 擷取叢集 IAM 角色的名稱,並將其存放在變數中。Replace (取代) 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. 啟用 Amazon VPC CNI 附加元件來管理 的網路介面 Pods 透過在 true中將ENABLE_POD_ENI變數設定為 aws-node DaemonSet。 一旦此設定設定為 true,則針對叢集中的每個節點,附加元件會建立cninode自訂資源。VPC 資源控制器會建立並連接一個特殊網路介面,稱為說明 的中繼網路介面aws-k8s-trunk-eni

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

    幹線網路介面包含在執行個體類型所支援的最大網路介面數量中。如需每個執行個體類型支援的最大網路介面數量清單,請參閱 Amazon EC2 使用者指南中的每個執行個體類型每個網路介面的 IP 地址。如果您的節點已連接最大數量的標準網路介面,則 VPC 資源控制器將保留空間。您必須縮減執行中的規模 Pods 足以讓控制器分離和刪除標準網路介面、建立主幹網路介面,並將其連接至執行個體。

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

    $ 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自訂資源。您可以使用true下列命令查看哪些節點的節點標籤aws-k8s-trunk-eni設定為 。如果傳回 No resources found,則等待幾秒鐘後再重試一次。上一個步驟需要重新啟動 Amazon VPC CNI plugin for Kubernetes Pods,這需要幾秒鐘的時間。

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

    建立中繼線網路介面後,Pods 從主幹或標準網路介面指派次要 IP 地址。如果刪除節點,則會自動刪除幹線介面。

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

    如果您使用的是即時或整備探查,則還需要停用 TCP early demux,以便 kubelet可以連線至 Pods 使用 TCP 在分支網路介面上。若要停用 TCP early 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"}]}}}}'
    注意

    如果您使用的是 1.11.0或更新版本的 Amazon VPC CNI plugin for Kubernetes 附加元件和 set POD_SECURITY_GROUP_ENFORCING_MODE=standard,如下一個步驟所述,您不需要執行上一個命令。

  5. 如果您的叢集使用 NodeLocal DNSCache,或您想要使用 Calico 網路政策搭配您的 Pods 擁有自己的安全群組,或者您有 Kubernetes 類型 NodePort和 的 服務LoadBalancer使用執行個體目標,並將 externalTrafficPolicy Local 設定為 Pods 要指派安全群組給 ,則您必須使用 或更新版本1.11.0的 Amazon VPC CNI plugin for Kubernetes 附加元件,您必須啟用下列設定:

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

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

  6. 若要了解如何將安全群組政策用於您的 Pod,請參閱使用 Amazon EKS 的安全群組政策 Pod