Pod 的安全组 - Amazon EKS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Pod 的安全组

Pod 的安全组将 Amazon EC2 安全组与 Kubernetes Pod 集成。您可以使用 Amazon EC2 安全组来定义规则,这些规则允许与许多 Amazon EC2 实例类型上运行的节点相部署的 Pod 之间的入站和出站网络流量。有关此功能的详细说明,请参阅 Pod 安全组简介博客文章。

Considerations

在为 Pod 部署安全组之前,请考虑以下限制和条件:

  • 您的 Amazon EKS 集群必须运行 Kubernetes 版本 1.17 和 Amazon EKS 平台版本 eks.3 或更高版本。您不能对部署到 Amazon EC2 的 Kubernetes 集群上的 Pod 使用安全组。

  • 与安全组关联的 Pod 之间的流量不会被限制为 Calico network policy (校准网络策略) 执行,而仅限于 Amazon EC2 安全组执行。社区正在消除此限制。

  • Pod 的安全组不能与部署到 Fargate 的 Pod 一起使用。

  • Pod 的安全组不能与 Windows 节点一起使用。

  • 大多数基于 Nitro 的 实例系列(包括 Amazon EC2、m5c5r5p3m6gc6gr6g 实例系列)支持 Pod 的安全组。实例系列不受支持。t3有关支持的实例的完整列表,请参阅Amazon EC2 支持的实例和分支网络接口。您的节点必须是受支持的实例类型之一。

  • 源 NAT 对来自具有已分配安全组的 Pod 的出站流量禁用,以便应用出站安全组规则。要访问 Internet,必须在使用 NAT 网关或实例配置的私有子网中部署的节点上启动带有已分配安全组的 Pod。具有部署到公有子网的安全组的 Pod 无法访问 Internet。

  • 对于将安全组分配到的 Pod,不支持使用设置为 NodePortLoadBalancer 的实例目标支持类型为 externalTrafficPolicyLocal 的 Kubernetes 服务。有关将负载均衡器与实例目标结合使用的更多信息,请参阅负载均衡器 – 实例目标

  • 如果您还使用 Pod 安全策略来限制对 Pod 更改的访问,则必须在 Kubernetes eks-vpc-resource-controller 中为 vpc-resource-controller 分配到的 ClusterRoleBinding 指定 Rolepsp Kubernetes 服务账户。如果您使用的是默认 Amazon EKS psp、Role 和 ClusterRoleBinding ,则这是 eks:podsecuritypolicy:authenticated ClusterRoleBinding。例如,您应将服务账户添加到 subjects: 部分,如以下示例所示:

    ... subjects: - kind: Group apiGroup: rbac.authorization.k8s.io name: system:authenticated - kind: ServiceAccount name: vpc-resource-controller - kind: ServiceAccount name: eks-vpc-resource-controller
  • 如果您将自定义网络和安全组用于 Pod,则使用由 Pod 安全组指定的安全组,而不是 ENIconfig 中指定的安全组。

部署 Pod 的安全组

为 Pod 部署安全组

  1. 使用以下命令检查您当前的 CNI 插件版本。

    kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2

    输出类似于以下输出。

    amazon-k8s-cni:<1.7.7>

    如果您的 CNI 插件版本低于 1.7.0,请将您的 CNI 插件升级到版本 1.7.0 或更高版本。有关更多信息,请参阅 Amazon VPC适用于 Kubernetes 的 CNI 插件升级.

  2. AmazonEKSVPCResourceController 托管策略添加到与您的 集群关联的集群角色Amazon EKS。策略允许该角色管理网络接口、其私有 IP 地址以及与实例之间的附加和分离。以下命令将策略添加到名为 <eksClusterRole> 的集群角色。

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController \ --role-name <eksClusterRole>
  3. 通过在 ENABLE_POD_ENI DaemonSet 中将 true 变量设置为 aws-node,启用 CNI 插件以管理 Pod 的网络接口。将此设置设置为 true 后,对于集群中的每个节点,该插件都会添加一个值为 vpc.amazonaws.com/has-trunk-attached=true 的标签。VPC 资源控制器创建并附加一个称为中继网络接口的特殊网络接口,其描述为 aws-k8s-trunk-eni

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

    中继网络接口包含在实例类型支持的最大网络接口数中。有关每种实例类型支持的最大接口数的列表,请参阅 https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI 中的每个实例类型的每个网络接口的 IP 地址Amazon EC2 用户指南(适用于 Linux 实例)。如果您的节点已附加最大数量的标准网络接口,则 VPC 资源控制器将预留空间。您必须缩小正在运行的 Pod,以使控制器能够分离和删除标准网络接口、创建中继网络接口并将其附加到实例。

    您可以使用以下命令查看哪些节点的 aws-k8s-trunk-eni 设置为 true

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

    创建中继网络接口后,可以从中继或标准网络接口为 Pod 分配辅助 IP 地址。如果删除节点,则中继接口会自动删除。

    当您在后面的步骤中为 Pod 部署安全组时,VPC 资源控制器会创建一个称为分支网络接口的特殊网络接口,其描述为 aws-k8s-branch-eni,并将安全组与之关联。除了附加到节点的标准和中继网络接口之外,还会创建分支网络接口。如果您使用的是实时探测器或就绪探测器,则还需要禁用 TCP 早期解复用,以便 kubelet 可以通过 TCP 连接到分支网络接口上的 Pod。要禁用 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"}]}}}}'
  4. 创建要将资源部署到的命名空间。

    kubectl create namespace <my-namespace>
  5. 将 Amazon EKS SecurityGroupPolicy 部署到您的集群。

    1. 将以下示例安全策略保存到名为 <my-security-group-policy.yaml> 的文件中。如果您希望根据服务账户标签选择 Pod,则可以将 podSelector 替换为 serviceAccountSelector。您必须指定一个或另一个选择器。如果为空 podSelector(示例:podSelector: {}),则选择命名空间中的所有 Pod。如果为空,则选择命名空间中的所有服务账户。serviceAccountSelector您必须为 groupIds 指定 1-5 个安全组 ID。如果您指定多个 ID,则所有安全组中的所有规则的组合对所选 Pod 有效。

      apiVersion: vpcresources.k8s.aws/v1beta1 kind: SecurityGroupPolicy metadata: name: <my-security-group-policy> namespace: <my-namespace> spec: <podSelector>: matchLabels: <role>: <my-role> securityGroups: groupIds: - <sg-abc123>
      重要
      • 您在策略中指定的安全组必须存在。如果它们不存在,则当您部署与选择器匹配的 pod 时,您的 pod 仍会在创建过程中卡住。如果您描述 pod,您将看到类似于以下内容的错误消息:An error occurred (InvalidSecurityGroupID.NotFound) when calling the CreateNetworkInterface operation: The securityGroup ID '<sg-abc123>' does not exist

      • 安全组必须允许从集群安全组(对于 kubelet)通过已配置探测器的任何端口进行入站通信。

      • 安全组必须允许通过 TCP 和 UDP 端口 53 与集群安全组(对于 CoreDNS)进行出站通信。集群安全组还必须允许来自与 Pod 关联的所有安全组的入站 TCP 和 UDP 端口 53 通信。

    2. 部署策略。

      kubectl apply -f <my-security-group-policy.yaml>
  6. 使用与您在上一步中指定的 <my-role><podSelector> 值匹配的标签部署示例应用程序。

    1. 将以下内容保存到文件中。

      apiVersion: apps/v1 kind: Deployment metadata: name: <my-deployment> namespace: <my-namespace> labels: app: <my-app> spec: replicas: <1> selector: matchLabels: app: <my-app> template: metadata: labels: app: <my-app> role: <my-role> spec: containers: - name: <my-container> image: <my-image> ports: - containerPort: <80>
    2. 使用以下命令部署应用程序。当您部署应用程序时,CNI 插件与 role 标签匹配,并且您在上一步中指定的安全组将应用于 Pod。

      kubectl apply -f <file-name-you-used-in-previous-step.yaml>
      注意
      • 如果您的 Pod 停滞在 Waiting 状态,并且在描述 Pod 时看到 Insufficient permissions: Unable to create Elastic Network Interface.,请确认您在上一步中已将 IAM 策略添加到 IAM 集群角色。

      • 如果您的 Pod 停滞在 Pending 状态,请确认您的节点实例类型在 Amazon EC2 支持的实例和分支网络接口 中列出,并且实例类型支持的最大分支网络接口数乘以节点组中节点数的尚未满足。例如,m5.large 实例支持九个分支网络接口。如果您的节点组有五个节点,则最多可为节点组创建 45 个分支网络接口。您尝试部署的第 46 个 Pod 将处于 Pending 状态,直到删除具有关联安全组的另一个 Pod。

      如果您运行 kubectl describe pod <my-deployment-xxxxxxxxxx-xxxxx> -n <my-namespace> 并看到类似于以下消息的消息,则可以安全地忽略它。当 CNI 插件尝试设置主机联网时,将会出现此消息;当网络接口正在创建时,将会出现此消息。CNI 插件将记录此事件,直到创建了网络接口。

      Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "<e24268322e55c8185721f52df6493684f6c2c3bf4fd59c9c121fd4cdc894579f>" network for pod "<my-deployment-59f5f68b58-c89wx>": networkPlugin cni failed to set up pod "<my-deployment-59f5f68b58-c89wx_my-namespace>" network: add cmd: failed to assign an IP address to container

      不能超过实例类型上可以运行的最大 Pod 数。有关可以在每个实例类型上运行的最大 Pod 数的列表,请参阅 GitHub 上的 eni-max-pods.txt。当您删除具有关联安全组的 Pod 时,或删除运行 Pod 的节点时,VPC 资源控制器会删除分支网络接口。如果您删除带有 Pod 的集群,并使用 Pod 作为安全组,则控制器不会删除分支网络接口,因此您需要自行删除它们。

Amazon EC2 支持的实例和分支网络接口

下表列出了可用于每种受支持的 Amazon EC2 实例类型的分支网络接口的数量。

实例类型 分支网络接口
a1.medium 10
a1.large 9
a1.xlarge 18
a1.2xlarge 38
a1.4xlarge 54
a1.金属 54
c5.large 9
c5.xlarge 18
c5.2xlarge 38
c5.4xlarge 54
c5.9xlarge 54
c5.12xlarge 54
c5.18xlarge 107
c5.24xlarge 107
c5.金属 107
c5a.large 9
c5a.xlarge 18
c5a.2xlarge 38
c5a.4xlarge 54
c5a.8xlarge 54
c5a.12xlarge 54
c5a.16xlarge 107
c5a.24xlarge 107
c5d.large 9
c5d.xlarge 18
c5d.2xlarge 38
c5d.4xlarge 54
c5d.9xlarge 54
c5d.12xlarge 54
c5d.18xlarge 107
c5d.24xlarge 107
c5d.金属 107
c5n.large 9
c5n.xlarge 18
c5n.2xlarge 38
c5n.4xlarge 54
c5n.9xlarge 54
c5n.18xlarge 107
c5n.metal 107
c6g.medium 4
c6g.large 9
c6g.xlarge 18
c6g.2xlarge 38
c6g.4xlarge 54
c6g.8xlarge 54
c6g.12xlarge 54
c6g.16xlarge 107
c6g.金属 107
g4dn.xlarge 39
g4dn.2xlarge 39
g4dn.4xlarge 59
g4dn.8xlarge 58
g4dn.12xlarge 54
g4dn.16xlarge 118
g4dn.metal 107
i3en.large 5
i3en.xlarge 12
i3en.2xlarge 28
i3en.3xlarge 38
i3en.6xlarge 54
i3en.12xlarge 114
i3en.24xlarge 107
i3en.metal 107
inf1.xlarge 38
inf1.2xlarge 38
inf1.6xlarge 54
inf1.24xlarge 107
m5.large 9
m5.xlarge 18
m5.2xlarge 38
m5.4xlarge 54
m5.8xlarge 54
m5.12xlarge 54
m5.16xlarge 107
m5.24xlarge 107
m5.metal 107
m5a.large 9
m5a.xlarge 18
m5a.2xlarge 38
m5a.4xlarge 54
m5a.8xlarge 54
m5a.12xlarge 54
m5a.16xlarge 107
m5a.24xlarge 107
m5ad.large 9
m5ad.xlarge 18
m5ad.2xlarge 38
m5ad.4xlarge 54
m5ad.8xlarge 54
m5ad.12xlarge 54
m5ad.16xlarge 107
m5ad.24xlarge 107
m5d.large 9
m5d.xlarge 18
m5d.2xlarge 38
m5d.4xlarge 54
m5d.8xlarge 54
m5d.12xlarge 54
m5d.16xlarge 107
m5d.24xlarge 107
m5d.metal 107
m5dn.large 9
m5dn.xlarge 18
m5dn.2xlarge 38
m5dn.4xlarge 54
m5dn.8xlarge 54
m5dn.12xlarge 54
m5dn.16xlarge 107
m5dn.24xlarge 107
m5n.large 9
m5n.xlarge 18
m5n.2xlarge 38
m5n.4xlarge 54
m5n.8xlarge 54
m5n.12xlarge 54
m5n.16xlarge 107
m5n.24xlarge 107
m6g.medium 4
m6g.large 9
m6g.xlarge 18
m6g.2xlarge 38
m6g.4xlarge 54
m6g.8xlarge 54
m6g.12xlarge 54
m6g.16xlarge 107
m6g.金属 107
p3.2xlarge 38
p3.8xlarge 54
p3.16xlarge 114
p3dn.24xlarge 107
r5.large 9
r5.xlarge 18
r5.2xlarge 38
r5.4xlarge 54
r5.8xlarge 54
r5.12xlarge 54
r5.16xlarge 107
r5.24xlarge 107
r5.metal 107
r5a.large 9
r5a.xlarge 18
r5a.2xlarge 38
r5a.4xlarge 54
r5a.8xlarge 54
r5a.12xlarge 54
r5a.16xlarge 107
r5a.24xlarge 107
r5ad.large 9
r5ad.xlarge 18
r5ad.2xlarge 38
r5ad.4xlarge 54
r5ad.8xlarge 54
r5ad.12xlarge 54
r5ad.16xlarge 107
r5ad.24xlarge 107
r5d.large 9
r5d.xlarge 18
r5d.2xlarge 38
r5d.4xlarge 54
r5d.8xlarge 54
r5d.12xlarge 54
r5d.16xlarge 107
r5d.24xlarge 107
r5d.metal 107
r5dn.large 9
r5dn.xlarge 18
r5dn.2xlarge 38
r5dn.4xlarge 54
r5dn.8xlarge 54
r5dn.12xlarge 54
r5dn.16xlarge 107
r5dn.24xlarge 107
r5n.large 9
r5n.xlarge 18
r5n.2xlarge 38
r5n.4xlarge 54
r5n.8xlarge 54
r5n.12xlarge 54
r5n.16xlarge 107
r5n.24xlarge 107
r6g.medium 4
r6g.large 9
r6g.xlarge 18
r6g.2xlarge 38
r6g.4xlarge 54
r6g.8xlarge 54
r6g.12xlarge 54
r6g.16xlarge 107
z1d.large 13
z1d.xlarge 28
z1d.2xlarge 58
z1d.3xlarge 54
z1d.6xlarge 54
z1d.12xlarge 107
z1d.metal 107