为Pod配置固定IP及独立虚拟交换机、安全组

如果您希望为ACK集群提供精细化的流量管理、流量隔离、网络策略配置和IP管理能力,可以通过使用Terway弹性网卡中继为每个Pod配置固定IP、独立的虚拟交换机或安全组来实现。

背景信息

弹性网卡中继(Trunk ENI)是一种新的虚拟网卡。除了提供原有弹性网卡(ENI)相同的功能外,还支持将额外的ENI挂载到Trunk ENI上使用。这部分额外的ENI将以独占的方式分配给Pod。

在为集群启用Trunk ENI功能后,可以让一部分Pod使用自定义配置,另外的Pod则使用共享配置。Pod自定义配置是可选功能,默认情况下创建的Pod使用的是共享ENI上的IP地址。只有当您主动声明为指定Pod开启自定义配置后,相应的Pod才能使用自定义配置。

启用Pod自定义配置后,集群内将部署terway-controlplane组件,其工作模式如下图所示。

image

使用限制

  • 如果您的集群为ACK专有集群,需到配额平台申请容器网络支持Terway ENI Trunking模式。

  • 使用Terway插件Trunk功能,您需要选择支持Trunk功能,且响应参数为EniTrunkSupported=true的实例。关于实例支持情况,请参见DescribeInstanceTypes

  • 单节点所支持的Pod数量有限制,关于节点所支持容器网络Pod数量的详细描述,请参见使用Terway网络插件

  • Pod安全组规则不会应用到同节点Pod之间的流量以及同节点上节点与Pod之间的流量。如果您需要限制,可以通过NetworkPolicy进行配置。

步骤一:为集群启用Trunk ENI功能

ACK专有集群需要额外申请Trunk实例使用权限,请向ECS提交工单申请。ACK托管集群无需额外申请Trunk实例使用权限。

为新建集群启用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提交工单申请即可使用Trunk ENI功能。

  • 对于存量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功能

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面,单击网络页签,找到terway-eniip组件。

  4. terway-eniip卡片,单击升级,升级terway-eniip组件到最新版本。

    如果卡片上没有升级字样,说明当前组件已经是最新版本,请跳过此步骤。

  5. 开启terway-enniip。

    1. 执行如下命令,编辑eni-config。

      kubectl edit cm -nkube-system eni-config
    2. 编辑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
    3. 执行如下命令,重启terway pods,使配置生效。

      kubectl delete pod -n kube-system -l app=terway-eniip
  6. 请在terway-eniip参数配置完成后,在组件管理页面的网络页签,安装terway-controlplane组件。

    安装结束后,在terway-controlplane卡片上可以看到已安装字样。

步骤二:创建网络自定义资源PodNetworking

Terway增加一种名为PodNetworking的自定义资源来描述网络配置。您可以创建多个PodNetworking来规划不同的网络平面。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 自定义资源

  3. 自定义资源页面,单击使用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
    status:
      status: Ready               

    参数说明如下:

    参数

    说明

    allocationType

    (描述Pod IP分配的策略)

    type

    取值范围:

    • Elastic:弹性IP策略。Pod删除后,IP资源被释放。

    • Fixed:固定IP策略。

      启用后,该PodNetworking只对有状态(StatefulSet)的Pod生效。关于StatefulSet,请参见Kubernetes有状态服务-StatefulSet使用最佳实践

      说明

      如果您使用了固定IP策略,Pod重建后的可用区将被添加约束,来确保和第一次调度的可用区匹配。

    releaseStrategy

    IP释放策略,只有将type配置为Fixed时,该参数才有效。参数取值范围如下。

    • TTL:延迟释放IP策略。当Pod被删除一段时间后,才会释放IP,最小值为5分钟。

    • Never:不释放IP策略。当您无需使用IP时,需要自行删除PodENI资源。

    releaseAfter

    延迟回收时间。仅在releaseStrategyTTL模式下生效,支持时间格式为Go time type,例如2h45m5m0s。关于Go time type,请参见Go time type

    selector

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

    podSelector

    • 用来匹配Pod的Labels,匹配的Pod在创建时将使用这个网络配置。

    • 如果同时配置podSelectornamespaceSelector,符合全部匹配规则的Pod在创建时将使用这个网络配置。

    • 您在配置Pod标签与PodNetworking中的selector时,请确保有唯一匹配关系,如果Pod被多个PodNetworking配置所匹配,将使用任一匹配的PodNetworking配置。

    namespaceSelector

    • 用来匹配Namespace的Labels,匹配的Pod在创建时将使用这个网络配置。

    • 如果同时配置podSelectornamespaceSelector,符合全部匹配规则的Pod在创建时将使用这个网络配置。

    • 您在配置Pod标签与PodNetworking中的selector时,请确保有唯一匹配关系,如果Pod被多个PodNetworking配置匹配,将使用任意匹配的PodNetworking配置。

    vSwitchOptions

    -

    • 用于配置Pod使用的vSwitch,多个vSwitchID之间为的关系。Pod仅能使用一个vSwitch,Terway将选择一个符合条件的vSwitch。

    • 您的Pod部署的可用区将被添加约束,来确保这些可用区保持和您配置的vSwitchOptions列表中的可用区一致。

    • 请确保vSwitchOptions中的vSwitch所在可用区与您指定调度的节点可用区一致,并且拥有足够的剩余IP资源,否则Pod将无法创建。

    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开始支持。

  4. 单击创建

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

    执行以下命令,查看资源状态是否ready

    kubectl describe PodNetworking example # 请将example换成您自己的自定义资源名称。

可选步骤一:为命名空间添加匹配标签

在部署PodNetworking自定义资源后,需要为指定命名空间增加匹配的标签,确保与PodNetworking的规则相匹配。

  1. 执行以下命令,创建测试命名空间example。

    kubectl create ns example
  2. 执行以下命令,为命名空间打上foo=bar标签。

    kubectl label namespaces example foo=bar  # 请将example换成您自己指定命名空间名称。
  3. 执行以下命令,查看命名空间的标签。

    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标签的更多信息,请参见标签

  1. 使用以下示例应用的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
  2. 执行以下命令,部署示例应用my-nginx。部署完成后,验证操作请参见如何判断Pod是否使用了PodNetworking的网络配置?

    kubectl apply -f my-nginx.yaml

ACK专有集群迁移时,停止terway-controlplane

ACK专有集群在启用Pod自定义配置后,不能直接迁移到ACK集群Pro版。您需要在迁移前停止terway-controlplane,并在迁移后启用terway-controlplane。

  1. 迁移前准备。

    1. 执行以下命令,停止terway-controlplane。

      kubectl scale deploy -nkube-system terway-controlplane --replicas 0
    2. 执行以下命令,完成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
  2. 迁移集群完成后,检查迁移结果。

    说明

    关于迁移集群的具体操作,请参见热迁移ACK专有集群至ACK集群Pro版

    • 如果迁移集群失败,执行以下命令,恢复webhook和terway-controlplane。

      # 恢复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
  3. 组件管理页面安装terway-controlplane。具体操作,请参见管理组件

常见问题

如何判断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将无法被匹配。

相关文档