为 Amazon EKS Pods 的安全组配置 Amazon VPC CNI plugin for Kubernetes - Amazon EKS

为 Amazon EKS Pods 的安全组配置 Amazon VPC CNI plugin for Kubernetes

如果您将 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. 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. 通过在 aws-node DaemonSet 中将 ENABLE_POD_ENI 变量设置为 true,启用 Amazon VPC CNI 附加组件来管理 Pods 的网络接口。此设置一旦设置为 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 容器组(pod),这需要几秒钟的时间。

    $ 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"}]

    如果您使用的是早于 1.15 的 VPC CNI 版本,则使用节点标签代替 CNINode 自定义资源。您可以使用以下命令查看哪些节点的节点标签 aws-k8s-trunk-eni 设置为 true。如果返回 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 早期解复用器,以便 kubelet 可以使用 TCP 连接到分支网络接口上的 Pods。要禁用 TCP 早期解复用器,请运行以下命令:

    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 附加组件并设置 POD_SECURITY_GROUP_ENFORCING_MODE=standard,如下一步所述,则您就不需要运行上一个命令。

  5. 如果您的集群使用 NodeLocal DNSCache,或者您想将 Calico 网络策略与拥有自己的安全组的 Pods 配合使用,或者您有 NodePortLoadBalancer 类型的 Kubernetes 服务,将 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

    重要提示: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 使用安全组策略