使用容器网络配置为命名空间/工作负载绑定子网及安全组
操作场景
CCE Turbo集群支持以命名空间或工作负载粒度设置容器所在的容器子网及安全组,该功能通过名为NetworkAttachmentDefinition的CRD资源实现。如您想为指定的命名空间或工作负载配置指定的容器子网和安全组,可创建自定义容器网络配置(NetworkAttachmentDefinition),并将该容器网络配置与相应的命名空间或工作负载关联,进而实现业务的子网划分或业务安全隔离的诉求。
维度 |
容器网络配置(NetworkAttachmentDefinition)关联的资源类型 |
|
---|---|---|
命名空间 |
工作负载 |
|
容器网络划分维度说明 |
为命名空间关联容器网络配置,该命名空间下创建的所有工作负载使用相同的子网配置跟安全组配置 |
为工作负载关联容器网络配置,指定了相同容器网络配置的工作负载使用相同的子网配置跟安全组配置 |
支持的集群版本 |
仅在CCE Turbo集群中可用,且集群为1.23.8-r0、1.25.3-r0及以上版本 |
仅在CCE Turbo集群中可用,且集群为1.23.11-r0、1.25.6-r0、1.27.3-r0、1.28.1-r0及以上版本 |
约束限制 |
同一个命名空间最多只能被关联到一个容器网络配置 |
只能指定未关联命名空间的自定义容器网络配置 |
- Pod使用的容器网络配置优先级如下:Pod直接关联的容器网络配置 > Pod的命名空间关联的容器网络配置 > 集群默认容器网络配置(default-network)。
- 集群中存在默认容器网络配置default-network,对所有未配置自定义容器网络配置的Pod生效,“总览”页面的网络信息中的“默认容器子网”即为default-network中的容器子网。default-network不支持删除。
- 当集群中只有一个容器网络配置,该容器网络配置即为默认容器网络配置;当集群中有多个容器网络配置时,带有名为“yangtse.io/default-network: true”annotation的容器网络配置即为默认容器网络配置。当集群中不存在默认容器网络配置时,未关联任何容器网络配置的Pod创建后由于无法分配到网卡而启动失败。
约束与限制
- 仅默认容器网络配置支持开启容器网卡动态预热。当节点的网卡配额耗尽时,使用自定义容器网络配置的Pod会尝试解绑默认容器网络配置的预热网卡,绑定该自定义容器网络配置的网卡,此时Pod的启动速度会更慢;因此当您频繁使用自定义容器网络配置时,强烈建议您关闭集群级别的全局容器网卡动态预热。如您还有使用默认容器网络配置的Pod极速弹性述求,请结合调度,合理规划节点池级别的容器网卡动态预热配置。
- 已开启固定IP的工作负载,如果需要关联新的容器网络配置,Pod重建时,固定IP功能会失效。请删除工作负载并释放已经固定的IP,然后重新创建工作负载。
- 如需删除创建的自定义容器网络配置(NetworkAttachmentDefinition),请先删除对应的命名空间下使用该配置创建的Pod(带有名为“cni.yangtse.io/network-status”的annotation),详情请参见删除网络配置。
创建命名空间类型的容器网络配置
创建命名空间类型的容器网络配置后,关联命名空间下创建的所有工作负载使用相同的子网配置跟安全组配置。
- 登录CCE控制台。
- 单击集群名称进入集群,在左侧选择“配置中心”,选择“网络配置”页签。
- 查看“自定义容器网络配置”,单击“添加自定义容器网络配置”,在弹窗中配置容器子网和安全组等信息。
- 名称:自定义容器网络配置名称,最长支持63个字符。default-network、default、mgnt0、mgnt1四个名称为系统预留,请勿使用。
- 关联资源类型:自定义容器网络配置关联的资源类型,详情请参见表1。创建命名空间类型的容器网络配置请选择“命名空间”类型。
- 命名空间:请选择您需要关联的命名空间。不同容器网络配置之间关联的命名空间不可重复。若无命名空间可选请单击后方的“创建命名空间”进行创建。
- 容器子网:请选择子网。若无子网可选请单击后方的“创建子网”进行创建,创建完成后单击刷新按钮。
- 关联安全组:默认为容器ENI安全组,您也可以选择单击后方的“创建安全组”进行创建,创建完成后单击刷新按钮。最多可选择5个安全组。
图2 创建命名空间类型的容器网络配置
- 完成基本配置后单击“确定”,创建完成后页面自动返回到自定义容器网络配置列表,可以看到新创建的容器网络配置已在列表中。
图3 容器网络配置列表
本节说明通过kubectl命令创建命名空间类型的NetworkAttachmentDefinition的方法。
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 修改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" } } } }
表2 关键参数说明 参数
是否必填
参数类型
描述
apiVersion
是
String
表示API的版本号。固定为 k8s.cni.cncf.io/v1。
kind
是
String
创建的对象类别。固定为 NetworkAttachmentDefinition。
yangtse.io/project-id
是
String
当前所在Region的项目ID,获取方式请参见获取项目ID。
name
是
String
配置名称。
namespace
是
String
配置资源所在命名空间,固定为 kube-system。
config
是
表2 config字段数据结构说明Object
配置内容,为json格式的字符串。
表3 config字段数据结构说明 参数
是否必填
参数类型
描述
type
是
String
固定为eni-neutron。
args
否
Object
配置参数。
selector
否
表5Object
选择该配置所作用的命名空间。
表4 args字段数据结构说明 参数
是否必填
参数类型
描述
securityGroups
否
String
安全组ID。如果没有对安全组进行规划,请和default-network中的安全组保持一致。
获取方式:
登录虚拟私有云控制台,在左侧导航栏选择“访问控制 > 安全组”,单击安全组名称,在“基本信息”页签下找到“ID”字段复制即可。
subnets
是
Array of subnetID Objects
容器子网ID列表,至少需填写一个,不可以为空,格式如下:
[{"subnetID":"27d95**"},{"subnetID":"827bb**"},{"subnetID":"bdd6b**"}]
同一VPC下非集群的子网ID。
获取方式:
登录虚拟私有云控制台,在左侧导航栏选择“虚拟私有云 > 子网”,单击子网名称,在“基本信息”页签下找到“子网ID”字段复制即可。
- 创建NetworkAttachmentDefinition。
kubectl create -f networkattachment-test.yaml
回显如下,表示NetworkAttachmentDefinition已创建。
networkattachmentdefinition.k8s.cni.cncf.io/example created
创建工作负载类型的容器网络配置
创建工作负载类型的容器网络配置后,需要为工作负载关联容器网络配置,指定了相同容器网络配置的工作负载使用相同的子网配置跟安全组配置。
- 登录CCE控制台。
- 单击集群名称进入集群,在左侧选择“配置中心”,选择“网络配置”页签。
- 查看“自定义容器网络配置”,单击“添加自定义容器网络配置”,在弹窗中配置容器子网和安全组等信息。
- 名称:自定义容器网络配置名称,最长支持63个字符。default-network、default、mgnt0、mgnt1四个名称为系统预留,请勿使用。
- 关联资源类型:自定义容器网络配置关联的资源类型,详情请参见表1。创建工作负载类型的容器网络配置请选择“工作负载”类型。
- 容器子网:请选择子网。若无子网可选请单击后方的“创建子网”进行创建,创建完成后单击刷新按钮。
- 关联安全组:默认为容器ENI安全组,您也可以选择单击后方的“创建安全组”进行创建,创建完成后单击刷新按钮。最多可选择5个安全组。
图4 创建工作负载类型的容器网络配置
- 完成基本配置后单击“确定”,创建完成后页面自动返回到自定义容器网络配置列表,可以看到新创建的容器网络配置已在列表中。
图5 容器网络配置列表
- 在创建工作负载时,可选择自定义的容器网络配置。
本节说明通过kubectl命令创建工作负载类型的NetworkAttachmentDefinition的方法。
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 修改networkattachment-test.yaml。
vi 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
配置名称。
namespace
是
String
配置资源所在命名空间,固定为 kube-system。
config
是
表2 config字段数据结构说明Object
配置内容,为json格式的字符串。
表8 args字段数据结构说明 参数
是否必填
参数类型
描述
securityGroups
否
String
安全组ID。如果没有对安全组进行规划,请和default-network中的安全组保持一致。
获取方式:
登录虚拟私有云控制台,在左侧导航栏选择“访问控制 > 安全组”,单击安全组名称,在“基本信息”页签下找到“ID”字段复制即可。
subnets
是
Array of subnetID Objects
容器子网ID列表,至少需填写一个,不可以为空,格式如下:
[{"subnetID":"27d95**"},{"subnetID":"827bb**"},{"subnetID":"bdd6b**"}]
同一VPC下非集群的子网ID。
获取方式:
登录虚拟私有云控制台,在左侧导航栏选择“虚拟私有云 > 子网”,单击子网名称,在“基本信息”页签下找到“子网ID”字段复制即可。
- 创建NetworkAttachmentDefinition。
kubectl create -f networkattachment-test.yaml
回显如下,表示NetworkAttachmentDefinition已创建。
networkattachmentdefinition.k8s.cni.cncf.io/example created
- 创建工作负载(此处创建Deployment类型的工作负载),并关联刚创建的容器网络配置。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 3 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。
验证命名空间/工作负载是否绑定容器网络配置
您可以通过以下步骤确认工作负载是否成功绑定容器网络配置中的子网和安全组。如果需要验证命名空间是否绑定容器网络配置,您可以查看该命名空间中的具体工作负载是否绑定子网和安全组。
- 验证子网是否绑定成功。
- 查看工作负载中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>
- 进入网络控制台,右侧导航栏单击“虚拟私有云 > 子网”,单击对应的子网名称。
- 单击“IP地址管理”,“IP地址管理”中若有Pod对应的IP地址则说明子网绑定成功。
图8 查看子网绑定的IP地址
- 查看工作负载中Pod对应的IP地址。
- 验证安全组是否绑定成功。
- 返回网络控制台,右侧导航栏单击“访问控制 > 安全组”,单击对应的安全组名称。
- 单击“关联实例”,当前页签中单击“辅助弹性网卡”。
- “辅助弹性网卡”页签中,若私有IP地址列表有Pod对应的IP地址,则说明安全组绑定成功。
图9 查看安全组绑定的IP地址
删除网络配置
您可以查看新添加网络配置的YAML,也可以对新添加的配置进行“删除”操作。
在删除网络配置时,需先删除该配置所对应的容器,否则将删除失败。
- 执行以下命令筛选集群中使用该配置的Pod(其中example为示例配置名称,请自行替换):
kubectl get pod -A -o=jsonpath="{.items[?(@.metadata.annotations.cni\.yangtse\.io/network-status=='[{\"name\":\"example\"}]')]['metadata.namespace', 'metadata.name']}"
返回结果中包含了该配置关联的Pod名字及命名空间。
- 删除创建该Pod的Owner,其Owner可能为Deployment、StatefulSet、DaemonSet或Job类型的工作负载。