CNI 自定义网络 - Amazon EKS

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

CNI 自定义网络

默认情况下,在为 Pod 分配新的网络接口时,ipamD使用节点主网络接口的安全组和子网。您可能希望您的 Pod 在控制层面安全组所在的 VPC 中使用不同的安全组或子网。例如:

  • 子网中可用 IP 地址的数量是有限的。这可能会限制可在集群中创建的 Pod 的数量。对 Pod 使用不同的子网将允许您增加可用 IP 地址的数量。

  • 出于安全原因,您必须使用与节点的主网络接口不同的安全组或子网。

  • 节点在公有子网中配置,并且您希望使用 NAT 网关将 Pod 放在私有子网中。有关更多信息,请参阅 外部源网络地址转换 (SNAT)

注意
  • 您可以为自行管理的节点组或者为使用启动使用自定义 AMI 的模板。本主题中的步骤要求适用于 Kubernetes 的 Amazon VPC CNI 插件版本 1.4.0 或更高版本。要检查您的 CNI 版本,并在必要时进行更新,请参阅手动更新亚马逊 VPC CNI 加载项

  • 启用自定义网络将从使用它的每个节点中有效地删除可用网络接口(及其针对 Pod 的所有可用 IP 地址)。启用自定义网络时,节点的主网络接口不用于 Pod 放置。

  • 本主题中的过程指示 CNI 插件将不同的安全组与辅助网络接口关联,而不是与实例中的主网络接口相关联。使用辅助网络接口的所有窗格仍将共享使用辅助网络接口,并且都将使用相同的安全组。如果要为单个窗格分配不同的安全组,则可以使用窗格的安全组。容器的安全组会创建额外的网络接口,每个接口都可以分配一个唯一的安全组。窗格的安全组可以与或不使用自定义网络连接一起使用。

配置 CNI 自定义网络

  1. 将辅助 CIDR 块与您集群的 VPC 关联。有关更多信息,请参阅 。将辅助 IPv4 CIDR 块与 VPC 关联中的Amazon VPC 用户指南

  2. 使用您的辅助 CIDR 块在您的 VPC 中为每个可用区创建子网。您的自定义子网必须与您的节点启动到的子网来自不同的 VPC CIDR 块。有关更多信息,请参阅 。在 VPC 中创建子网中的Amazon VPC 用户指南

  3. AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG 环境变量设置为 aws-node DaemonSet 中的 true

    kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
  4. 查看当前安装的 CNI 版本。

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

    输出:

    amazon-k8s-cni:1.7.x
  5. 如果您安装了版本 1.3 或更高版本的 CNI,则可以跳到步骤 6。为集群定义新的 ENIConfig 自定义资源。

    1. 创建一个名为 ENIConfig.yaml 的文件,并将以下内容粘贴到该文件中:

      apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: eniconfigs.crd.k8s.amazonaws.com spec: scope: Cluster group: crd.k8s.amazonaws.com version: v1alpha1 names: plural: eniconfigs singular: eniconfig kind: ENIConfig
    2. 使用以下命令将该文件应用于集群:

      kubectl apply -f ENIConfig.yaml
  6. 为您希望在其中安排 Pod 的每个子网创建 ENIConfig 自定义资源。

    1. 为每个网络接口配置创建一个唯一的文件。每个文件必须包含以下内容,具有唯一值的name。我们强烈建议使用name,因为这样可以简化多可用区 Auto Scaling 组的部署(请参阅下面的步骤 6c)。

      在此示例中,将创建一个名为 us-west-2a.yaml 的文件。将替换为<example values>(包括<>) 用于namesubnet, 和securityGroups使用您自己的值。在此示例中,我们遵循最佳实践,并将name到子网所在的可用区。如果您没有要为 Pod 附加的特定安全组,您可以暂时将该值留空。然后,您将在 ENIConfig 中指定节点安全组。

      apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: <us-west-2a> spec: securityGroups: - <sg-0dff111a1d11c1c11> subnet: <subnet-011b111c1f11fdf11>
      注意
      • 子网和安全组的每个组合均需要有自己的自定义资源。如果您在同一可用区中有多个子网,请使用以下命令使用匹配的配置名称为每个子网中的节点注释。

        kubectl annotate node <node-name>.<region>.compute.internal k8s.amazonaws.com/eniConfig=<subnet1ConfigName>
      • 如果您未为 VPC 指定有效的安全组,VPC 的默认安全组将分配给辅助 ENI。

    2. 使用以下命令将您创建的每个自定义资源文件应用于您的集群:

      kubectl apply -f <us-west-2a>.yaml
    3. (可选,但建议用于多可用区节点组)默认情况下,Kubernetes 将节点的可用区应用于failure-domain.beta.kubernetes.io/zone标签。如果您命名了ENIConfig您可以使用 VPC 中的每个可用区后的自定义资源,如步骤 6a 中所建议,那么就可以让 Kubernetes 自动应用对应的ENIConfig对于节点的可用区,使用以下命令。

      kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=failure-domain.beta.kubernetes.io/zone
      注意

      确保对于 ENI_CONFIG_ANNOTATION_DEF 环境变量具有键 k8s.amazonaws.com/eniConfig 的注释不存在于 aws-node 守护进程集的容器规范中。如果存在,它会覆盖 ENI_CONFIG_LABEL_DEF 值,而应被删除。您可以检查是否使用 kubectl describe daemonset aws-node -n kube-system | grep ENI_CONFIG_ANNOTATION_DEF 命令设置了此变量。如果没有返回输出,则未设置此变量。

  7. 创建新的自行管理的节点组。对于托管节点组,请将自定义 AMI 与启动模板

    1. 使用以下公式确定每个节点上可以计划的最大 Pod 数。

      maxPods = (number of interfaces - 1) * (max IPv4 addresses per interface - 1) + 2

      例如,m5.large实例类型支持三个网络接口,每个接口有 10 个 IPv4 地址。将值代入到公式中,实例最多可支持 20 个 Pod,如以下计算所示。

      maxPods = (3 - 1) * (10 - 1) + 2 = 20

      有关每种实例类型的最大网络接口数的更多信息,请参阅每种实例类型的每个网络接口的 IP 地址数中的适用于 Linux 实例的 Amazon EC2 用户指南

    2. 自托管节点启动自我管理的亚马逊 Linux 节点创建新的自我管理节点组。不要指定您在ENIConfig您部署的资源。打开 AWS CloudFormation 模板后,按照说明中所述输入值。对于 BootstrapArguments 字段,输入以下值。

      --use-max-pods false --kubelet-extra-args '--max-pods=<20>'
  8. 创建节点组后,记录为子网创建的安全组并将安全组应用到关联的ENIConfig。编辑每个ENIConfig使用以下命令,将替换为<eniconfig-name>与您的价值:

    kubectl edit eniconfig.crd.k8s.amazonaws.com/<eniconfig-name>

    如果您遵循步骤 6a 和 6c 中的最佳实践,则eniconfig-name对应于可用区域名称。

    spec 节应如下所示:

    spec: securityGroups: - <sg-0dff222a2d22c2c22> subnet: <subnet-022b222c2f22fdf22>
  9. 如果在切换到自定义 CNI 网络功能之前,您的群集中有任何运行 Pods 的节点,则应该封锁并耗尽节点以优雅地关闭 Pods,然后终止节点。只有向k8s.amazonaws.com/eniConfig标签使用自定义网络功能。