容器服务支持为 Pod 配置固定 IP,解决基于 Pod IP 的访问控制、服务注册、服务发现、日志审计等需求。本文为您介绍如何为 Pod 配置固定 IP。
说明
【邀测·申请试用】:该功能目前处于邀测阶段,如需使用,请提交申请。
容器服务支持在创建 VPC-CNI 网络模型的集群时开启 Trunk ENI 模式,开启后可以在 Trunk ENI 节点中为 Pod 配置独占弹性网卡,并指定 Pod 的子网和安全组。
当 Pod 配置独占网卡时,支持为 Pod 配置固定 IP。方便用户针对具体的 Pod IP 配置访问控制、服务注册、服务发现、日志审计等。配置固定 IP 涉及的 CRD 资源对象和作用如下:
说明
集群配置步骤的关键配置项如下,其他参数按需配置即可。
配置项 | 说明 |
---|---|
容器网络模型 | 配置集群的容器网络(CNI)方案,本场景必须选择 VPC-CNI。 |
Trunk ENI | 默认关闭。开启后,可基于 Trunk ENI 支持 Pod 独占弹性网卡,提供 Pod 绑定安全组、指定子网调度等高级能力。本场景必须 开启 此配置。 |
说明
如果您集群中没有该选项,或者该选项被置灰,不可配置,说明您的集群没有开启 Trunk ENI 功能或者组件的版本不正确,详情请参见前文的描述。
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 分配模式,取值:
|
releaseStrategy | 当 | IP 回收策略,该参数仅在
说明 当配置为 | |
releaseAfter | 当type 为Fixed 时,必选 | IP 延迟回收时间。仅在releaseStrategy 为TTL 时有效。表示 Pod 删除后,IP 地址的延迟回收时间。时间格式为 Go time type,例如2h35m 、3m0s 等。Go time type 格式的详情,请参见 Go time type。取值为0 表示立即回收。 | |
securityGroupIDs | - | 是 | 配置安全组 ID。允许配置多个安全组,配置多个安全组时将同时生效。 |
subnetIDs | - | 是 | 配置 VPC 中的子网 ID,允许配置多个子网 ID。包括:集群 Pod 子网中的部分或全部子网、集群 Pod 子网中未指定但属于指定 VPC ID 的其他子网 ID。 |
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
字段中的详细参数说明如下所示。
参数 | 是否必选 | 说明 | |
---|---|---|---|
ipResource | name | 是 | 指定网络资源的名称,需要与 VPCENIDefinition 对象的配置一致。 |
type | 是 | 指定网络资源的类型,固定为VPCENIDefinition 。 | |
selectors | podSelector | 否 | 用于匹配 Pod 的 Labels,匹配的 Pod 在创建时将使用ipResource 指定的网络资源。 |
namespaceSelector | 否 | 用于匹配 Namespace 的 Labels,匹配的 Namespace 中所有 Pod 在创建时都将使用ipResource 指定的网络资源。 |
注意
podSelector
和namespaceSelector
非必选,允许基于期望的匹配方式配置。但至少需要配置 1 个参数,否则功能无法生效。selectors
为 List 结构,支持配置多个命名空间标签和 Pod 标签。每个 Item 支持同时配置命名空间标签和 Pod 标签。系统支持以下方式配置 Pod 独占弹性网卡,包括:
说明
命名空间标签和 Pod 标签可以独立使用,若同时配置了命名空间标签和 Pod 标签,最终匹配结果取交集。
您可以在创建命名空间时,添加 PodNetworkDefinition 对象中定义的标签(例如:foo: bar
),为 Namespace 中的全部 Pod 提供独占网卡能力。示例如下:
apiVersion: v1 kind: Namespace metadata: name: namespace-demo # 命名空间的名称 labels: foo: bar # 添加 PodNetworkDefinition 对象中定义的标签
您可以在创建 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 已经配置独占弹性网卡。
在 Pod 详情页面,选择 网卡 页签,可以查看独占网卡的相关信息。