You need to enable JavaScript to run this app.
导航

为 Pod 绑定独立 EIP

最近更新时间2024.03.01 14:07:20

首次发布时间2023.10.11 17:24:42

容器服务支持为 Pod 提供独立的公网出/入口,能够满足单个或少量 Pod 公网互通的场景,而且有效解决 Pod 间公网带宽争抢的问题。本文为您介绍如何为 Pod 绑定公网 IP。

说明

邀测·申请试用】:该功能目前处于邀测阶段,如需使用,请提交申请。

前提条件

  • 已创建 VPC-CNI 网络模型的集群,详情请参见 创建集群
  • 已通过 kubectl 连接目标集群。详情请参见 连接集群
  • 为 Pod 绑定已有 EIP 前,需要首先完成创建 EIP 实例。详情请参见 申请公网 IP

使用限制

  • 该特性仅支持在 VPC-CNI 容器网络模型场景下使用。
  • EIP 特性开启后不支持关闭;vpc-cni-controlplane 组件安装后,暂不允许卸载。
  • 确保账户余额不低于 100 元(含代金券,且除去代金券后余额不为零),能够正常创建 EIP 资源。
  • 单个火山引擎账号、单个地域下,默认最多可申请的 EIP 数量为 20 个。若默认配额无法满足需求,请前往 配额中心 ,申请提升配额。
  • 单个火山引擎账号、单个地域下,每天最多可以创建请求的数量为可申请 EIP 数量的 2 倍。
  • 单个火山引擎账号、单个地域下,每天最多可以绑定请求的数量为可申请 EIP 数量的 3 倍。

步骤一:安装组件

  1. 登录 容器服务控制台
  2. 在左侧导航栏中选择 集群,单击目标集群。
  3. 在集群管理页面的左侧导航栏中,选择 组件管理
  4. 选择 网络 页签,将鼠标移动到 vpc-cni-controlplane 组件上,单击右上角的 ... > 安装
    alt
  5. 在弹出的配置框内开启 Pod 绑定公网 IP 功能。
    alt

    说明

    若存量集群已经安装 vpc-cni-controlplane 组件,请确保组件已经升级到 v1.3.0 及以上版本。详情请参见 升级组件

  6. 单击 确定,完成组件安装。

步骤二:为 Pod 绑定独立 EIP

容器服务通过实例注解(Annotation)方式为 Pod 配置 EIP。支持绑定已有 EIP,也支持创建新的 EIP 并绑定到 Pod 网卡。

注意

  • 绑定已有 EIP 时,请确保待绑定的 EIP 可用,若 EIP 已经被其他资源绑定,则无法继续绑定到 Pod。
  • 若通过配置工作负载的方式为 Pod 绑定 EIP,仅对 Deployment、StatefulSet、Job、CronJob 生效,不对 DaemonSet 生效。
  • 若通过配置工作负载的方式为 Pod 绑定已有 EIP,当副本数超过 1 时,只有其中一个 Pod 会被绑定 EIP。
  • 为 Pod 绑定独立 EIP 时,不区分 Pod 是否调度到普通节点还是 VCI 节点上。

绑定已有 EIP

配置工作负载时为 Pod 绑定已有 EIP

以无状态负载为例,您可以在配置时添加 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-idStringPod 绑定的已有 EIP 实例 ID。

配置 Pod 时绑定已有 EIP

您可以在配置 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

新建 EIP 并绑定

注意

  • 删除 Pod 时,与其绑定的 EIP 会自动同步删除,再次创建并绑定的 EIP 的公网地址可能不同,请谨慎操作。
  • 请勿自行更改 VKE 创建的 EIP 实例,例如:转换 EIP 实例的计费项。否则可能导致 VKE 无法同步删除 EIP 资源,导致资源残留。详情请参见 清理 VKE 创建的 EIP 实例

配置工作负载时创建 EIP 并与 Pod 绑定

以无状态负载为例,您可以在配置时添加 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,
          "projectName": "default",
          "bandwidthPackageId": "bwp-2d63yyj3ki4u858oz***"
        }'
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx 
        image: nginx:latest
        ports:
        - containerPort: 80 

Annotation 说明如下表所示。

字段类型是否必选说明
vke.volcengine.com/primary-eip-allocateStringEIP 申请策略,固定为'{"type": "Elastic"}'
vke.volcengine.com/primary-eip-attributesString创建并绑定 EIP。

primary-eip-attributes中的参数说明如下表所示。

字段类型是否必选说明
nameStringEIP 名称,未指定时由系统自动生成。
descriptionStringEIP 描述信息。

isp

String

EIP 线路类型,取值:

  • BGP:(默认值)BGP(多线)。
  • ChinaMobile:中国移动静态单线。
  • ChinaTelecom:中国电信静态单线。
  • ChinaUnicom:中国联通静态单线。
  • SingleLine_BGP:BGP 单线。
  • Static_BGP:静态 BGP。

注意

BGP(多线) 外,其他线路类型均为 EIP 产品的邀测功能,如需使用,请 提交工单 或联系客户经理申请。

billing-type

Integer

EIP 计费方式,取值:

  • 2:(默认值)按量计费-按带宽上限计费。
  • 3:按量计费-按实际流量计费。
projectNameStringEIP 所属项目名称,默认为 default。

bandwidthPackageId

String

共享带宽包 ID。

说明

共享带宽包是一种支持复用和共享带宽的云资源。将单个地域内多个公网 IP 或 IPv6 公网带宽添加到一个共享带宽包实例中,共享一条带宽,可以帮助您降低公网带宽的使用成本。详情请参见 什么是共享带宽包

配置 Pod 时创建 EIP 并与 Pod 绑定

您可以在配置 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 Ready 状态

由于 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 -E '[0-9]+' /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 状态

Pod 为Running状态后,您可以检查 Pod 和与 EIP 的绑定状态。绑定完成后,系统将为 Pod 打上vke.volcengine.com/allocated-eips等 annotation,可以以此来验证 Pod 的 Ready 状态。如下图所示。
alt

vke.volcengine.com/allocated-eips字段中的参数说明如下所示。

参数类型示例说明
EipIdStringeip-2yynbg1qt***EIP 实例 ID。
EipAddressString1.x.x.xEIP 实例公网地址。
EniIdStringeni-2yz4c3ppm***Pod 实例的弹性网卡 ID。
EniIpString192.168.1.10Pod 实例的弹性网卡的私网 IPv4 地址。

查看 EIP 信息

登录 公网 IP 控制台,在 公网访问 > 公网 IP 列表中,可以查看到与 Pod 绑定的 EIP 实例。
alt

通过 EIP 访问 Pod

通过公网访问 Pod 中部署的应用(例如:Nginx),若可以正常访问,则表示 Pod 配置的独立 EIP 可以正常工作。

参考信息

清理 VKE 创建的 EIP 实例

如果您自行更改了 VKE 创建的 EIP 实例规格,则 Pod 被删除时,VKE 不会自动同步删除 EIP 实例,从而导致 EIP 资源残留。此时,您可以使用 EIP 中的特定标签,在 EIP 控制台中查找并手工清理 VKE 创建的 EIP 实例。标签说明如下表所示:

标签键标签值
volc:vke:cluster-id-<cluster-id>cluster-id
volc:vke:createdby-vke-flagtrue
volc:vke:enieip-name<enieip-name>
volc:vke:enieip-namespace<enieip-namespace>

说明

enieip 为 VKE 集群中的 CRD 资源,您可以在 VKE 集群 工作负载 > 对象浏览器 中查看该资源的信息。详情请参见 对象浏览器

VKE 创建的 EIP 实例信息示例,如下所示:
alt