You need to enable JavaScript to run this app.
导航

基于 Trunk ENI 支持 Pod 独占弹性网卡

最近更新时间2024.03.01 14:07:17

首次发布时间2023.08.25 16:23:30

大规模场景可以通过独占网卡提升 Pod 间网络通信的性能表现,同时也可以为 Pod 网卡绑定独立的安全组,解决 Pod 间网络隔离的场景需求。本文为您介绍如何配置 Pod 独占弹性网卡。

说明

邀测·申请试用】:该功能目前处于邀测阶段,如需使用,请提交申请。

背景信息

容器服务支持在创建 VPC-CNI 网络模型的集群时开启 Trunk ENI 模式,开启后可以在 Trunk ENI 节点中为 Pod 提供独占弹性网卡资源,并指定 Pod 的子网和安全组。

大规模场景可以通过独占网卡提升 Pod 间网络通信的性能表现,同时也可以为 Pod 网卡绑定独立的安全组,解决 Pod 间网络隔离的场景需求。Trunk ENI 特性的主要能力如下:

  • 支持 Pod 主网卡独占 Trunk ENI 能力,基于安全组提供网卡级别的网络流量隔离能力。
  • 支持指定自定义网段为 Pod ENI 分配 IP,满足精细化流量隔离需求场景。

alt

配置 Pod 独占弹性网卡涉及的 CRD 资源对象包括:

  • VPCENIDefinition 对象:该对象用来定义 ENI 的 VPC IPAM 配置信息。包括 VPC ID、IP 分配模式、安全组、子网 ID 等。
  • PodNetworkDefinition 对象:该对象用来定义 Pod 的网络配置,包含所使用的 IPAM 信息,Pod 选择信息等。

alt

使用限制

  • Trunk ENI 特性仅支持在 VPC-CNI 容器网络模型的集群中使用。
  • Trunk ENI 特性仅支持在创建集群时进行配置,集群创建后不支持修改。

操作步骤

步骤一:创建集群并配置 Trunk ENI

说明

本步骤仅介绍了创建集群时 Trunk ENI 特性的关键配置,包括:开启 Trunk ENI 配置、安装 vpc-cni-controlplane 组件。创建集群的其他详细配置,请参见:创建集群

  1. 登录 容器服务控制台
  2. 在集群管理页面的左侧导航栏,选择 集群
  3. 在集群列表页面,单击左上角 创建集群,跳转到集群创建页面的 集群配置 步骤,完成后单击 下一步:节点池配置

alt

集群配置步骤的关键配置项如下,其他参数按需配置即可。

配置项说明
容器网络模型配置集群的容器网络(CNI)方案,本场景必须选择 VPC-CNI
Trunk ENI默认关闭。开启后,可基于 Trunk ENI 支持 Pod 独占弹性网卡,提供 Pod 绑定安全组、指定子网调度等高级能力。本场景必须 开启 此配置。
  1. 节点池配置 步骤,按需配置即可,完成后单击 下一步:组件配置
  2. 在组件配置步骤,将默认安装 vpc-cni-controlplane 组件,其他组件按需配置即可,完成后单击 下一步:确认配置

alt

  1. 确认新建集群信息和计费准确无误后,阅读 《容器服务专用服务条款》 并勾选同意,单击 确定 ,开始创建集群。

步骤二:创建 VPCENIDefinition 对象

  1. 单击目标集群名称,在左侧导航栏选择 工作负载 > 对象浏览器
  2. 在对象浏览器管理页面,单击 使用 Yaml 创建,创建 VPCENIDefinition 对象。
    • 在 类型 下拉菜单中选择 自定义
    • 在 Yaml 配置框内输入 Yaml 配置。
apiVersion: network.volcengine.com/v1beta1
kind: VPCENIDefinition
metadata:
  name: vpceni-default # 自定义 VPCENIDefinition 对象名称
  namespace: default
spec:
  vpcID: vpc-rr1s2d*** # 必选,集群所属私有网络(VPC)的 ID
  allocateType:
    type: Elastic # 必选,IP 分配模式,Elastic 表示弹性分配模式
  securityGroupIDs: 
  - sg-rrhowl*** # 必选,Pod 默认安全组
  subnetIDs:
  - subnet-13f64*** # 必选,指定 VPC 中的子网 ID。包括:集群 Pod 子网中的部分或全部子网、集群 Pod 子网中未指定但属于指定 VPC ID 的其他子网 ID
  - subnet-13fy9***

spec字段中的详细参数说明如下所示。

参数是否必选说明
vpcID-集群所属私有网络(VPC)ID。
allocateTypetypeIP 分配模式,本例中配置为 Elastic,表示弹性 IP 策略。Pod 删除后,IP 资源会同步释放。
securityGroupIDs-配置安全组 ID。允许配置多个安全组,配置多个安全组时将同时生效。
subnetIDs-配置 VPC 中的子网 ID,允许配置多个子网 ID。包括:集群 Pod 子网中的部分或全部子网、集群 Pod 子网中未指定但属于指定 VPC ID 的其他子网 ID。

步骤三:创建 PodNetworkDefinition 对象

  1. 在左侧导航栏选择 工作负载 > 对象浏览器
  2. 在对象浏览器管理页面,单击 使用 Yaml 创建,创建 PodNetworkDefinition 对象。
    • 在 类型 下拉菜单中选择 自定义
    • 在 Yaml 配置框内输入 Yaml 配置。
apiVersion: network.volcengine.com/v1beta1
kind: PodNetworkDefinition
metadata:
  name: vpceni1 # 自定义 PodNetworkDefinition 对象名称
  namespace: default # PodNetworkDefinition 对象所在的命名空间
spec:
  ipResource:
    name: vpceni-default # 自定义的 VPCENIDefinition 对象名称,与上一步中配置的一致
    type: VPCENIDefinition # 必选,指定网络资源类型,固定值
  selectors:
  - podSelector:
      matchLabels:
        foo: bar # PodNetworkDefinition 对象中定义的 Pod 标签,用于匹配指定的 Pod,实现 Pod 独占弹性网卡
    namespaceSelector:
      matchLabels:
        foo: bar # PodNetworkDefinition 对象中定义的 Namespace 标签,用于匹配指定的 Namespace,为 Namespace 中的全部 Pod 提供独占网卡能力

spec字段中的详细参数说明如下所示。

参数是否必选说明
ipResourcename指定网络资源的名称,需要与 VPCENIDefinition 对象的配置一致。
type指定网络资源的类型,固定为VPCENIDefinition
selectorspodSelector用于匹配 Pod 的 Labels,匹配的 Pod 在创建时将使用ipResource指定的网络资源。
namespaceSelector用于匹配 Namespace 的 Labels,匹配的 Namespace 中所有 Pod 在创建时都将使用ipResource指定的网络资源。

注意

  • podSelectornamespaceSelector非必选,允许基于期望的匹配方式配置。但至少需要配置 1 个参数,否则功能无法生效。
  • selectors为 List 结构,支持配置多个命名空间标签和 Pod 标签。每个 Item 支持同时配置命名空间标签和 Pod 标签。
  • 配置多个 Item 时,每个 Item 内部为 交集 关系。如果您同时配置了命名空间标签和 Pod 标签,则只有 Pod 和其所在的命名空间同时匹配上对应的标签时,Pod 才会被分配弹性网卡。
  • 配置多个 Item 时,多个 Item 之间为 并集 关系。如果您同时配置了多个 Item,则 Pod 只要匹配上任意一个 Item 定义的标签,Pod 就会被分配弹性网卡。

步骤四:配置 Pod 独占弹性网卡

系统支持以下方式配置 Pod 独占弹性网卡,包括:

  • 命名空间标签:通过匹配 Namespace 的标签,为 Namespace 中的全部 Pod 提供独占网卡能力。
  • Pod 标签:通过匹配 Pod 的标签,为指定 Pod 提供独占网卡能力。

方式一:配置命名空间标签

您可以在创建命名空间时,添加 PodNetworkDefinition 对象中定义的标签(例如:foo: bar),为 Namespace 中的全部 Pod 提供独占网卡能力。示例如下:

apiVersion: v1
kind: Namespace
metadata:
  name: namespace-demo # 命名空间的名称
  labels:
    foo: bar  # 添加 PodNetworkDefinition 对象中定义的标签

方式二:创建 Pod 并添加标签

您可以在创建 Pod 时,添加 PodNetworkDefinition 对象中定义的标签(例如:foo: bar),为该 Pod 提供独占网卡能力。示例如下:

apiVersion: v1
kind: Pod
metadata:
  name: pod-demo # Pod 名称
  namespace: default # Pod 所在命名空间
  labels:
    foo: bar  # 添加 PodNetworkDefinition 对象中定义的标签
spec:
  containers:
    - name: hello-pod 
      image: nginx:latest
      ports:
        - containerPort: 80

方式三:创建工作负载并添加标签

您可以在创建工作负载时,添加 PodNetworkDefinition 对象中定义的标签(例如:foo: bar),为该 Pod 提供独占网卡能力。以无状态负载为例,示例如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-demo # 工作负载的名称
  namespace: default # 工作负载所在的命名空间
spec:
  replicas: 1 
  selector:
    matchLabels:
      foo: bar
  template:
    metadata:
      labels:
        foo: bar
    spec:
      containers:
      - name: nginx 
        image: nginx:latest
        ports:
        - containerPort: 80 

结果验证

配置完成后,匹配 PodNetworkDefinition 对象 Label 的 Pod 被系统自动补全 Pod Annotation(包括:ENI request/limit),Pod 将被调度到支持 Trunk 的节点上,并为 Pod 配置独占弹性网卡。

如下图所示,系统自动补全 Annotation k8s.volcengine.com/network-status,则表示已经为 Pod 配置独占弹性网卡。

alt

在 Pod 详情页面,选择 网卡 页签,可以查看独占网卡的相关信息。
alt