更新时间:2024-01-04 GMT+08:00

容器网络配置(NetworkAttachmentDefinition)

操作场景

CCE Turbo集群支持以命名空间粒度设置容器所在的容器子网及安全组,该功能通过名为NetworkAttachmentDefinition的CRD资源实现。如您想为指定的命名空间配置指定的容器子网和安全组,可创建自定义容器网络配置(NetworkAttachmentDefinition),并将该容器网络配置与相应的命名空间关联,进而实现业务的子网划分或业务安全隔离的述求。

约束与限制

  • 仅默认容器网络配置 default-network 支持开启网卡预热,使用自定义容器网络配置的Pod的创建速度相对使用默认容器网络配置的Pod会稍慢一些,因此不适用于极速Pod弹性场景。
  • 默认容器网络配置 default-network 不支持删除。
  • 如需删除创建的自定义容器网络配置(NetworkAttachmentDefinition),请先删除对应的命名空间下使用该配置创建的Pod(带有名为“cni.yangtse.io/network-status”的annotation),详情请参见删除网络配置

通过控制台创建命名空间类型的容器网络配置

  1. 登录CCE控制台。
  2. 单击集群名称进入集群,在左侧选择“配置中心”,选择“网络配置”页签。

    集群中存在默认容器网络配置default-network,对所有未配置自定义容器网络配置的Pod生效,“概览”页面的网络信息中的“默认容器子网”即为default-network中的容器子网。

  3. 查看“容器网络安全策略配置 (命名空间级别)”,单击“添加容器网络安全策略”,在弹窗中配置容器子网和安全组等信息。

    • 名称:自定义容器网络配置名称,最长支持253个字符。default-network、default、mgnt0、mgnt1四个名称为系统预留,请勿使用。
    • 命名空间:请选择您需要关联的命名空间。不同容器网络配置之间关联的命名空间不可重复。若无命名空间可选请单击后方的“创建命名空间”进行创建。
    • 容器子网:请选择子网。若无子网可选请单击后方的“创建子网”进行创建,创建完成后单击刷新按钮。最多可选择 20 个子网。
    • 关联安全组:默认为容器ENI安全组,您也可以选择单击后方的“创建安全组”进行创建,创建完成后单击刷新按钮。最多可选择5个安全组。

  4. 完成基本配置后单击“创建”,创建完成后页面自动返回到自定义容器网络配置列表,可以看到新创建的容器网络配置已在列表中。

通过kubectl命令行创建命名空间类型的容器网络配置

本节说明通过kubectl命令创建命名空间类型的NetworkAttachmentDefinition的方法。

  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 修改networkattachment-test.yaml。

    vi networkattachment-test.yaml

    apiVersion: k8s.cni.cncf.io/v1
    kind: NetworkAttachmentDefinition
    metadata:
      annotations:
        yangtse.io/project-id: 05e38**
      name: example
      namespace: kube-system
    spec:
      config: 
      '{
        "type":"eni-neutron",
        "args":{
          "securityGroups":"41891**",
          "subnets":[
            {
              "subnetID":"27d95**"
            }
          ]
        },
        "selector":{
          "namespaceSelector":{
            "matchLabels":{
              "kubernetes.io/metadata.name":"default"
            }
          }
        }
      }'
    表1 关键参数说明

    参数

    是否必填

    参数类型

    描述

    apiVersion

    String

    表示API的版本号。固定为 k8s.cni.cncf.io/v1。

    kind

    String

    创建的对象类别。固定为 NetworkAttachmentDefinition。

    yangtse.io/project-id

    String

    项目ID

    name

    String

    配置名称。

    namespace

    String

    配置资源所在命名空间,固定为 kube-system。

    config

    表2 config字段数据结构说明Object

    配置内容,为json格式的字符串。

    表2 config字段数据结构说明

    参数

    是否必填

    参数类型

    描述

    type

    String

    固定为eni-neutron。

    args

    表3 args字段数据结构说明

    Object

    配置参数。

    selector

    表4Object

    选择该配置所作用的命名空间。

    表3 args字段数据结构说明

    参数

    是否必填

    参数类型

    描述

    securityGroups

    String

    安全组ID。如果没有对安全组进行规划,请和default-network中的安全组保持一致。

    获取方式:

    登录虚拟私有云控制台,在左侧导航栏选择“访问控制 > 安全组”,单击安全组名称,在“基本信息”页签下找到“ID”字段复制即可。

    subnets

    Array of subnetID Objects

    容器子网ID列表,至少需填写一个,不可以为空,格式如下:

    [{"subnetID":"27d95**"},{"subnetID":"827bb**"},{"subnetID":"bdd6b**"}]

    同一VPC下非集群的子网ID。

    获取方式:

    登录虚拟私有云控制台,在左侧导航栏选择“虚拟私有云 > 子网”,单击子网名称,在“基本信息”页签下找到“子网ID”字段复制即可。

    表4 selector字段数据结构说明

    参数

    是否必填

    参数类型

    描述

    namespaceSelector

    matchLabels Object

    该选择器为Kubernetes标准的选择器,需填写命名空间标签,格式如下:

    "matchLabels":{
              "kubernetes.io/metadata.name":"default"
            }

    不同配置之间的命名空间不可重合。

  3. 创建NetworkAttachmentDefinition。

    kubectl create -f networkattachment-test.yaml

    回显如下,表示NetworkAttachmentDefinition已创建。

    networkattachmentdefinition.k8s.cni.cncf.io/example created

删除网络配置

您可以查看新添加网络配置的YAML,也可以对新添加的配置进行“删除”操作。

在删除网络配置时,需先删除该配置所对应的容器,否则将删除失败。

  1. 执行以下命令筛选集群中使用该配置的Pod(其中example为示例配置名称,请自行替换):
    kubectl get po -A -o=jsonpath="{.items[?(@.metadata.annotations.cni\.yangtse\.io/network-status=='[{\"name\":\"example\"}]')]['metadata.namespace', 'metadata.name']}"

    返回结果中包含了该配置关联的Pod名字及命名空间。

  2. 删除创建该Pod的Owner,其Owner可能为Deployment、StatefulSet、DaemonSet或Job类型的工作负载。