Terway Trunk ENI支持为每个Pod配置固定IP、独立的虚拟交换机、安全组,能提供精细化流量管理、流量隔离、网络策略配置和IP管理能力。本文介绍了如何在Terway网络中为Pod配置固定IP及独立虚拟交换机、安全组。

背景信息

弹性网卡中继Trunk ENI是一种可以绑定到专有网络VPC类型ECS实例上的虚拟网卡。相比弹性网卡ENI,Trunk ENI的实例资源密度明显提升。启用Terway Trunk ENI功能后,指定的Pod将使用Trunk ENI资源。

为Pod开启自定义配置是可选功能,默认情况下创建的Pod,未开启Terway Trunk ENI功能,使用的是共享ENI上的IP地址。只有当您主动声明为指定Pod开启自定义配置后,相应的Pod才能使用Pod自定义配置能力,Terway才可以同时使用共享ENI以及Trunk ENI为Pod分配IP。两种模式共享节点最大Pod数量配额,总部署密度和开启前一致。

使用限制

  • 在Terway网络中为Pod配置固定IP及独立虚拟交换机、安全组功能正在公测中,如需使用请提交工单申请。
  • 使用Terway插件,您需要选择较高规格和较新类型的ECS神龙机型,即5代或者6代的8核以上机型,且机型要支持Trunk ENI。更多信息,请参见实例规格族
  • 单节点所支持的最大Pod数取决于该节点的弹性网卡(ENI)数。共享ENI支持的最大Pod数=(ECS支持的ENI数-1)×单个ENI支持的私有IP数。
  • Pod安全组规则不会应用到同节点Pod间流量及同节点上节点与Pod间流量。如果您需要限制,可以通过NetworkPolicy进行配置。

步骤一:创建ACK集群

创建ACK集群,网络插件选择Terway,在Terway模式中选中Trunk ENI支持。详细信息,请参见创建Kubernetes专有版集群创建Kubernetes托管版集群

步骤二:创建网络定义

Terway增加一种名为PodNetworking的自定义资源来描述网络配置。您可以创建多个PodNetworking,来规划不同网络平面。在使用前您需要创建至少一个PodNetworking来描述网络配置。创建PodNetworking的示例如下:
apiVersion: network.alibabacloud.com/v1beta1
kind: PodNetworking
metadata:
  name: example
spec:
  allocationType:
    type: Elastic/Fixed
    releaseStrategy: TTL
    releaseAfter: "1h"
  selector:
    podSelector:
      matchLabels:
        foo: bar
    namespaceSelector:
      matchLabels:
        foo: bar
  securityGroupIDs:
  - sg-bpxxxx
  vSwitchOptions:
  - vsw-bpxxxx
status:
  status: Ready
                
参数说明如下:
参数 说明
allocationType

(描述Pod IP分配的策略)

type

取值范围:

  • Elastic:弹性IP策略。Pod删除后,IP资源被释放。
  • Fixed:固定IP策略。
    • 启用后该PodNetworking只对有状态(StatefulSet)的Pod生效。关于StatefulSet,请参见StatefulSet
    • 如果您使用了固定IP策略,Pod重建后的可用区将被添加约束,来确保和第一次调度的可用区匹配。
releaseStrategy IP回收策略,只有将type配置为Fixed,将releaseStrategy设置为TTL时有效。TTL是延迟回收模式,当Pod被删除一段时间后,才会释放IP,最小值为5 min。
releaseAfter 延迟回收时间。仅在releaseStrategyTTL模式下生效,支持时间格式为Go time type,例如2h45m5m0s。关于Go time type,请参见Go time type
selector

(用于配置标签选择器,被选中的Pod将使用该网络配置)

podSelector
  • 用来匹配Pod的Labels,匹配的Pod在创建时将使用这个网络配置。
  • 如果同时配置podSelectornamespaceSelector,符合全部匹配规则的Pod在创建时将使用这个网络配置。
  • 您在配置Pod标签与PodNetworking中的seclector时,请确保有唯一匹配关系,如果Pod被多个PodNetworking配置匹配,将使用任意匹配的PodNetworking配置。
namespaceSelector
  • 用来匹配Namespace的Labels,匹配的Pod在创建时将使用这个网络配置。
  • 如果同时配置podSelectornamespaceSelector,符合全部匹配规则的Pod在创建时将使用这个网络配置。
  • 您在配置Pod标签与PodNetworking中的seclector时,请确保有唯一匹配关系,如果Pod被多个PodNetworking配置匹配,将使用任意匹配的PodNetworking配置。
vSwitchOptions -
  • 用于配置Pod使用的vSwitch,多个vSwitchID之间为或关系。Pod仅能使用一个vSwitch,Terway将选择一个符合条件的vSwitch。
  • 您的Pod所在可调度可用区将被添加约束,来确保这些可用区和您配置的vSwitchOptions列表内资源所处的可用区一致。
  • 请确保vSwitchOptions中的vSwitch所在可用区,和您指定调度的节点可用区一致,并且拥有足够的剩余IP资源,否则Pod将创建失败。
securityGroupIDs - 可配置多个安全组ID,配置多个安全组时将同时生效,安全组数量小于等于5个。

创建PodNetworking资源后,Terway将同步网络配置信息,只有在status成为Ready后,该网络资源才能对Pod生效。

Elastic类型的网络配置示例

apiVersion: network.alibabacloud.com/v1beta1
kind: PodNetworking
metadata:
  name: example
spec:
  allocationType:
    type: Elastic
  selector:
    podSelector:
      matchLabels:
        foo: bar
  securityGroupIDs:
  - sg-bpxxxx
  vSwitchOptions:
  - vsw-bpxxxx
status:
  status: Ready

Fixed类型的网络配置示例

apiVersion: network.alibabacloud.com/v1beta1
kind: PodNetworking
metadata:
  name: example
spec:
  allocationType:
    type: Fixed
    releaseStrategy: TTL
    releaseAfter: "1h"
  selector:
    podSelector:
      matchLabels:
        foo: bar
  securityGroupIDs:
  - sg-bpxxxx
  vSwitchOptions:
  - vsw-bpxxxx
status:
  status: Ready

步骤三:创建Pod

创建Pod时,Pod将通过标签去匹配PodNetworking。如果Pod没有匹配到任何PodNetworking,则Pod将使用默认的共享ENI上的IP。如果Pod有匹配到PodNetworking,则将使用PodNetworking中定义的配置分配ENI。关于Pod标签的相关内容,请参见标签

Terway会为这类Pod创建相应的名为PodENI的自定义资源,用于跟踪Pod所使用的资源,该资源由Terway管理,您不可修改该资源。

常见问题

如何判断Pod是否使用了PodNetworking的网络配置?

  1. 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
  2. Terway将创建Pod同名、同命名空间的PodENI资源,用于记录所使用的网络配置信息。您可以通过以下方式查询。
    kubectl get podenis.network.alibabacloud.com your-pod-name -n default -oyaml
    apiVersion: network.alibabacloud.com/v1beta1
    kind: PodENI
    metadata:
      finalizers:
      - pod-eni
      generation: 1
      name: your-pod-name
      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中的网络配置?

  1. 请确保PodNetworking资源状态为Ready
  2. 请确保Pod标签和PodNetworking中的标签可以唯一匹配。
  3. 如果您使用固定IP策略,则非StatefulSet控制器创建的Pod将不能被匹配。