为 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 使用安全组策略。
-
使用以下命令查看您当前的 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 -
将 AmazonEKSVPCResourceController
托管 IAM 策略添加到与您的 Amazon EKS 集群关联的集群角色。策略允许角色管理网络接口、网络接口的私有 IP 地址以及与网络实例之间的连接和分离。 -
检索您的集群 IAM 角色的名称,然后将其存储在一个变量中。将
my-cluster
替换为您的集群的名称。cluster_role=$(aws eks describe-cluster --name my-cluster --query cluster.roleArn --output text | cut -d / -f 2)
-
将 策略附加到该角色。
aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController --role-name $cluster_role
-
-
通过在
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,以便控制器足以分离和删除标准网络接口、创建中继网络接口并将其附加到实例。
-
您可以使用以下命令查看哪些节点具有
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
,如下一步所述,则您就不需要运行上一个命令。 -
如果您的集群使用
NodeLocal DNSCache
,或者您想将 Calico 网络策略与拥有自己的安全组的 Pods 配合使用,或者您有NodePort
和LoadBalancer
类型的 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 之间之外的流量,例如
kubelet
或nodeLocalDNS
。在同一节点上使用不同安全组的容器组(pod)无法通信,因为它们配置在不同的子网中,且这些子网之间的路由被禁用。从 Pods 到 VPC 以外的地址的出站流量是转换为实例的主网络接口的 IP 地址的网络地址(除非您还设置了AWS_VPC_K8S_CNI_EXTERNALSNAT=true
)。对于此流量,将使用主网络接口的安全组中的规则,而不是 Pod’s 安全组中的规则。** 要将此设置应用于现有 Pods,必须重新启动 Pods 在其上运行的 Pods 或节点。 -
要了解如何为您的 Pod 使用安全组策略,请参阅 对 Amazon EKS Pod 使用安全组策略。