如果您希望为ACK集群提供精细化的流量管理、流量隔离、网络策略配置和IP管理能力,可以通过使用Terway弹性网卡中继(Trunk ENI)为每个Pod配置固定IP、独立的虚拟交换机或安全组来实现。
背景信息
为了给 Pod 配置固定 IP、独立虚拟交换机及安全组,ACK提供基于弹性网卡ENI的网络方案。在 ACK 集群中,主要通过两种模式来使用 ENI:
- 独占 ENI 模式:每个 Pod 直接绑定一个独立的 ENI,享有独立的网络资源。此模式的网络隔离性较强,但会消耗较多的 ENI 配额,更适用于对网络性能与隔离要求较高的应用。 - 使用此模式时,需在创建节点池时配置独占 ENI 网络模式。 
- Trunk ENI 模式:通过节点上的中继网卡(Trunk ENI)作为通道,为节点上的多个 Pod 动态提供辅助 ENI。此模式可以提升单节点的 Pod 部署密度,适用于大规模自定义网络配置的场景。 - 使用此模式时,需预先在集群中启用 Trunk ENI 功能。启用后,集群将自动部署 terway-controlplane 组件,负责管理自定义网络配置的生命周期与策略下发。其工作架构如下图所示。 - 基于 Trunk ENI 模式,您还可以启用Pod 自定义网络配置的能力,按需为部分关键 Pod 指定独立的虚拟交换机、安全组和固定 IP,而集群中其余的 Pod 仍可沿用默认的共享网络配置,实现了灵活与精细化的管理。 
使用限制
- 如果您的集群为ACK专有集群,需到配额平台申请容器网络支持Terway ENI Trunking模式。 
- 单节点所支持的Pod数量有限制,关于节点所支持容器网络Pod数量的详细描述,请参见使用Terway网络插件。 
- Pod安全组规则不会应用到同节点Pod之间的流量以及同节点上节点与Pod之间的流量。如果您需要限制,可以通过NetworkPolicy进行配置。 
- Terway 版本要求: - 如需升级Terway,请参见组件。 - Trunk ENI 模式:Terway 版本 ≥ v1.3.0 
- 独占 ENI 模式:Terway 版本 ≥ v1.11.0 
 
- 此功能仅支持 ECS 实例。 
数据链路
下面的数据路径,描述了使用Trunk(中继)网卡和独占ENI的差异。
Pod独立配置使用范围
Pod 独立配置通过为每个 Pod 创建自己专属的弹性网卡,为弹性网卡设置Pod 专属的交换机、安全组实现。
Pod 独立配置依赖下面两种节点配置模式:
| 支持中继网卡的节点 | 支持弹性网卡的节点(请参考为节点池配置独占ENI网络模式) | |
| 默认支持集群类型 | ACK托管集群 | ACK托管集群,ACK专有集群 | 
| 部署密度 | 普通 Pod 使用共享 eni,指定 Pod 使用独占 eni,整体密度高 | 节点上所有 Pod 只能使用独占弹性网卡, 密度低 | 
| 支持节点类型 | ECS 节点 | ECS 节点 | 
| 机型 | 您需要选择支持Trunk功能,且响应参数为 | 支持弹性网卡的机型 | 
| 适用场景 | 成本敏感、低并发业务 | 高性能、低延迟、高并发业务 | 
| Kubernetes 资源限制 | 
 | |
步骤一:为集群启用Trunk ENI功能
为新建集群启用Trunk ENI功能
创建ACK集群,网络插件选择Terway,在Terway模式中选中Trunk ENI支持,该模式的网络插件类型为terway-eniip。详细信息,请参见创建ACK专有集群(已停止新建)和创建ACK托管集群。
从Kubernetes 1.31开始,新建的ACK托管集群默认开启Trunk ENI支持,无需配置。
新建集群一旦启用Trunk ENI功能,则不再支持修改。
为已有集群启用Trunk ENI功能
前提条件
已有集群的网络插件类型为terway-eniip。关于Terway网络插件的更多信息,请参见使用Terway网络插件。
可以在集群的组件管理页面查看您安装的网络插件类型。
使用限制
- 2020年06月之前创建的ACK托管集群可能不支持此功能,请通过步骤一检查是否支持。 
- 固定IP及独立虚拟交换机、安全组开启后不可关闭。 
步骤一:查看集群是否支持使用Trunk ENI功能
- ACK专有集群需要额外申请Trunk实例使用权限,请向ECS提交工单申请。 
- 对于存量ACK托管集群或是由ACK专有集群迁移过来的ACK托管集群,需要查看集群是否支持使用Trunk ENI功能,并修改配置。无需额外申请Trunk实例使用权限。 
执行以下命令,检查token配置。
kubectl get secret -nkube-system addon.network.token预期输出如下所示:
NAME                  TYPE     DATA   AGE
addon.network.token   Opaque   1      69m如果存在token配置,则执行下一步;如果不存在token配置,表明该集群不支持使用Trunk ENI功能,请新建集群支持Trunk ENI功能。
步骤二:开启terway-eniip并为集群启用Trunk ENI功能
- 登录容器服务管理控制台,在左侧导航栏选择集群列表。 
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,单击组件管理。 
- 在组件管理页面,单击网络页签,找到terway-eniip组件。 
- 在terway-eniip卡片,单击升级,升级terway-eniip组件到最新版本。 - 如果卡片上没有升级字样,说明当前组件已经是最新版本,请跳过此步骤。 
- 开启terway-eniip。 - 执行如下命令,编辑eni-config。 - kubectl edit cm -nkube-system eni-config
- 编辑YAML文件的eni-config参数: - 参数 - 值 - 说明 - enable_eni_trunking - true - 启用Trunk ENI功能。开启后不可关闭。 - credential_path - /var/addon/token-config - 对于ACK托管集群,如果YAML文件中不存在该参数,请自行添加。 重要- 请勿修改其他参数。 
- eni-config内容需要为合法JSON格式。 
 - 配置参数示例如下: - apiVersion: v1 data: eni_conf: | { "min_pool_size": 0, "enable_eni_trunking": true, "credential_path": "/var/addon/token-config", ... } kind: ConfigMap
- 执行如下命令,重启terway pods,使配置生效。 - kubectl delete pod -n kube-system -l app=terway-eniip
 
- 请在terway-eniip参数配置完成后,在组件管理页面的网络页签,安装terway-controlplane组件。 - 安装结束后,在terway-controlplane卡片上可以看到已安装字样。 
步骤二:创建网络自定义资源PodNetworking
Terway增加一种名为PodNetworking的自定义资源来描述网络配置。您可以创建多个PodNetworking来规划不同的网络平面。
- 登录容器服务管理控制台,在左侧导航栏选择集群列表。 
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。 
- 在自定义资源页面,单击资源定义(CustomResourceDefinition)页签,然后单击使用YAML创建资源。 - 创建PodNetworking的示例如下: - apiVersion: network.alibabacloud.com/v1beta1 kind: PodNetworking metadata: name: example spec: allocationType: type: Fixed # Pod IP分配的策略,可以取值为Elastic或Fixed。 releaseStrategy: TTL # 只有将type配置为Fixed时,releaseStrategy参数才有效;type的配置为Elastic时,无需配置releaseStrategy和releaseAfter参数。 releaseAfter: "1h" # 在releaseStrategy为TTL模式下,releaseAfter参数才有效。 selector: podSelector: matchLabels: foo: bar namespaceSelector: matchLabels: foo: bar securityGroupIDs: - sg-bpxxxx vSwitchOptions: - vsw-bpxxxx eniOptions: eniType: Default- 参数说明如下: - 参数 - 说明 - allocationType - (描述Pod IP分配的策略) - type - 取值范围: - Elastic:弹性IP策略。Pod删除后,IP资源被释放。 
- Fixed:固定IP策略。 - 启用后,该PodNetworking对固定名称的Pod生效。默认支持StatefulSet和无ownerReferences 的Pod使用。如果您需要设置自定义工作负载,请在组件管理对terway-controlplane进行配置。 说明- 如果您使用了固定IP策略,Pod重建后的可用区将被添加约束,来确保和第一次调度的可用区匹配。 
 - releaseStrategy - IP释放策略,只有将 - type配置为- Fixed时,该参数才有效。参数取值范围如下。- TTL:延迟释放IP策略。当Pod被删除一段时间后,才会释放IP,最小值为5分钟。
- Never:不释放IP策略。当您无需使用IP时,需要自行删除PodENI资源。
 - releaseAfter - 延迟回收时间。仅在 - releaseStrategy为- TTL模式下生效,支持时间格式为Go time type,请使用- h、- m时间单位 ,例如- 2h45m、- 5m0s。关于Go time type,请参见Go time type。- selector - (用于配置标签选择器,被选中的Pod将使用该网络配置) - podSelector - 用来匹配Pod的Labels,匹配的Pod在创建时将使用这个网络配置。 
- 如果同时配置 - podSelector与- namespaceSelector,符合全部匹配规则的Pod在创建时将使用这个网络配置。
- 您在配置Pod标签与PodNetworking中的selector时,请确保有唯一匹配关系,如果Pod被多个PodNetworking配置所匹配,将使用任一匹配的PodNetworking配置。 
 - namespaceSelector - 用来匹配Namespace的Labels,匹配的Pod在创建时将使用这个网络配置。 
- 如果同时配置 - podSelector与- namespaceSelector,符合全部匹配规则的Pod在创建时将使用这个网络配置。
- 您在配置Pod标签与PodNetworking中的selector时,请确保有唯一匹配关系,如果Pod被多个PodNetworking配置匹配,将使用任意匹配的PodNetworking配置。 
 - vSwitchOptions - - - 用于配置Pod使用的vSwitch,多个vSwitchID之间为或的关系。Pod仅能使用一个vSwitch,Terway将选择一个符合条件的vSwitch。 
- 您的Pod部署的可用区将被添加约束,来确保这些可用区保持和您配置的vSwitchOptions列表中的可用区一致。 
- 请确保vSwitchOptions中的vSwitch所在可用区与您指定调度的节点可用区一致,并且拥有足够的剩余IP资源,否则Pod将无法创建。 
 说明- 如果您同时启用了节点自动伸缩,vSwitchOptions参数添加的可用区约束可能导致节点池扩容无法触发,详情请参见依赖特定可用区运行的Pod无法触发多可用区的节点池扩容 节点自动伸缩FAQ。 - vSwitchSelectOptions - (配置交换机的选择策略) - vSwitchSelectionPolicy - 取值范围: - ordered:默认,按填写的交换机顺序。
- most:优先使用剩余IP多的交换机。
- random:随机选择交换机。
 说明- 从Terway v1.11.0开始支持。 - securityGroupIDs - - - 可配置多个安全组ID,配置多个安全组时将同时生效,安全组数量小于等于5个。 - eniOptions - (配置Pod使用的弹性网卡类型) - eniType - 取值范围: - Default:默认,在共享ENI集群,使用Trunk ENI,在独占ENI集群,使用独占ENI。
- ENI:使用独占ENI。
- Trunk:使用Trunk ENI。
 说明- 从Terway v1.11.0开始支持。 
- 单击创建。 - 创建PodNetworking资源后,Terway将同步网络配置信息,只有在 - status成为- Ready后,该网络资源才能对Pod生效。- 执行以下命令,查看资源状态是否 - ready。- kubectl describe PodNetworking example # 请将example换成您自己的自定义资源名称。
(可选)步骤三:为命名空间添加匹配标签
在部署PodNetworking自定义资源后,如果通过Namespace标签将命名空间与PodNetworking的规则相匹配,需要为指定命名空间增加相同的标签。
- 执行以下命令,创建测试命名空间example。 - kubectl create ns example
- 执行以下命令,为命名空间打上 - foo=bar标签。- kubectl label namespaces example foo=bar # 请将example换成您自己指定命名空间名称。
- 执行以下命令,查看命名空间的标签。 - kubectl get namespace example --show-labels # 请将example换成您自己指定命名空间名称。- 预期输出如下。 - NAME STATUS AGE LABELS example Active 24s foo=bar,kubernetes.io/metadata.name=example
(可选)步骤四:创建应用Pod
当创建Pod时,Pod将根据标签与PodNetworking资源进行匹配。如果Pod没有匹配到任何PodNetworking资源,它将默认使用ENI提供的IP。如果有匹配的PodNetworking,Pod将按照该资源定义的配置来分配ENI。
对于这类Pod,Terway将创建一个名为PodENI的CRD来跟踪Pod所占用的网络资源。这个资源由Terway管理。有关Pod标签的更多信息,请参见标签。
- 使用以下示例应用的YAML内容,创建名为my-nginx.yaml文件。 - apiVersion: apps/v1 kind: StatefulSet metadata: name: my-nginx # 实例应用的名称。 namespace: example # 指定命名空间为example。 labels: app: nginx spec: serviceName: "nginx-service" replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx foo: bar # 为Pod添加foo: bar标签。 spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 ports: - containerPort: 80 # 如果StatefulSet需要持久化存储,需要定义volumeClaimTemplates。 # 例如 # volumeClaimTemplates: # - metadata: # name: nginx-storage # spec: # accessModes: ["ReadWriteOnce"] # storageClassName: "my-storage-class" # resources: # requests: # storage: 1Gi
- 执行以下命令,部署示例应用my-nginx。部署完成后,验证操作请参见如何判断Pod是否使用了PodNetworking的网络配置? - kubectl apply -f my-nginx.yaml
ACK专有集群迁移时,停止terway-controlplane
ACK专有集群在启用Pod自定义配置后,不能直接迁移到ACK托管集群Pro版。您需要在迁移前停止terway-controlplane,并在迁移后启用terway-controlplane。
- 迁移前准备。 - 执行以下命令,停止terway-controlplane。 - kubectl scale deploy -nkube-system terway-controlplane --replicas 0
- 执行以下命令,完成webhook配置。 - # 备份webhook配置。 kubectl get mutatingwebhookconfigurations.admissionregistration.k8s.io terway-controlplane -oyaml > terway-controlplane.mutatingwebhookconfigurations.yaml kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io terway-controlplane -oyaml > terway-controlplane.validatingwebhookconfigurations.yaml # 清理webhook配置。 kubectl delete -f terway-controlplane.mutatingwebhookconfigurations.yaml kubectl delete -f terway-controlplane.validatingwebhookconfigurations.yaml
- 执行以下命令,完成service配置。 - # 备份原有service配置 kubectl get service -nkube-system terway-controlplane -oyaml > terway-controlplane.service.yaml # 清理原有service配置 kubectl delete -f terway-controlplane.service.yaml
 
- 迁移集群完成后,检查迁移结果。 说明- 关于迁移集群的具体操作,请参见热迁移ACK专有集群至ACK托管集群Pro版。 - 如果迁移集群失败,执行以下命令,恢复webhook和terway-controlplane。 - # 恢复service配置 kubectl apply -f terway-controlplane.service.yaml # 恢复webhook配置。 kubectl apply -f terway-controlplane.mutatingwebhookconfigurations.yaml kubectl apply -f terway-controlplane.validatingwebhookconfigurations.yaml # 恢复terway-controlplane。 kubectl scale deploy -nkube-system terway-controlplane --replicas 1
- 如果迁移集群成功,执行以下命令,清理资源。 - kubectl delete deploy -nkube-system terway-controlplane
 
- 在组件管理页面安装terway-controlplane。具体操作,请参见管理组件。 
常见问题
如何判断Pod是否使用了PodNetworking的网络配置?
- Pod创建后,在 - annotations中将以- k8s.aliyun.com/pod-networking作为键值记录创建该Pod时是否使用了PodNetworking资源。- apiVersion: v1 kind: Pod metadata: annotations: k8s.aliyun.com/pod-eni: "true" k8s.aliyun.com/pod-networking: podnetworking labels: app: example pod-ip: elastic
- Terway将创建与Pod同名、同命名空间的PodENI资源,用于记录所使用的网络配置信息。 - kubectl get podenis.network.alibabacloud.com <my-nginx-0> -n <example> -o yaml # 替换<my-nginx-0>为Pod名称,<example>为Pod所处命名空间- 输出内容如下,则说明Pod已经使用PodNetworking配置。 - apiVersion: network.alibabacloud.com/v1beta1 kind: PodENI metadata: finalizers: - pod-eni generation: 1 name: <my-nginx-0> namespace: default spec: allocations: - allocationType: type: Elastic eni: id: eni-bp1xxxx mac: 00:16:xx:xx:xx:xx securityGroupIDs: - sg-bp1xxxx vSwitchID: vsw-bp1xxxx zone: cn-hangzhou-h ipv4: 192.168.x.x ipv4CIDR: 192.168.x.x/19 ipv6: 2408:x:x:x:x:x:x:x ipv6CIDR: 2408:x:x:x::/64 zone: cn-hangzhou-h status: eniInfos: eni-bp1xxxx: id: eni-bp1xxxx status: Bind vid: 1001 instanceID: i-bp1xxxx phase: Bind podLastSeen: "2021-xx-xxT00:00:00Z" trunkENIID: eni-bp1xxxx
Pod创建后为什么没有使用PodNetworking中的网络配置?
- 请确保PodNetworking资源状态为 - Ready。
- 请确保Pod标签和PodNetworking中的标签可以唯一匹配。 
- 如果您使用固定IP策略,则非StatefulSet控制器创建的Pod将无法被匹配。 
相关文档
- 您可以为弹性网卡(ENI)配置多个安全组,从而实现更灵活的Pod网络防火墙策略。具体操作,请参见为弹性网卡(ENI)配置多个安全组。 
- 在使用过程中遇到容器网络相关问题,请参见容器网络FAQ。