容器服务支持为 Pod 配置固定 IP,解决基于 Pod IP 的访问控制、服务注册、服务发现、日志审计等需求。本文介绍如何为 Pod 配置固定 IP。
背景信息
容器服务支持在创建 VPC-CNI 网络模型的集群时开启 Trunk ENI 模式,开启后可以在 Trunk ENI 节点中为 Pod 配置独占弹性网卡,并指定 Pod 的子网和安全组。
当 Pod 配置独占网卡时,支持为 Pod 配置固定 IP。方便用户针对具体的 Pod IP 配置访问控制、服务注册、服务发现、日志审计等。配置固定 IP 涉及的 CRD 资源对象和作用如下:
- VPCENIDefinition 对象:该对象用来定义 ENI 的 VPC IPAM 配置信息。包括 VPC ID、IP 分配模式、安全组、子网 ID 等。
- PodNetworkDefinition 对象:该对象用来定义 Pod 的网络配置,包含所使用的 IPAM 信息,Pod 选择信息等。
-
使用限制
- Trunk ENI 特性仅支持在 VPC-CNI 容器网络模型的集群中使用。
操作步骤
说明
本文仅介绍创建集群时开启 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,使得配置生效。
注意
为保障业务稳定性,建议在业务低峰期执行上述组件重启操作。
步骤二:开启 Pod 固定 IP 功能
- 集群创建完成后,单击目标集群名称,进入集群管理页面。
- 选择 网络 页签,找到 vpc-cni-controlplane 组件,单击 配置,并开启 Pod 固定 IP 功能。
-
说明
如果您集群中没有该选项,或者该选项被置灰,不可配置,说明您的集群没有开启 Trunk ENI 功能或者组件的版本不正确,详情请参见前文的描述。
步骤三:创建 VPCENIDefinition 对象
创建 VPCENIDefinition 对象,配置示例和重点参数说明,如下所示:
spec字段中的详细参数说明如下所示。
步骤四:创建 PodNetworkDefinition 对象
创建 PodNetworkDefinition 对象,配置示例和重点参数说明,如下所示:
spec字段中的详细参数说明如下所示。
注意
- podSelector和namespaceSelector非必选,允许基于期望的匹配方式配置。但至少需要配置 1 个参数,否则功能无法生效。
- selectors为 List 结构,支持配置多个命名空间标签和 Pod 标签。每个 Item 支持同时配置命名空间标签和 Pod 标签。
- 配置多个 Item 时,每个 Item 内部为 交集 关系。如果您同时配置了命名空间标签和 Pod 标签,则只有 Pod 和其所在的命名空间同时匹配上对应的标签时,Pod 才会被分配弹性网卡和固定 IP。
- 配置多个 Item 时,多个 Item 之间为 并集 关系。如果您同时配置了多个 Item,则 Pod 只要匹配上任意一个 Item 定义的标签,Pod 就会被分配弹性网卡和固定 IP。
步骤五:配置 Pod 独占弹性网卡
系统支持以下方式配置 Pod 独占弹性网卡,包括:
- 命名空间标签:通过匹配 Namespace 的标签,为 Namespace 中的全部 Pod 提供独占网卡能力。
- Pod 标签:通过匹配 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 配置独占弹性网卡。
说明
使用固定 IP 时,网卡的 AZ 信息会在 Pod 第一次创建时确定。如果 Pod 发生重建,则 Pod 会被调度到第一次所在节点的 AZ,实现自动亲和。
如下图所示,系统自动补全k8s.volcengine.com/eni-ip-status等 Annotation,表示 Pod 已经配置独占弹性网卡。
在 Pod 详情页面,选择 网卡 页签,可以查看独占网卡的相关信息。
删除并重建 Pod,可以看到 Pod 的 IP 地址不变,即实现了为 Pod 配置固定 IP。