CNI 配置变量 - Amazon EKS

CNI 配置变量

适用于 Kubernetes 的 Amazon VPC CNI 插件支持很多部署选项,这些选项是通过环境变量设置的。提供了以下环境变量,并且它们都是可选的。

AWS_VPC_CNI_NODE_PORT_SUPPORT

类型 – 布尔值

默认值true

指定是否在工作线程节点的主网络接口上启用 NodePort 服务。这需要额外的 iptables 规则,并要求将主接口上内核的反向路径筛选条件设置为 loose

AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG

类型 – 布尔值

默认值false

指定您的 Pod 可使用独立于集群的 resourcesVpcConfig 的子网和安全组(在控制层面资源所在的 VPC 中)。默认情况下,Pod 与工作线程节点的主接口共享相同的子网和安全组。将此变量设置为 true 会导致 ipamD 将工作线程节点的 ENIConfig 中的安全组和子网用于弹性网络接口分配。您必须为 Pod 将驻留的每个子网创建一个 ENIConfig 自定义资源定义,然后注释每个工作线程节点以使用特定的 ENIConfig(可使用同一 ENIConfig 注释多个工作线程节点)。一次只能使用一个 ENIConfig 注释工作线程节点,并且 ENIConfig 中的子网必须属于工作线程节点所驻留的同一可用区。有关更多信息,请参阅CNI 自定义网络

ENI_CONFIG_ANNOTATION_DEF

类型 – 字符串

默认值k8s.amazonaws.com/eniConfig

指定节点注释键名。这应在 AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true 时使用。注释值将用于设置 ENIConfig 名称。注释优先于标签。

ENI_CONFIG_LABEL_DEF

类型 – 字符串

默认值k8s.amazonaws.com/eniConfig

指定节点标签键名。这应在 AWS_VPC_K8S_CNI_CUSTOM_NETWORK_CFG=true 时使用。标签值将用于设置 ENIConfig 名称。注释将优先于标签。要使用标签,请确保已定义具有键 k8s.amazonaws.com/eniConfig 的注释,并且节点上未设置注释键 ENI_CONFIG_ANNOTATION_DEF 的值。要基于 可用区 选择 ENIConfig,请将此项设置为 failure-domain.beta.kubernetes.io/zone 并为每个 可用区 创建 ENIConfig 自定义资源,例如 us-east-1a。有关更多信息,请参阅CNI 自定义网络

AWS_VPC_ENI_MTU – v1.6.0 和后续版本

类型 – 整数

默认值9001

用于配置所连接的 ENI 的 MTU 大小。有效范围为 5769001

AWS_VPC_K8S_CNI_EXTERNALSNAT

类型 – 布尔值

默认值false

指定是否应使用外部 NAT 网关提供辅助 ENI IP 地址的 SNAT。在设置为 true 的情况下,不应用 SNAT iptables 规则与非 VPC IP 规则,如果已应用这些规则,则会将其删除。

如果您需要允许从外部 VPN、直接连接和外部 VPC 到 Pod 的入站通信,并且您的 Pod 不需要直接通过互联网网关访问 Internet,请禁用 SNAT。您的节点必须在私有子网中运行且已通过 AWS NAT 网关或其他外部 NAT 设备连接到 Internet。

有关更多信息,请参阅 外部源网络地址转换 (SNAT)

AWS_VPC_K8S_CNI_RANDOMIZESNAT

类型 – 字符串

默认值hashrandom

有效值hashrandomprngnone

指定 SNAT iptables 规则是否应随机选择连接的传出端口。这应在 AWS_VPC_K8S_CNI_EXTERNALSNAT=false 时使用。在启用 (hashrandom) 时,--random 标志将添加到 SNAT iptables 规则中。要使用伪随机数生成,而不是基于散列 (--random-fully),请为环境变量使用 prng。对于不支持 --random-fully 的旧版本 iptables,此选项将回退为 --random。如果您的传出连接依赖于顺序端口分配,请禁用 (none) 此功能。

注意

none 之外的所有选项将导致向出站连接分配一个源端口,该端口不一定属于在操作系统级别 (/proc/sys/net/ipv4/ip_local_port_range) 设置的临时端口范围。如果您的 NACL 根据在 ip_local_port_range 中找到的端口范围限制流量,则这一点非常重要。

AWS_VPC_K8S_CNI_EXCLUDE_SNAT_CIDRS – v1.6.0 和后续版本

类型 – 字符串

默认值 – 空

指定要从 SNAT 中排除的 IPv4 CIDR 的逗号分隔列表。对于列表中的每个项目,将应用 iptables 规则和非 VPC IP 规则。如果某个项目不是有效的 IPv4 范围,它将被跳过。这应在 AWS_VPC_K8S_CNI_EXTERNALSNAT=false 时使用。

WARM_ENI_TARGET

类型 – 整数

默认值1

指定空闲弹性网络接口(及其所有可用 IP 地址)的数量,ipamD 守护程序应尝试使这么多接口可用于节点上的 Pod 分配。默认情况下,ipamD 尝试使一个弹性网络接口及其所有 IP 地址可用于 Pod 分配。

注意

每个网络接口的 IP 地址数因实例类型而异。有关更多信息,请参阅 Amazon EC2 用户指南(适用于 Linux 实例) 中的每个实例类型的每个网络接口的 IP 地址

例如,m4.4xlarge 启动时具有 1 个网络接口和 30 个 IP 地址。如果在节点上放置 5 个 Pod,并从 IP 地址热池中删除 5 个空闲 IP 地址,则 ipamD 会尝试分配更多接口,直到有足够的 WARM_ENI_TARGET 空闲接口在节点上可用。

注意

如果已设置 WARM_IP_TARGET,则此环境变量将被忽略,并且将改用 WARM_IP_TARGET 行为。

WARM_IP_TARGET

类型 – 整数

默认值 – 无

指定空闲 IP 地址的数量,ipamD 守护程序应尝试使这些 IP 地址可用于节点上的 Pod 分配。例如,如果将 WARM_IP_TARGET 设置为 10,则 ipamD 会尝试始终使 10 个空闲 IP 地址可用。如果节点上的弹性网络接口无法提供这么多空闲地址,则 ipamD 会尝试分配更多接口,直到有足够的 WARM_IP_TARGET 空闲 IP 地址可用。

注意

此环境变量将覆盖 WARM_ENI_TARGET 行为。

MINIMUM_IP_TARGET – v1.6.0 和后续版本

类型 – 整数

默认值 – 无

指定 ipamD 守护程序应尝试为节点上的 Pod 分配而分配的 IP 地址总数。MINIMUM_IP_TARGET 的行为与 WARM_IP_TARGET 相同,不同之处在于:它不设置始终保持可用的可用 IP 地址的目标数量,而是对分配的 IP 地址总数设置下限目标数量。

MINIMUM_IP_TARGET 用于预扩展,WARM_IP_TARGET 用于动态扩展。例如,假设集群的预期 Pod 密度为每个节点大约 30 个 Pod。如果 WARM_IP_TARGET 设置为 30 以确保 CNI 最初分配了足够的 IP ,则将 30 个 Pod 部署到该节点。CNI 将另外分配 30 个 IP(共计 60 个),这会加快相关子网中的 IP 耗尽。反之,如果 MINIMUM_IP_TARGET 设置为 30 而 WARM_IP_TARGET 设置为 2,则在部署 30 个 Pod 后,CNI 将另外分配 2 个 IP。这仍然提供弹性,但使用的 IP 数量约为单独使用 WARM_IP_TARGET 时的一半(32 个 IP 地址与 60 个 IP 地址)。

这还通过减少分配或取消分配私有 IP 地址所需的调用次数来提高集群的可靠性,这些 IP 地址可能会受到限制,尤其是在扩展相关时间内。

MAX_ENI

类型 – 整数

默认值 – 无

指定要附加到节点的 ENI 的最大数量。如果 MAX_ENI 未设置或者小于或等于 0,则不使用该设置,并且 ENI 的最大数量始终等于有问题的实例类型的最大数量。即使 MAX_ENI 是正数,它也受实例类型的最大数量限制。

AWS_VPC_K8S_CNI_LOGLEVEL

类型 – 字符串

默认值 – DEBUG

有效值DEBUGINFOWARNERRORFATAL(不区分大小写)

指定 ipamd 的日志级别。

AWS_VPC_K8S_CNI_LOG_FILE

类型 – 字符串

默认值 – 未设置

有效值:stdout 或文件路径

指定将 ipamd 的日志记录输出写入到的位置。您可以指定 stdout 或覆盖默认文件,例如 /var/log/aws-routed-eni/ipamd.log

AWS_VPC_K8S_PLUGIN_LOG_FILE

类型 – 字符串

默认值 – 未设置

有效值stdout 或文件路径。

指定将 aws-cni 插件的日志记录输出写入到的位置。您可以指定 stdout 或覆盖默认文件,例如 /var/log/aws-routed-eni/plugin.log

AWS_VPC_K8S_PLUGIN_LOG_LEVEL

类型 – 字符串

默认值 – DEBUG

有效值DEBUGINFOWARNERRORFATAL(不区分大小写)

指定 aws-cni 插件的日志级别。

INTROSPECTION_BIND_ADDRESS

类型 – 字符串

默认值127.0.0.1:61679

指定自检终端节点的绑定地址。Unix 域套接字可以使用套接字路径之前的 unix: 前缀指定。

DISABLE_INTROSPECTION

类型 – 布尔值

默认值 – false

指定是否在工作线程节点上禁用自检终端节点。此项设置为 true 时,将减少运行 aws-cni-support.sh 脚本时可从节点获取的调试信息。

DISABLE_METRICS

类型 – 布尔值

默认值 – false

指定是否为 ipamd 禁用 Prometheus 指标终端节点。默认情况下,指标在 :61678/metrics 上发布。

AWS_VPC_K8S_CNI_VETHPREFIX

类型 – 字符串

默认值eni

指定用于为 CNI 生成主机端 veth 设备名称的 veth 前缀。前缀长度最多为四个字符。

ADDITIONAL_ENI_TAGS – v1.6.0 和后续版本

类型 – 字符串

默认值{}

示例值{"tag_key": "tag_val"}

应用于 ENI 的元数据可帮助您出于计费或其他目的对资源进行分类和整理。每个标签都包含自定义键和可选值。标签键最多可包含 128 个字符。标签值最多可包含 256 个字符。标签将添加到主机上的所有 ENI。

重要

自定义标签不应包含 k8s.amazonaws.com 前缀,因为它是保留的。如果标签包含 k8s.amazonaws.com,则将忽略标签添加。

CLUSTER_NAME

类型 – 字符串

默认值""

指定用于标记分配的 ENI 的集群名称。

与分配相关的 ENI 标签

此插件与 ENI 上的以下标签交互:

  • cluster.k8s.amazonaws.com/name

  • node.k8s.amazonaws.com/instance_id

  • node.k8s.amazonaws.com/no_manage

集群名称标签

标签 cluster.k8s.amazonaws.com/name 将设置为创建 ENI 的 aws-node 守护程序集的集群名称。

实例 ID 标签

标签 node.k8s.amazonaws.com/instance_id 将设置为分配了此 ENI 的 aws-node 实例的实例 ID。

无管理标签

aws-node 守护程序集读取 node.k8s.amazonaws.com/no_manage 标签,以确定是否不应为私有 IP 地址配置或使用附加到计算机的 ENI。此标签并非由 CNI 插件本身设置,而是由用户设置,以表示 ENI 用于主机网络 Pod 或用于其他与 Kubernetes 无关的进程。

注意

附加具有 no_manage 标签的 ENI 将导致 kubelet--max-pods 配置选项的值不正确。如果您使用此标签,另请考虑分别更新此插件以及 kubelet 上的 MAX_ENI--max-pods 配置选项。

备注

在每个工作线程节点上运行的 L-IPAMDaws-node 守护程序集)需要访问 Kubernetes API 服务器。如果它不能访问 Kubernetes API 服务器,ipamD 将退出,CNI 无法为 Pod 获取任何 IP 地址。确认 L-IPAMD 是否有权访问 Kubernetes API 服务器。

kubectl get svc kubernetes

输出

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 29d

通过 SSH 连接到工作线程节点,检查工作节点是否可以访问 API 服务器。

telnet 10.0.0.1 443

输出

Trying 10.0.0.1... Connected to 10.0.0.1. Escape character is '^]'.

如果您收到最后一行输出,则可以访问 Kubernetes API 服务器。