大规模场景可以通过独占网卡提升 Pod 间网络通信的性能表现,同时也可以为 Pod 网卡绑定独立的安全组,解决 Pod 间网络隔离的场景需求。本文为您介绍如何配置 Pod 独占弹性网卡。
背景信息
容器服务支持在 VPC-CNI 网络模型的集群中开启 Trunk ENI 模式,在 Trunk ENI 节点中为 Pod 提供独占弹性网卡资源,并指定 Pod 的子网和安全组。
大规模场景可以通过独占网卡提升 Pod 间网络通信的性能表现,同时也可以为 Pod 网卡绑定独立的安全组,解决 Pod 间网络隔离的场景需求。Trunk ENI 特性的主要能力如下:
- 支持 Pod 主网卡独占 Trunk ENI 能力,基于安全组提供网卡级别的网络流量隔离能力。
- 支持指定自定义网段为 Pod ENI 分配 IP,满足精细化流量隔离需求场景。
-
配置 Pod 独占弹性网卡涉及的 CRD 资源对象包括:
- VPCENIDefinition 对象:用来定义 ENI 的 VPC IPAM 配置信息。包括 VPC ID、IP 分配模式、安全组、子网 ID 等。
- PodNetworkDefinition 对象:用来定义 Pod 的网络配置,包含所使用的 IPAM 信息,Pod 选择信息等。
-
使用限制
- 仅支持在 VPC-CNI 容器网络模型的集群中使用。
- 开启 Trunk ENI 特性后,节点会占用一张 ENI 作为 Trunk 网卡。因此 Pod 可申请使用的共享 IP 数会对应减少。
- 使用 Trunk ENI 特性无法预先申请网卡,因此与共享 IP 相比,创建和删除的速度会有一定下降。
操作步骤
步骤一:开启 Trunk ENI
说明
本文仅介绍创建集群时开启 Trunk ENI 的关键配置,包括:开启 Trunk ENI 配置、安装 vpc-cni-controlplane 组件。创建集群的其他详细配置,请参见:创建集群。 - 在集群列表页面,单击左上角 创建集群,跳转到集群创建页面的 集群配置 步骤,完成后单击 下一步:节点池配置。
-
- 在 节点池配置 步骤,按需配置即可,完成后单击 下一步:组件配置。
- 在组件配置步骤,将默认安装 vpc-cni-controlplane 组件,其他组件按需配置即可,完成后单击 下一步:确认配置。
-
- 确认新建集群信息和计费准确无误后,阅读 《容器服务专用服务条款》 并勾选同意,单击 确定 ,开始创建集群。
说明
如需在存量集群中开启 Trunk ENI,需要确保集群满足以下条件:
- 创建集群时,容器网络的网络模式为 共享弹性网卡。
- vpc-cni 组件版本已升级至 1.8.10 及以上版本。详情请参见 vpc-cni。
- 在左侧导航栏中选择 集群,单击目标集群名称,进入集群管理页面。
- 在 集群网络配置 中,勾选 开启 Trunk ENI。在弹出的确认框中,单击 确定。
-
- 在左侧导航栏中选择 组件管理,并选择 网络 页签。
- 找到 vpc-cni 组件,将鼠标悬停在组件卡片上,单击 配置,打开组件配置页面。
-
- 若 vpc-cni 组件为 v1.9.6 及以上版本,单击确认后,系统会自动重启组件,使得配置生效。
- 若 vpc-cni 组件为 v1.9.6 以下版本,则需要您 通过 kubectl 连接集群,并执行以下命令,滚动重启 Cello Pod,使得配置生效。
注意
为保障业务稳定性,建议在业务低峰期执行上述组件重启操作。
步骤二:创建 VPCENIDefinition 对象
创建 VPCENIDefinition 对象,配置示例和重点参数说明,如下所示:
spec字段中的详细参数说明如下所示。
步骤三:创建 PodNetworkDefinition 对象
创建 PodNetworkDefinition 对象,配置示例和重点参数说明,如下所示:
spec字段中的详细参数说明如下所示。
注意
- podSelector和namespaceSelector非必选,允许基于期望的匹配方式配置。但至少需要配置 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 提供独占网卡能力。
配置命名空间标签
创建 Pod 并添加标签
创建工作负载并添加标签
您可以在创建命名空间时,添加 PodNetworkDefinition 对象中定义的标签(例如:foo: bar),为 Namespace 中的全部 Pod 提供独占网卡能力。示例如下:
您可以在创建 Pod 时,添加 PodNetworkDefinition 对象中定义的标签(例如:foo: bar),为该 Pod 提供独占网卡能力。示例如下:
您可以在创建工作负载时,添加 PodNetworkDefinition 对象中定义的标签(例如:foo: bar),为该 Pod 提供独占网卡能力。以无状态负载为例,示例如下:
结果验证
配置完成后,匹配 PodNetworkDefinition 对象 Label 的 Pod 被系统自动补全 Pod Annotation(包括:ENI request/limit),Pod 将被调度到支持 Trunk 的节点上,并为 Pod 配置独占弹性网卡。
如下图所示,系统自动补全 Annotation k8s.volcengine.com/network-status,则表示已经为 Pod 配置独占弹性网卡。
在 Pod 详情页面,选择 网卡 页签,可以查看独占网卡的相关信息。