CNI 自定义网络 - Amazon EKS

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

CNI 自定义网络

默认情况下,当为Pod分配新的网络界面时, ipamD 使用节点的主要网络威胁防护组以及。您可能希望Pod与控制平面安全组在同一VPC内使用不同的安全组或子网络。例如:。

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

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

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

注意
  • 您可以为自我管理的节点组或使用 启动模板,使用自定义AMI. 此主题中的程序要求 Amazon VPC Kubernetes的CNI插件 版本1.4.0或更高版本。要检查您的 CNI 版本,并在必要时进行升级,请参阅适用于 Kubernetes 的 Amazon VPC CNI 插件升级

  • 启用自定义网络可以有效地从使用它的每个节点中删除可用的网络界面(以及Pod的所有可用IP地址)。当启用自定义网络时,该节点的主要网络界面不用于Pod放置。

  • 此主题中的过程指示CNI插件将不同的安全组与次要网络的接口关联,而不是与实例中的主网络的接口关联。所有使用次要网络口的Pod仍将共享使用次要网络口,并将全部使用相同的安全组。如果您想要将不同的授权组分配给单个Pod,则您可以使用 Pod的安全组. Pod的安全组可以创建额外的网络界面,每个网络界面都可以分配一个唯一的安全组。Pod的安全组可以在有或没有自定义网络的情况下使用。

配置 CNI 自定义网络

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

  2. 在VPC中创建每个 可用区,使用您的次要CIDR块。您的自定义子网络必须来自与节点启动到的子网络不同的VPCCIDR块。更多信息,请参阅 在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.6.3
  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 与 可用区 ,因为这样可以简化多AZ自动扩展组的部署(参见下面的步骤6c)。在此示例中,将创建一个名为 us-west-2a.yaml 的文件。更换 example values 对于 name, subnet、和 securityGroups 自己的价值观。在此示例中,我们遵循最佳实践,并将 name 的值设置为子网所在的可用区。如果您没有要为 Pod 附加的特定安全组,您可以暂时将该值留空。稍后,您将在ENI配置中指定节点授权组。

      注意

      子网和安全组的每个组合均需要有自己的自定义资源。

      apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: us-west-2a spec: securityGroups: - sg-0dff111a1d11c1c11 subnet: subnet-011b111c1f11fdf11
    2. 使用以下命令将您创建的每个自定义资源文件应用于您的集群:

      kubectl apply -f us-west-2a.yaml
    3. (可选,但推荐用于可用区 节点组)默认情况下,Kubernetes应用 可用区 一个节点的 failure-domain.beta.kubernetes.io/zone 标签。如果您将ENI配置自定义资源命名为 可用区 在VPC中,按照步骤6a中的建议,您可以启用Kubernetes为节点自动应用相应的ENI配置 可用区 使用下列命令。

      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 实例类型支持三个网络界面,每个界面支持十个IPv4地址。将值插入公式中,实例最多可支持20个Pod,如以下计算所示。

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

      有关每种实例类型的最大网络界面数量的详细信息,请参阅 每个实例类型每个网络界面的IP地址Amazon EC2 用户指南(适用于 Linux 实例).

    2. 按照步骤 自我管理节点启动自我管理 Amazon Linux 结节 创建一个新的自我管理节点组。打开 AWS CloudFormation 模板后,按照说明中所述输入值。指定您在 ENIConfig 部署的资源。对于 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. 如果在完成此过程之前,您的群集中有任何节点的Pod已经放置,则应终止这些节点。只有新节点已在 k8s.amazonaws.com/eniConfig 标签使用新的自定义网络功能。