文档首页/ 云容器引擎 CCE_Autopilot集群/ 用户指南/ 网络/ 容器网络/ 使用容器网络配置为命名空间/工作负载绑定子网及安全组
更新时间:2024-11-25 GMT+08:00
分享

使用容器网络配置为命名空间/工作负载绑定子网及安全组

操作场景

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

图1 自定义容器网络配置示意图
目前容器网络配置(NetworkAttachmentDefinition)支持关联的资源类型对比如下:
表1 关联资源类型对比

维度

容器网络配置(NetworkAttachmentDefinition)关联的资源类型

命名空间

工作负载

容器网络划分维度说明

为命名空间关联容器网络配置,该命名空间下创建的所有工作负载使用相同的子网配置跟安全组配置。

为工作负载关联容器网络配置,指定了相同容器网络配置的工作负载使用相同的子网配置跟安全组配置。

支持的Autopilot集群版本

v1.27.8-r0, v1.28.6-r0及以上版本。

v1.27.8-r0, v1.28.6-r0及以上版本。

约束限制

同一个命名空间最多只能被关联到一个容器网络配置。

只能指定未关联命名空间的自定义容器网络配置。

  • Pod使用的容器网络配置优先级如下:Pod直接关联的容器网络配置 > Pod的命名空间关联的容器网络配置 > 集群默认容器网络配置(default-network)。
  • 集群中存在默认容器网络配置default-network,对所有未配置自定义容器网络配置的Pod生效,“总览”页面的网络信息中的“默认容器子网”即为default-network中的容器子网。default-network不支持删除。

约束与限制

如需删除创建的自定义容器网络配置(NetworkAttachmentDefinition),请先删除对应的命名空间下使用该配置创建的Pod(带有名为“cni.yangtse.io/network-status”的annotation),详情请参见删除网络配置

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

创建命名空间类型的容器网络配置后,该命名空间下创建的所有工作负载使用相同的子网配置跟安全组配置。

  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 创建YAML文件networkattachment-test.yaml,用于创建自定义容器网络配置并关联命名空间,文件名称可自定义。

    vim 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"
            }
          }
        }
       }
    表2 关键参数说明

    参数

    是否必填

    参数类型

    描述

    apiVersion

    String

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

    kind

    String

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

    yangtse.io/project-id

    String

    当前所在Region的项目ID,获取方式请参见获取项目ID

    name

    String

    配置名称,可自定义。名称由小写字母、数字、横线(-)和点组成,且必须以字母或数字开头和结尾,最长支持63个字符。

    namespace

    String

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

    config

    Object

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

    config字段数据结构具体说明,请参见表2 config字段数据结构说明

    表3 config字段数据结构说明

    参数

    是否必填

    参数类型

    描述

    type

    String

    表示网络类型,固定为eni-neutron。

    args

    Object

    安全组和子网的配置参数。

    args字段数据结构具体说明,请参见表4

    selector

    Object

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

    selector字段数据结构具体说明,请参见表5

    表4 args字段数据结构说明

    参数

    是否必填

    参数类型

    描述

    securityGroups

    String

    需要配置的安全组ID,最多关联5条安全组。如果没有对安全组进行规划,请和default-network中的安全组保持一致。

    获取方式:

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

    subnets

    Array of subnetID Objects

    容器子网ID列表,至少需填写1个,最多可填写100个,具体格式如下:

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

    容器子网要求与集群在同一VPC下。

    获取方式:

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

    表5 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

通过kubectl命令行创建工作负载类型的容器网络配置

创建工作负载类型的容器网络配置后,需要为工作负载关联容器网络配置,关联相同容器网络配置的工作负载将使用相同的子网配置跟安全组配置。

  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 创建YAML文件networkattachment-test.yaml,用于自定义容器网络配置,文件名称可自定义。

    vim networkattachment-test.yaml

    文件内容如下:

    apiVersion: k8s.cni.cncf.io/v1
    kind: NetworkAttachmentDefinition
    metadata:
      annotations:
        yangtse.io/project-id: 80d5a**    
      name: example                       
      namespace: kube-system                     
    spec:
      config: |
       {
        "type":"eni-neutron",                    
        "args":{
          "securityGroups":"f4983**",   
          "subnets":[
            {
              "subnetID":"5594b**"       
            }
          ]
        }
       }
    表6 关键参数说明

    参数

    是否必填

    参数类型

    描述

    apiVersion

    String

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

    kind

    String

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

    yangtse.io/project-id

    String

    当前所在Region的项目ID,获取方式请参见获取项目ID

    name

    String

    配置名称,可自定义。名称由小写字母、数字、横线(-)和点组成,且必须以字母或数字开头和结尾,最长支持63个字符。

    namespace

    String

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

    config

    Object

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

    config字段数据结构具体说明,请参见表7

    表7 config字段数据结构说明

    参数

    是否必填

    参数类型

    描述

    type

    String

    表示网络类型,固定为eni-neutron。

    args

    Object

    安全组和子网的配置参数。

    args字段数据结构具体说明,请参见表8

    表8 args字段数据结构说明

    参数

    是否必填

    参数类型

    描述

    securityGroups

    String

    需要配置的安全组ID,最多关联5条安全组。如果没有对安全组进行规划,请和default-network中的安全组保持一致。

    获取方式:

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

    subnets

    Array of subnetID Objects

    容器子网ID列表,至少需填写1个,最多可填写100个,具体格式如下:

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

    容器子网要求与集群在同一VPC下。

    获取方式:

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

  3. 创建NetworkAttachmentDefinition。

    kubectl create -f networkattachment-test.yaml

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

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

  4. 创建YAML文件deploy.yaml,用于创建工作负载并关联刚创建的容器网络配置(此处创建Deployment类型的工作负载),文件名称可自定义。

    vim deploy.yaml

    文件内容如下:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
            yangtse.io/network: "example"  # 自定义容器网络配置名称,便于通过label查找所有关联此容器网络配置的Pod        
          annotations:
            yangtse.io/network: "example"  # 自定义容器网络配置名称
        spec:
          containers:
            - name: container-0
              image: nginx:alpine
              resources:
                limits:
                  cpu: 100m
                  memory: 200Mi
                requests:
                  cpu: 100m
                  memory: 200Mi
          imagePullSecrets:
            - name: default-secret
    • yangtse.io/network:指定的自定义容器网络配置名称,只能指定未关联命名空间的容器网络配置。请在label上同时添加此参数,便于通过label查找所有关联此容器网络配置的Pod。

      yangtse.io/network指定的自定义容器网络配置名称与networkattachment-test.yaml中name值一致。

  5. 创建Deployment。

    kubectl create -f deploy.yaml

    回显如下:

    deployment.apps/nginx created

验证命名空间/工作负载是否绑定容器网络配置

本节主要介绍如何确认工作负载是否成功绑定容器网络配置中的子网和安全组。如果您需要验证命名空间级别的绑定情况,可以通过该命名空间中的具体工作负载实现,验证步骤与本节一致。

  1. 验证子网是否绑定成功。

    1. 查看工作负载中Pod对应的IP地址。
      kubectl get pod -o wide

      回显结果如下:

      NAME                     READY   STATUS    RESTARTS   AGE     IP              NODE                                   NOMINATED NODE   READINESS GATES
      nginx-85dbdb8c5d-ng5bb   1/1     Running   0          5d18h   192.168.60.5   ca50a5ae-e1ef-41c6-b3fc-6ebcd10a1e07   <none>           <none>
    2. 进入网络控制台,左侧导航栏单击“虚拟私有云 > 子网”,单击对应的子网名称。
    3. 单击“IP地址管理”“IP地址管理”中若有Pod对应的IP地址则说明子网绑定成功。
      图2 查看子网绑定的IP地址

  2. 验证安全组是否绑定成功。

    1. 返回网络控制台,左侧导航栏单击“访问控制 > 安全组”,单击对应的安全组名称。
    2. 单击“关联实例”,当前页签中单击“辅助弹性网卡”
    3. “辅助弹性网卡”页签中,若私有IP地址列表有Pod对应的IP地址,则说明安全组绑定成功。
      图3 查看安全组绑定的IP地址

删除网络配置

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

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

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

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

  2. 删除创建该Pod的Owner,其Owner可能为Deployment、StatefulSet、Job和CronJob类型的工作负载。
    kubectl delete deployment nginx

    回显如下:

    deployment.apps "nginx" deleted
  3. 删除创建的容器网络配置。
    kubectl delete -f networkattachment-test.yaml -n kube-system

    回显如下:

    networkattachmentdefinition.k8s.cni.cncf.io "example" deleted

相关文档