容器服务支持为 Pod 提供独立的公网出/入口,能够满足单个或少量 Pod 公网互通的场景,而且有效解决 Pod 间公网带宽争抢的问题。本文为您介绍如何为 Pod 绑定公网 IP。
说明
【邀测·申请试用】:该功能目前处于邀测阶段,如需使用,请提交申请。
...
> 安装。说明
若存量集群已经安装 vpc-cni-controlplane 组件,请确保组件已经升级到 v1.3.0 及以上版本。详情请参见 升级组件。
容器服务通过实例注解(Annotation)方式为 Pod 配置 EIP。支持绑定已有 EIP,也支持创建新的 EIP 并绑定到 Pod 网卡。
注意
以无状态负载为例,您可以在配置时添加 Annotation,为 Pod 绑定独立 EIP。示例和说明如下:
apiVersion: apps/v1 kind: Deployment metadata: name: deployment-eip-demo # 工作负载的名称 namespace: default # 工作负载所在的命名空间 spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: annotations: vke.volcengine.com/primary-eip-id: "eip-rr67***" # Pod 绑定的已有 EIP 实例 ID labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
Annotation 说明如下表所示。
字段 | 类型 | 是否必选 | 说明 |
---|---|---|---|
vke.volcengine.com/primary-eip-id | String | 是 | Pod 绑定的已有 EIP 实例 ID。 |
您可以在配置 Pod 时添加 Annotation,为 Pod 绑定独立 EIP。示例和说明如下:
apiVersion: v1 kind: Pod metadata: name: pod-eip-demo # Pod 名称 namespace: default # Pod 所在命名空间 annotations: vke.volcengine.com/primary-eip-id: "eip-rr67***" # Pod 绑定的已有 EIP 实例 ID spec: containers: - name: hello-pod image: nginx:latest ports: - containerPort: 8080 # adjust port for your container
注意
以无状态负载为例,您可以在配置时添加 Annotation,创建新的 EIP 并与 Pod 绑定。示例和说明如下:
apiVersion: apps/v1 kind: Deployment metadata: name: deployment-eip-demo # 工作负载的名称 namespace: default # 工作负载所在的命名空间 spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: annotations: vke.volcengine.com/primary-eip-allocate: '{"type": "Elastic"}' # EIP 申请策略,固定值 vke.volcengine.com/primary-eip-attributes: '{ "name": "eip-demo", "description": "demo for pods eip", "isp": "BGP", "billingType": 2, "bandwidth": 100, "projectName": "default", "bandwidthPackageId": "bwp-2d63yyj3ki4u858oz***" }' labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
Annotation 说明如下表所示。
字段 | 类型 | 是否必选 | 说明 |
---|---|---|---|
vke.volcengine.com/primary-eip-allocate | String | 否 | EIP 申请策略,固定为'{"type": "Elastic"}' 。 |
vke.volcengine.com/primary-eip-attributes | String | 是 | 创建并绑定 EIP。 |
primary-eip-attributes
中的参数说明如下表所示。
字段 | 类型 | 是否必选 | 说明 |
---|---|---|---|
name | String | 否 | EIP 名称,未指定时由系统自动生成。 |
description | String | 否 | EIP 描述信息。 |
isp | String | 否 | EIP 线路类型,取值:
注意 除 BGP(多线) 外,其他线路类型均为 EIP 产品的邀测功能,如需使用,请 提交工单 或联系客户经理申请。 |
billing-type | Integer | 否 | EIP 计费方式,取值:
|
bandwidth | Integer | 否 | EIP 带宽上限,单位为 Mbps。
|
projectName | String | 否 | EIP 所属项目名称,默认为 default。 |
bandwidthPackageId | String | 否 | 共享带宽包 ID。 说明 共享带宽包是一种支持复用和共享带宽的云资源。将单个地域内多个公网 IP 或 IPv6 公网带宽添加到一个共享带宽包实例中,共享一条带宽,可以帮助您降低公网带宽的使用成本。详情请参见 什么是共享带宽包。 |
您可以在配置 Pod 时添加 Annotation,为 Pod 绑定独立 EIP。示例和说明如下:
apiVersion: v1 kind: Pod metadata: name: pod-eip-demo # Pod 名称 namespace: default # Pod 所在命名空间 annotations: vke.volcengine.com/primary-eip-allocate: '{"type": "Elastic"}' # EIP 申请策略,固定值 vke.volcengine.com/primary-eip-attributes: '{ "name": "eip-demo", "description": "demo for pods eip", "isp": "BGP", "billingType": 2, "projectName": "default", "bandwidthPackageId": "bwp-2d63yyj3ki4u858oz***" }' spec: containers: - name: hello-pod image: nginx:latest ports: - containerPort: 8080 # adjust port for your container
由于 Pod 创建和 EIP 绑定是一个异步的过程,控制器会在 Pod IP 分配后,为 Pod 配置 EIP 地址。因此,Pod 的 Ready 状态可能早于 EIP 绑定成功时间。您可以在 Pod 配置 init container,监控 Pod 的 Ready 状态,检查 EIP 是否已经绑定成功,配置参考如下:
说明
本例中的 busybox 为 init container 示例镜像,能够执行 command 命令的镜像均可,建议用小镜像。
apiVersion: v1 kind: Pod metadata: name: pod-eip-demo annotations: vke.volcengine.com/primary-eip-id: "eip-rr67***" ... spec: initContainers: - command: - timeout - "60" - sh - -c - until grep -i 'EipAddress' /etc/eipinfo/allocated-eips; do echo waiting for allocated-eips; sleep 1; done image: busybox:latest imagePullPolicy: Always name: init volumeMounts: - mountPath: /etc/eipinfo name: eipinfo volumes: - name: eipinfo downwardAPI: items: - path: "allocated-eips" fieldRef: fieldPath: metadata.annotations['vke.volcengine.com/allocated-eips'] ...
Pod 为Running
状态后,您可以检查 Pod 和与 EIP 的绑定状态。绑定完成后,系统将为 Pod 打上vke.volcengine.com/allocated-eips
等 annotation,可以以此来验证 Pod 的 Ready 状态。如下图所示。
vke.volcengine.com/allocated-eips
字段中的参数说明如下所示。
参数 | 类型 | 示例 | 说明 |
---|---|---|---|
EipId | String | eip-2yynbg1qt*** | EIP 实例 ID。 |
EipAddress | String | 1.x.x.x | EIP 实例公网地址。 |
EniId | String | eni-2yz4c3ppm*** | Pod 实例的弹性网卡 ID。 |
EniIp | String | 192.168.1.10 | Pod 实例的弹性网卡的私网 IPv4 地址。 |
登录 公网 IP 控制台,在 公网访问 > 公网 IP 列表中,可以查看到与 Pod 绑定的 EIP 实例。
通过公网访问 Pod 中部署的应用(例如:Nginx),若可以正常访问,则表示 Pod 配置的独立 EIP 可以正常工作。
如果您自行更改了 VKE 创建的 EIP 实例规格,则 Pod 被删除时,VKE 不会自动同步删除 EIP 实例,从而导致 EIP 资源残留。此时,您可以使用 EIP 中的特定标签,在 EIP 控制台中查找并手工清理 VKE 创建的 EIP 实例。标签说明如下表所示:
标签键 | 标签值 |
---|---|
volc:vke:cluster-id-<cluster-id> | cluster-id |
volc:vke:createdby-vke-flag | true |
volc:vke:enieip-name | <enieip-name> |
volc:vke:enieip-namespace | <enieip-namespace> |
说明
enieip 为 VKE 集群中的 CRD 资源,您可以在 VKE 集群 工作负载 > 对象浏览器 中查看该资源的信息。详情请参见 对象浏览器。
VKE 创建的 EIP 实例信息示例,如下所示: