Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
如何在 Amazon EKS 集群中为容器组选择特定的 IP 地址子网?
我想在 Amazon Elastic Kubernetes Service (Amazon EKS) 中为我的容器组使用自定义子网或 IP 地址范围。
解决方法
要从与 Worker 节点所在子网不同的子网中分配容器组 IP 地址,请使用自定义网络。
激活自定义网络
在配置自定义网络之前,请查看以下默认行为:
- 节点和容器组在您的 Amazon Virtual Private Cloud (VPC) 集群中使用来自相同 CIDR 范围的 IP 地址。要向您的 Amazon VPC 添加更多 IP 地址 CIDR 范围,请参阅如何在 Amazon EKS 中使用多个 CIDR 范围?
- Amazon EKS 从 Worker 节点所在子网中分配容器组 IP 地址。
- 您无法控制哪个子网为容器组分配 IP 地址。
- 当节点所在子网中没有可用的 IP 地址时,即使其他子网有可用地址,新容器组也无法启动。
- 从容器组到 Amazon VPC 中 Amazon EKS 集群 CIDR 数据块外的 IP 地址的所有流量都使用该节点的主接口和 IP 地址。这些流量将使用来自节点主弹性网络接口的安全组和子网。不使用您在 ENIConfig 对象中定义的子网和安全组。
- 如果您为容器组使用安全组,则容器组会使用您在 SecurityGroupPolicy 中指定的安全组。容器组不使用您在 ENIConfig 对象中指定的安全组。
**注意:**有关容器组流量路由的详细信息,请参阅为容器组启用出站互联网访问权限。
在适用于 Kubernetes 的 Amazon VPC 容器网络接口 (Amazon VPC CNI) 插件中激活自定义网络。使用与您的 Kubernetes 版本相匹配的 Amazon VPC CNI 插件版本。要访问该插件,请参阅 GitHub 网站上的 amazon-vpc-cni-k8s。
运行以下命令以验证您的 Amazon VPC 中的 Amazon EKS 集群版本:
kubectl describe daemonset aws-node --namespace kube-system | grep Image | cut -d "/" -f 2
如果您没有正确的插件版本,请更新 Amazon VPC CNI。
运行以下命令以激活自定义网络:
kubectl set env daemonset aws-node -n kube-system AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true
VPC CNI v1.18 及更高版本支持基于可用子网中 IP 地址使用情况的自动子网发现和动态地址分配。有关详细信息,请参阅 Amazon VPC CNI introduces enhanced subnet discovery(Amazon VPC CNI 推出增强型子网发现)。
您还可以使用 Amazon VPC CNI 插件执行以下操作:
- 指定用于您的容器组的 Amazon VPC 子网。
- 为您的容器组定义单独的安全组。
创建 ENIConfig 对象
在创建 ENIConfig 对象之前,请查看以下默认行为:
- 每个 ENIConfig 对象定义了一个子网和一个安全组列表。
- 您只能为每个节点分配一个 ENIConfig 对象。但是,您可以将同一个 ENIConfig 对象分配给多个节点。
- 当您为某个节点分配一个 ENIConfig 对象后,调度到该节点的容器组会使用 ENIConfig 对象中的子网和安全组。
- 您的 ENIConfig 对象的名称必须与您的可用区名称相同。
运行以下命令创建 ENIConfig 对象:
cat EOF | kubectl apply -f - apiVersion: crd.k8s.amazonaws.com/v1alpha1 kind: ENIConfig metadata: name: example-availability-zone spec: securityGroups: - example-security-group-id subnet: example-subnet-id EOF
**注意:**请将 example-availability-zone 替换为您的可用区。将 example-security-group-id 替换为您的安全组 ID。将 example-subnet-id 替换为您的子网 ID。
分配 ENIConfig 对象
要将一个 ENIConfig 对象与一个可用区关联,请自动为您的节点分配 ENIConfig 对象。要将多个 ENIConfig 对象与同一个可用区关联,请手动为您的节点分配 ENIConfig 对象。
自动分配 ENIConfig 对象
运行以下命令:
kubectl set env daemonset aws-node -n kube-system ENI_CONFIG_LABEL_DEF=topology.kubernetes.io/zone
手动关联 ENIConfig 对象
**重要事项:**确保关联的 ENIConfig 对象中的节点和子网位于同一可用区内。
运行以下命令:
kubectl annotate node example-node-name k8s.amazonaws.com/eniConfig=example-availability-zone
**注意:**请将 example-node-name 替换为您的节点的完整标识符。将 example-availability-zone 替换为您在创建 ENIConfig 对象时使用的可用区名称。
启动新节点
要从 ENIConfig 子网中分配辅助网络接口和 IP 地址,必须启动新节点。在替换现有节点之前,这些节点将继续使用其原始网络配置。
完成以下步骤:
- 检查您的自行管理的节点组和托管节点组中是否使用了自定义亚马逊机器映像 (AMI) ID。
- 如果使用了自定义 AMI ID,请确定每个节点的最大容器组数值。运行 max-pods-calculator.sh 脚本时,必须添加 --cni-custom-networking-enabled 参数。
**注意:**如果未使用启动模板或 AMI ID,则 Amazon EKS 会自动设置最大容器组数。 - 根据您的操作系统 (OS),更新新节点上的用户数据脚本,以使用最大数量的容器组:
Amazon Linux 2、Bottlerocket、Ubuntu 20.04 及更高版本、Windows Server 2019 及更高版本#!/bin/bash /etc/eks/bootstrap.sh example-cluster-name --use-max-pods false --kubelet-extra-args '--max-pods=example-max-pods'
**注意:**在前面的命令中,请将 example-cluster-name 替换为您的 EKS 集群的名称。将 example-max-pods 替换为您的每个节点的最大容器组数值。--user-data '#!/bin/bash /etc/eks/nodeadm init \ --container-runtime containerd \ --cluster-name example-cluster-name \ --max-pods example-max-pods'
有关 bootstrap 的详细信息,请参阅 GitHub 网站上的 awslabs/amazon-eks-ami。有关 nodeadm 的信息,请参阅从 Amazon Linux 2 升级到 Amazon Linux 2023。
Amazon Linux 2023 (AL2023) - 重新创建您的容器组,以使用新的自定义网络配置。
- 语言
- 中文 (简体)

相关内容
- 已提问 4 个月前
AWS 官方已更新 3 年前