我的 Amazon Elastic Kubernetes Service (Amazon EKS) 集群无法分配 IP 地址,因为我的子网没有可用的 IP 地址。
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
在 Amazon VPC CNI 中使用增强型子网发现
创建 Amazon Virtual Private Cloud (VPC) 容器网络接口 (CNI) 插件,该插件使用增强型子网发现从同一 VPC 中的子网分配 IP 地址。该插件还可以在可用区之间平衡负载。
**注意:**必须使用 Amazon VPC CNI 插件版本 1.18.0 或更高版本。此外,您的集群必须运行 Amazon EKS 1.25 或更高版本。
要检查是否已激活增强型子网发现,请运行以下命令:
kubectl describe ds aws-node -n kube-system | grep ENABLE_SUBNET_DISCOVERY
要开启增强型子网发现,请针对您使用的工具运行以下命令之一。
kubectl:
kubectl set env daemonset aws-node -n kube-system ENABLE_SUBNET_DISCOVERY=true -c aws-node
AWS CLI:
aws eks update-addon --cluster-name CLUSTER_NAME --region AWS_REGION \
--addon-name vpc-cni \
--configuration-values '{"env":{"ENABLE_SUBNET_DISCOVERY":"true"}}'
**注意:**将 CLUSTER_NAME 替换为您的集群名称,将 AWS_REGION 替换为您的 AWS 区域。
将 kubernetes.io/role/cni 标签添加到您的子网。
使用自定义网络
出于安全考虑,有时容器组 (pod) 必须在具有不同安全组的独立网络上运行。使用自定义网络从 VPC 中的辅助 CIDR 范围分配容器组 (pod) IP 地址。
当您在 Amazon VPC CNI 中使用自定义网络时,自定义网络会在 ENIConfig 文件的子网中创建辅助网络接口。然后,Amazon VPC CNI 会从该子网分配容器组 (pod) IP 地址,以便您的容器组 (pod) 可以使用与节点的主网络接口不同的安全组。
**注意:**如果您同时使用增强型子网发现和自定义网络,则自定义网络优先。
对于辅助 CIDR 范围,请使用来自 CG-NAT 的 CIDR (/16)。例如,使用 100.64.0.0/10 或 198.19.0.0/16。与 RFC1918 范围相比,这些范围在企业网络中不太常见。
有关更多信息,请参阅自定义 Amazon EKS 节点中的辅助网络接口。
启用前缀委托
基于 Nitro 的 Amazon Elastic Compute Cloud (EC2) 实例可以使用前缀委托。前缀委托分配 /28 IPv4 地址前缀,而不是单个 IP 地址。
要启用前缀委托,请根据您的操作系统 (OS) 运行以下命令之一。
Linux:
kubectl set env ds aws-node -n kube-system ENABLE_PREFIX_DELEGATION=true
Windows:
kubectl patch configmap amazon-vpc-cni -n kube-system --type merge -p '{"data": {"enable-windows-prefix-delegation": "true", "enable-windows-ipam": "true"}}'
当子网的 IP 地址变得碎片化时,前缀委托可能会失败,因为它需要连续的 IP 地址块。然后,您可能会在 VPC CNI 日志中收到以下错误消息:
"Failed to allocate a private IP/Prefix address: InsufficientCidrBlocks: There are not enough free cidr blocks in the specified subnet to satisfy the request."
要解决此问题,请使用 VPC 子网 CIDR 预留来为前缀分配预留 IP 地址。然后,VPC CNI 插件会从预留 IP 地址中分配前缀。
设置 CNI 优化参数
要保持特定数量的 IP 地址可用,请设置 WARM_IP_TARGET、MINIMUM_IP_TARGET 和 WARM_ENI_TARGET 参数。
设置 WARM_IP_TARGET 参数可在每个节点上保留指定数量的 IP 地址。设置 MINIMUM_IP_TARGET 参数可始终保持最小数量的可用 IP 地址。设置 WARM_ENI_TARGET 参数可保留指定数量的、具有可用 IP 地址的网络接口。
有关详细信息,请参阅 GitHub 网站上的 WARM_ENI_TARGET, WARM_IP_TARGET and MINIMUM_IP_TARGET(WARM_ENI_TARGET、WARM_IP_TARGET 和 MINIMUM_IP_TARGET)。
要设置 WARM_IP_TARGET,请运行以下命令:
kubectl set env ds aws-node -n kube-system WARM_IP_TARGET=YOUR_TARGET_VALUE
**注意:**将 YOUR_TARGET_VALUE 替换为您的预热 IP 目标数量。
要设置 MINIMUM_IP_TARGET,请运行以下命令:
kubectl set env ds aws-node -n kube-system MINIMUM_IP_TARGET=YOUR_MIN_VALUE
**注意:**将 YOUR_MIN_VALUE 替换为您的最低 IP 目标数量。
要设置 WARM_ENI_TARGET,请运行以下命令:
kubectl set env ds aws-node -n kube-system WARM_ENI_TARGET=YOUR_ENI_VALUE
**注意:**将 YOUR_ENI_VALUE 替换为您的预热网络接口目标数量。
监控您的 IP 地址使用情况
要监控集群的 IP 地址使用情况以防止地址耗尽,请执行以下操作:
为新集群部署实施最佳实践
对于新的 Amazon EKS 集群部署,请实施以下最佳实践: