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

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

窗格的安全组

面向窗格的安全组将 Amazon EC2 安全组与库贝内特窗格集成在一起。您可以使用 Amazon EC2 安全组定义允许入站和出站网络流量往返于您部署到许多 Amazon EC2 实例类型和 Fargate 上运行的节点的容器的规则。有关此功能的详细说明,请参阅介绍窗格的安全组博客帖子。

Considerations

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

  • 您的亚马逊 EKS 集群必须运行库贝内特版本 1.17 和亚马逊 EKS 平台版本eks.3或更高版本. 您不能将安全组用于部署到 Amazon EC2 的 Kubernetes 集群上的容器。

  • 与关联的安全组相关的容器之间的流量不受印花布网络策略强制执行,并且仅限于 Amazon EC2 安全组强制执行。社区正在努力消除这一限制。

  • 您只能对运行窗格的窗格使用安全组AmazonFargate如果您的集群是平台版本为 1.18eks.7或更高版本,1.19 与平台版本eks.5或更高版本,或 1.20 或更高版本。

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

  • 窗格的安全组受大多数Nitro 基Amazon EC2 实例系列,包括m5c5r5p3m6gc6g, 和r6g实例系列。这些区域有:t3实例系列不受支持。有关受支持实例的完整列表,请参阅Amazon EC2 支持的实例和分支网络接口。您的节点必须是受支持的实例类型之一。

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

  • 库贝内特服务类型NodePortLoadBalancer将实例目标与externalTrafficPolicy设置为Local不支持您为其分配安全组的窗格。有关将负载均衡器与实例目标一起使用的更多信息,请参阅。Amazon EKS 上的网络负载均衡

  • 如果您还使用容器安全策略来限制对容器变异的访问,那么eks-vpc-resource-controllervpc-resource-controllerKubernetes 服务帐户必须在库贝内特语中指定ClusterRoleBinding用于Role,您的psp分配给。如果您使用的是默认 Amazon EKSpsp、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
  • 如果您使用的是自定义网络和窗格的安全组一起使用,则使用安全组为容器指定的安全组,而不是ENIconfig

  • 使用安全组的窗格必须包含terminationGracePeriodSeconds在他们的荚规范中。这是因为 Amazon EKS VPC CNI 插件会在删除主机上的容器网络之前查询 API 服务器以检索容器 IP 地址。如果没有此设置,插件将不会删除主机上的 pod 网络。

为容器部署安全组

部署窗格的安全组

  1. 如果您仅将安全组用于 Fargate 窗格,并且集群中没有任何 Amazon EC2 节点,请跳到步骤 4。使用以下命令查看您当前的 CNI 插件版本。

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

    输出类似于以下输出。

    amazon-k8s-cni:<1.7.7>

    如果您的 CNI 插件版本早于 1.7.7,请将您的 CNI 插件更新到 1.7.7 或更高版本。有关更多信息,请参阅 更新 Amazon VPC CNI Amazon EKS 附加组件

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

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/AmazonEKSVPCResourceController \ --role-name <eksClusterRole>
  3. 启用 CNI 插件来管理容器的网络接口,方法是设置ENABLE_POD_ENI将变量为true中的aws-nodeDaemonSet。将此设置设置为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
    注意

    中继网络接口包含在实例类型支持的最大网络接口数中。有关每种实例类型支持的最大接口数的列表,请参阅每种实例类型的每个网络接口的 IP 地址数中的适用于 Linux 实例的 Amazon EC2 用户指南。如果您的节点已经连接到最大数量的标准网络接口,则 VPC 资源控制器将保留一个空间。您将不得不缩小您的运行容器,以便控制器分离和删除标准网络接口、创建中继网络接口并将其附加到实例。

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

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

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

    当您在后面的步骤中为容器部署安全组时,VPC 资源控制器会创建一个名为分支网络接口(包含描述)aws-k8s-branch-eni并将安全组与其关联。除了连接到节点的标准网络接口和中继网络接口之外,还创建分支网络接口。如果您使用的是活动探测或准备探测器,还需要禁用 TCP 早期解复用器,以便kubelet可以通过 TCP 连接到分支网络接口上的容器。要禁用 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 EKSSecurityGroupPolicy添加到您的集群。

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

      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,您将看到一条类似于以下内容的错误消息:An error occurred (InvalidSecurityGroupID.NotFound) when calling the CreateNetworkInterface operation: The securityGroup ID '<sg-abc123>' does not exist

      • 安全组必须允许来自群集安全组的入站通信(kubelet)通过您已为其配置探测器的任何端口。

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

      • 如果您在 Fargate 中使用安全组策略,请确保您的安全组具有允许窗格与 Kubernetes 控制平面通信的规则。执行此操作的最简单方法是将群集安全组指定为其中一个安全组。

    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 my-security-group-policy.yaml
      注意
      • 如果您的窗格卡在Waiting状态,你会看到Insufficient permissions: Unable to create Elastic Network Interface.在描述容器时,请确认您已在上一步中将 IAM 策略添加到 IAM 集群角色。

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

      如果您运行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 的最大数量。有关可在每种实例类型上运行的容器的最大数量的列表,请参阅eni-max-pods.txt(位于 GitHub 上)。当您删除具有关联安全组的容器或删除运行该容器的节点时,VPC 资源控制器将删除分支网络接口。如果您使用安全组的容器删除带有窗格的集群,则控制器不会删除分支网络接口,因此您需要自行删除它们。

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

下表列出了您可以与每种受支持的 Amazon EC2 实例类型一起使用的分支网络接口的数量。

实例类型 分支网络接口
a1.medium 10
a1.large 9
a1.xlarge 18
a1.2xlarge 38
a1.4xlarge 54
a1.metal 54
c5.large 9
c5.xlarge 18
c5.2xlarge 38
c5.4xlarge 54
c5.9xlarge 54
c5.12 x 大 54
c5.18xlarge 107
c5.24xlarge 107
c5.metal 107
c5a.大号 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. 金属 107
c6g 4
c6g 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. 金属 107
i3 英寸 5
i3en.xlarge 12
i3en.2xlarge 28
i3en.3xlarge 38
i3en.6xlarge 54
i3en.12xlarge 114
i3en.24xlarge 107
金属 107
Inf1.xlarge 38
英寸 1.2 倍大 38
不超过 1.6 倍 54
小于 1.24 倍 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
M5 分钟。大 9
m5dn.xlarge 18
m5dn.2xlarge 38
m5dn.4xlarge 54
m5dn.8xlarge 54
m5dn.12xlarge 54
m5dn.16xlarge 107
m5dn.24xlarge 107
M5。大 9
M5n.xlarge 18
m5n.2xlarge 38
m5n.4xlarge 54
m5n.8xlarge 54
m5n.12xlarge 54
m5n.16xlarge 107
m5n.24xlarge 107
毫克 4
毫米 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
r5 分钟。大 9
R5dn.xlarge 18
r5dn.2xlarge 38
r5dn.4xlarge 54
r5dn.8xlarge 54
r5dn.12xlarge 54
r5dn.16xlarge 107
r5dn.24xlarge 107
r5n。大 9
r5n.xlarge 18
r5n.2xlarge 38
r5n.4xlarge 54
r5n.8xlarge 54
r5n.12xlarge 54
r5n.16xlarge 107
r5n.24xlarge 107
r6g. 4
r6g 9
r6g.xlarge 18
r6g.2xlarge 38
r6g.4xlarge 54
r6g.8xlarge 54
r6g.12xlarge 54
r6g.16xlarge 107
z1d. 大 13
z1d.xlarge 28
z1d.2xlarge 58
z1d.3xlarge 54
z1d.6xlarge 54
z1d.12xlarge 107
z1d.metal 107