CNI 自定义网络 - Amazon EKS
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

CNI 自定义网络

预设情况下,在为 Pod 分配新的网络接口时,ipamD 将使用节点的主弹性网络接口的安全组和子网。您可能希望您的 Pod 使用与控制层面安全组所在同一个 VPC 中的其他安全组或子网。例如:

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

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

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

注意事项

  • 本主题中的程序需要适用于 Kubernetes 的 Amazon VPC CNI 插件 1.6.3-eksbuild.1 版或更高版本。

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

  • 本主题中的程序指示 Amazon VPC CNI 插件将不同的安全组与辅助网络接口关联,而不是与实例中的主网络接口相关联。使用辅助网络接口的所有 Pod 仍将共享使用辅助网络接口,并且都将使用相同的安全组。

    如果要为个别 Pod 分配不同的安全组,则可以使用 适用于 Pod 的安全组。适用于 Pod 的安全组会创建额外的网络接口,每个接口都可以分配有一个唯一的安全组。适用于 Pod 的安全组可以与自定义联网一起使用,也可以不一起使用。

  • 如果您创建的集群使用 IPv6 系列,则无法使用自定义联网。如果您打算使用自定义联网帮助缓解 IP 地址耗尽,您可以改用 IPv6。有关更多信息,请参阅 将 IPv6 地址分配给容器和服务

配置 CNI 自定义网络

  1. 确认您当前安装的 Amazon VPC CNI 插件版本为 1.6.3-eksbuild.1 或更高版本。

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

    输出:

    amazon-k8s-cni:1.6.3-eksbuild.1

    如果您的版本早于 1.6.3-eksbuild.1,则必须予以更新。想要了解更多信息,请参阅 管理 Amazon VPC CNI 附加组件 的更新部分。

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

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

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

    kubectl set env daemonset aws-node \ -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
  5. 为您希望在其中安排 Pod 的每个子网创建 ENIConfig 自定义资源。

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

      在此示例中,将创建一个名为 cn-north-1a.yaml 的文件。将示例值替换为您自己的值。在此示例中,我们遵循最佳实践,并将 name 的值设置为子网所在的可用区。如果您没有要为 Pod 附加的特定安全组,您可以暂时将该值留空。然后,您将在 ENIConfig 中指定节点安全组。

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

        kubectl annotate node \ node-name.region-code.compute.internal \ k8s.amazonaws.com/eniConfig=subnet1ConfigName
      • 如果您没有为 VPC 指定有效的安全组,并且您使用 1.8.0 版或更高版本的 VPC CNI 插件,则使用与该节点的主弹性网络接口关联的安全组。如果您使用 1.8.0 之前的插件版本,则 VPC 的默认安全组将分配给辅助弹性网络接口。

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

      kubectl apply -f cn-north-1a.yaml
    3. (可选,但建议用于多可用区节点组)预设情况下,Kubernetes 将节点的可用区应用于 topology.kubernetes.io/zone 标注。如果您以 VPC 中的每个可用区命名您的 ENIConfig 自定义资源,如步骤 5a 中所建议,则可以使用以下命令,让 Kubernetes 自动为节点的可用区应用对应的 ENIConfig

      kubectl set env daemonset aws-node \ -n kube-system ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone
      注意

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

  6. 如果您计划在没有启动模板的情况下部署托管节点组,或者采用您尚未在其中指定 AMI ID 的启动模板,请跳至步骤 7 并使用托管,没有启动模板或使用没有指定 AMI ID 的启动模板选项。托管节点组会自动为您计算最大容器组值。

    如果您正在部署自我管理的节点组或带有启动模板的托管节点组,且其启动模板已指定了 AMI ID,则必须确定 Amazon EKS 为节点推荐的最大容器组数量。按照 Amazon EKS 建议每种 Amazon EC2 实例类型的最大容器组数量 中的说明进行操作,将 --cni-custom-networking-enabled 添加到步骤 3。请记下输出的内容,以便在下一个步骤中使用。

  7. 创建以下一种类型的节点组。有关其他实例选择标准,请参阅 选择 Amazon EC2 实例类型。对于包含 20 的选项,将其替换为上一步的值(建议)或您自己的值。

    • 自行管理的节点组 – 按照 启动自行管理的 Amazon Linux 节点 中的说明部署节点组。不要指定您在 ENIConfig 资源中指定的子网。为 BootstrapArguments 参数指定以下文本。

      --use-max-pods false --kubelet-extra-args '--max-pods=20'
    • 托管:使用以下选项之一部署您的节点组:

      • 没有启动模板或者没有指定 AMI ID 的启动模板:完成 创建托管节点组 中的过程。托管节点组会自动为您计算 Amazon EKS 建议的最大容器组值。

      • 使用具有指定 AMI ID 的启动模板:在启动模板中,指定 Amazon EKS 优化的 AMI ID,或者指定基于 Amazon EKS 优化 AMI 构建的自定义 AMI,然后使用启动模板部署节点组并在启动模板中提供以下用户数据。此用户数据会将实际参数传递到 bootstrap.sh 文件中。有关引导文件的更多信息,请参阅 GitHub 上的 bootstrap.sh

        /etc/eks/bootstrap.sh my-cluster \ --use-max-pods false \ --kubelet-extra-args '--max-pods=20'

        如果您创建的自定义 AMI 不是基于 Amazon EKS 优化 AMI 构建的,则需要自行自定义创建配置。

  8. 创建节点组后,记录为每个节点组创建的安全组并将其应用于关联的 ENIConfig。使用以下命令编辑每个 ENIConfig,将 eniconfig-name 替换为您的值:

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

    如果您遵循第 5 步中的最佳实践,则 eniconfig-name 对应于可用区名称。

    spec 部分应与以下示例规范类似:

    spec: securityGroups: - sg-0dff222a2d22c2c22 subnet: subnet-022b222c2f22fdf22
    注意

    如果您使用创建的安全组,请确保满足集群、控制面板和节点安全组的建议或最低要求的安全组设置。有关更多信息,请参阅 Amazon EKS 安全组注意事项

  9. 如果在切换到自定义 CNI 联网功能之前,集群中有任何正在运行容器的节点,则应该封锁并耗尽节点以正常关闭容器,然后终止节点。只有注册有 k8s.amazonaws.com/eniConfig 标注的新节点将使用新的自定义联网功能。