配置节点池级容器网络

独占ENI模式是为Pod提供最佳网络性能的一种策略,特别适合于那些对网络性能有严格需求的场景。例如,在处理大数据分析、实时流处理或者运行对网络敏感的应用(如视频流、在线游戏或科学计算)时,该网络模式可以提供高网络吞吐量和极低的网络延迟。在高频交易类型场景,该网络模式可以提供组播能力。

使用限制

  • 仅支持ACK托管集群,且Terway版本需为v1.11.0及以上。如需升级组件版本,请参见Terway

  • 集群开启双栈后,添加节点时会受到共享ENI模式的ECS机型限制。主私网地址+辅助私有IPv4地址和IPv6地址数量需要为1:1。关于ECS实例支持的IPv4和IPv6数量,请参见实例规格族

  • 独占ENI的Pod不支持eBPF网络加速及NetworkPolicy。

配置节点池级别的容器网络

请参见以下流程规划并创建独占ENI节点池,创建成功后,您可以指定Pod调度至目标节点池。

1. 规划独占ENI节点池

  • 独占ENI模式下,单节点的最大Pod数量较少。Worker节点弹性网卡数量需要大于6才能加入集群,关于如何计算弹性网卡的数量,请参见实例规格族

  • 规划Pod使用的交换机、安全组。

Terway支持多种配置方式,优先级依次递减:

2. 创建独占ENI节点池并验证独占ENI模式启用成功

  1. 参见创建节点池新建一个节点池,并在创建过程中为节点添加标签k8s.aliyun.com/exclusive-mode-eni-type: eniOnly

    推荐您同时配置污点,避免其他Pod调度到独占ENI的节点池中。

    重要

    请在创建节点池时配置标签。已创建的节点无法切换至独占ENI模式。若您配置错误,请删除节点池重建。

  2. 执行以下命令,查询节点的可分配(allocatable)资源,检查节点是否已成功开启独占ENI模式。

    kubectl describe node <node-name> 

    预期输出:

    Capacity:
      aliyun/eni:         7
      cpu:                16
      ephemeral-storage:  123460788Ki
      hugepages-1Gi:      0
      hugepages-2Mi:      0
      memory:             31555380Ki
      pods:               213
    Allocatable:
      aliyun/eni:         7
      cpu:                15890m
      ephemeral-storage:  113781462033
      hugepages-1Gi:      0
      hugepages-2Mi:      0
      memory:             28587828Ki
      pods:               213

    预期输出中显示aliyun/eni,表明独占ENI模式启用成功。

3. 指定Pod调度到独占ENI节点池

您可以通过NodeAffinity或网络自定义资源PodNetworking配置指定Pod调度到独占ENI节点池。

  • NodeAffinity:不支持Pod维度的配置(使用固定IP、配置独立虚拟交换机以及安全组)。

  • PodNetworking:支持在Pod维度配置虚拟交换机、安全组,以及使用Pod固定IP。具体操作,请参见为Pod配置固定IP及独立虚拟交换机、安全组

    您可以参见下方YAML示例,在eniOptions字段中将eniType设置为ENI,指定Pod调度至独占ENI节点池。

    apiVersion: network.alibabacloud.com/v1beta1
    kind: PodNetworking
    metadata:
      name: enionly
    spec:
      eniOptions:
        eniType: ENI
      allocationType:
        type: Elastic
      selector:
        podSelector:
          matchLabels:
            network: enionly

常见问题

如何判断Pod是否使用了独占ENI?

Terway会创建Pod同名、同命名空间的PodENI资源,用于记录所使用的网络配置信息。您可以通过以下方式查询。

k get podeni nginx-9d557694f-rcdzs -oyaml
# 预期输出:
apiVersion: network.alibabacloud.com/v1beta1
kind: PodENI
metadata:
  annotations:
    k8s.aliyun.com/pod-uid: 05590939-fc51-47ab-a204-3dd187233bca
  creationTimestamp: "2024-09-13T08:09:27Z"
  finalizers:
  - pod-eni
  generation: 1
  labels:
    k8s.aliyun.com/node: cn-hangzhou.172.XX.XX.25
  name: example-9d557694f-rcdzs
  namespace: default
  resourceVersion: "1131123"
spec:
  allocations:
  - allocationType:
      type: Elastic
    eni:
      attachmentOptions: {}
      id: eni-xxxx
      mac: 00:16:3e:37:xx:xx
      securityGroupIDs:
      - sg-xxxx
      vSwitchID: vsw-xxxx
      zone: cn-hangzhou-j
    ipv4: 172.16.0.30
    ipv4CIDR: 172.16.0.0/24
    ipv6: 2408:4005:xxxx:xxxx:xxxx:xxxx:xxxx:9ad4
    ipv6CIDR: 2408:4005:39c:xxxx::/64
  zone: cn-hangzhou-j
status:
  eniInfos:
    eni-xxxx:
      id: eni-xxxx
      status: Bind
      type: Secondary
  instanceID: i-xxxx
  phase: Bind