You need to enable JavaScript to run this app.
导航
为 Pod 配置固定 IP
最近更新时间:2024.03.01 14:07:23首次发布时间:2024.01.16 22:23:11

容器服务支持为 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 选择信息等。

alt

使用限制

  • Trunk ENI 特性仅支持在 VPC-CNI 容器网络模型的集群中使用。
  • Trunk ENI 特性仅支持在创建集群时进行配置,集群创建后不支持修改。
  • 目前只支持 StatefulSet 类型或无 ownerReferences 的 Pod 配置固定 IP,暂不支持 Deployment、DaemonSet 等其他类型的工作负载配置 Pod 固定 IP。

前提条件

  • 集群已安装 vpc-cni 组件,并升级至 v1.6.0 及以上版本。
  • 集群已安装 vpc-cni-controlplane 组件,并升级至 v1.3.3 及以上版本。

说明

组件的版本说明和升级方式,请参见 组件发布记录升级组件

操作步骤

步骤一:创建集群并配置 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. 确认新建集群信息和计费准确无误后,阅读 《容器服务专用服务条款》 并勾选同意,单击 确定 ,开始创建集群。

步骤二:开启 Pod 固定 IP 功能

  1. 集群创建完成后,单击目标集群名称,进入集群管理页面。
  2. 在左侧导航栏选择 组件管理
  3. 选择 网络 页签,找到 vpc-cni-controlplane 组件,单击 配置,并开启 Pod 固定 IP 功能。

alt

  1. 单击 确定,完成配置。

说明

如果您集群中没有该选项,或者该选项被置灰,不可配置,说明您的集群没有开启 Trunk ENI 功能或者组件的版本不正确,详情请参见前文的描述。

步骤三:创建 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:
    releaseAfter: 3m0s # 必选,Pod 删除后,IP 的延迟回收时间,取值为 0 表示“立即回收”。仅在 releaseStrategy 为 TTL 时有效
    releaseStrategy: TTL # 必选,IP 回收策略,取值为 TTL(延迟回收)和 Never(永不回收)。当配置为 Never 时,releaseAfter 的配置无效
    type: Fixed # 必选,IP 分配模式,Fixed 表示固定分配模式
  securityGroupIDs: 
  - sg-rrhowl*** # 必选,Pod 默认安全组
  subnetIDs:
  - subnet-13f64*** # 必选,指定 VPC 中的子网 ID
  - subnet-13fy9***

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

参数是否必选说明
vpcID-集群所属私有网络(VPC)ID。

allocateType

type

IP 分配模式,取值:

  • Elastic:弹性 IP 策略。Pod 删除后,IP 资源会同步释放。
  • Fixed:固定 IP 策略。

releaseStrategy

typeFixed时,必选

IP 回收策略,该参数仅在typeFixed时有效。取值:

  • TTL:延迟回收。系统会基于releaseAfter的配置延迟回收 IP 地址。
  • Never:永不回收。系统不会自动回收 IP 地址,当您无需使用 IP 时,需要手工删除 PodENI 资源。

说明

当配置为Never时,releaseAfter的配置无效。

releaseAftertypeFixed时,必选IP 延迟回收时间。仅在releaseStrategyTTL时有效。表示 Pod 删除后,IP 地址的延迟回收时间。时间格式为 Go time type,例如2h35m3m0s等。Go time type 格式的详情,请参见 Go time type。取值为0表示立即回收。
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
  namespace: default
spec:
  ipResource:
    name: vpceni-default # 必选,自定义的 VPCENIDefinition 对象名称,与上一步中配置的一致
    type: VPCENIDefinition  # 必选,指定网络资源类型,固定值
  selectors:
  - podSelector:
      matchLabels:
        foo: bar # 可选,PodNetworkDefinition 对象中定义的 Pod 标签,用于匹配指定的 Pod,独占弹性网卡并配置固定 IP
    namespaceSelector:
      matchLabels:
        foo: bar # 可选,PodNetworkDefinition 对象中定义的 Namespace 标签,用于匹配指定的 Namespace,为 Namespace 中的全部 Pod 提供独占弹性网卡并配置固定 IP

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 才会被分配弹性网卡和固定 IP。
  • 配置多个 Item 时,多个 Item 之间为 并集 关系。如果您同时配置了多个 Item,则 Pod 只要匹配上任意一个 Item 定义的标签,Pod 就会被分配弹性网卡和固定 IP。

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

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

  • 命名空间标签:通过匹配 Namespace 的标签,为 Namespace 中的全部 Pod 提供独占网卡能力。
  • Pod 标签:通过匹配 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

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

注意

目前只支持 StatefulSet 类型或无 ownerReferences 的 Pod 配置固定 IP,暂不支持 Deployment、DaemonSet 等其他类型的工作负载配置 Pod 固定 IP。

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

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: statefulset-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 配置独占弹性网卡。

说明

使用固定 IP 时,网卡的 AZ 信息会在 Pod 第一次创建时确定。如果 Pod 发生重建,则 Pod 会被调度到第一次所在节点的 AZ,实现自动亲和。

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

alt

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