为Pod配置EIP
使用场景
云原生网络2.0网络模式下,Pod使用的是VPC的弹性网卡/辅助弹性网卡,可直接绑定弹性公网IP。
为方便用户在CCE内直接为Pod关联弹性公网IP,用户只需在创建Pod时,配置annotation(yangtse.io/pod-with-eip: "true"),弹性公网IP就会随Pod自动创建并绑定至该Pod。
前提条件
您已创建一个CCE Turbo集群,且集群版本满足以下要求:
为Pod配置EIP场景 |
集群版本要求 |
---|---|
EIP跟随Pod创建 |
|
Pod使用已有EIP |
v1.23集群:v1.23.16-r0及以上版本 v1.25集群:v1.25.11-r0及以上版本 v1.27集群:v1.27.8-r0及以上版本 v1.28集群:v1.28.6-r0及以上版本 v1.29集群:v1.29.2-r0及以上版本 v1.29以上版本集群 |
约束限制
- 绑定EIP的Pod,如果要被公网成功访问,需要添加放通相应请求流量的安全组规则。
- 单个Pod只能绑定单个EIP。
- 创建Pod时,可指定相关的annotation配置EIP的属性,创建完成后,更新EIP相关的annotation均无效。
- 与Pod关联的EIP不要通过弹性公网IP的console或API直接操作(修改名称/删除/解绑/绑定/转包周期等操作),否则可能导致EIP功能异常。
- 自动创建的EIP被手动删除后,会导致网络异常,需要重建Pod。
EIP跟随Pod创建
创建Pod时,填写pod-with-eip的annotation后,EIP会随Pod自动创建并绑定至该Pod。
- 自动创建EIP时,系统会自动为该EIP添加集群ID、命名空间、Pod名称的标签。
- 当自动创建EIP的Pod被删除时,自动创建的EIP会随Pod一起被删除。
以下示例创建一个名为nginx的无状态负载,EIP将随Pod自动创建并绑定至Pod。具体字段含义请参见表2。
- 创建Deployment时自动创建独占带宽类型的EIP,无需指定带宽ID,示例如下:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx annotations: yangtse.io/pod-with-eip: "true" # EIP跟随Pod创建 yangtse.io/eip-bandwidth-size: "5" # EIP带宽 yangtse.io/eip-network-type: 5_bgp # EIP类型 yangtse.io/eip-charge-mode: bandwidth # EIP计费模式 yangtse.io/eip-bandwidth-name: <eip_bandwidth_name> # EIP带宽名称 spec: containers: - name: container-0 image: nginx:alpine resources: limits: cpu: 100m memory: 200Mi requests: cpu: 100m memory: 200Mi imagePullSecrets: - name: default-secret
表1 独占带宽EIP跟随Pod创建的annotation配置 annotation
是否可选
默认值
参数说明
取值范围
yangtse.io/pod-with-eip
必选
false
是否需要跟随Pod创建EIP并绑定到该Pod。
"false"或"true"
yangtse.io/eip-bandwidth-size
可选
5
带宽大小,单位为Mbit/s。
具体范围以各区域配置为准,根据带宽的计费类型不同可能存在差异,详情请参见弹性公网IP控制台的购买页面。
例如,“亚太-新加坡”区域按带宽计费类型的带宽大小范围为1Mbit/s~2000Mbit/s、按流量计费类型的带宽大小范围为1Mbit/s~300Mbit/s。
yangtse.io/eip-network-type
可选
5_bgp
公网IP类型。
具体类型以各区域配置为准,详情请参见弹性公网IP控制台的购买页面。
例如,“亚太-新加坡”区域支持以下类型:
- 5_bgp:全动态BGP
yangtse.io/eip-charge-mode
可选
空
按流量计费或按带宽计费。
建议填写该参数。若该参数为空,表示不指定计费模式,则以该区域下弹性公网IP接口的默认值为准。
- bandwidth:按带宽计费
- traffic:按流量计费
yangtse.io/eip-bandwidth-name
可选
Pod名称
带宽名称。
- 1-64个字符,支持数字、字母、中文、_(下划线)、-(中划线)、.(点)
- 最小长度:1
- 最大长度:64
- 创建Deployment时自动创建共享带宽类型的EIP,必须指定共享带宽ID,示例如下:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx annotations: yangtse.io/pod-with-eip: "true" # EIP跟随Pod创建 yangtse.io/eip-network-type: 5_bgp # EIP类型 yangtse.io/eip-bandwidth-id: <eip_bandwidth_id> # EIP共享带宽ID spec: containers: - name: container-0 image: nginx:alpine resources: limits: cpu: 100m memory: 200Mi requests: cpu: 100m memory: 200Mi imagePullSecrets: - name: default-secret
表2 共享带宽类型EIP跟随Pod创建的annotation配置 annotation
是否可选
默认值
参数说明
取值范围
yangtse.io/pod-with-eip
必选
false
是否需要跟随Pod创建EIP并绑定到该Pod。
"false"或"true"
yangtse.io/eip-network-type
可选
5_bgp
公网IP类型。
- 5_bgp
- 5_union
- 5_sbgp
具体类型以各区域配置为准,详情请参见弹性公网IP控制台。
yangtse.io/eip-bandwidth-id
使用共享型带宽时必选
空
已有的带宽ID。
- 不填写该字段时,则默认使用独占带宽的EIP。独占带宽EIP的参数设置请参见表1。
- 填写该字段时,只允许同时指定yangtse.io/eip-network-type字段,且该字段为可选。
-
Pod使用已有EIP
创建Pod时,填写yangtse.io/eip-id的annotation后,EIP会随Pod自动完成绑定。
- 已有EIP绑定Pod后,系统会自动为该EIP添加集群ID、命名空间、Pod名称的标签。
- 当使用已有EIP的Pod被删除时,已有EIP会保留。系统会自动删除绑定EIP时添加的标签(集群ID、命名空间、Pod名称)。
以下示例创建一个名为nginx的实例数为1的无状态负载,EIP将随Pod自动绑定至Pod。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
annotations:
yangtse.io/eip-id: <eip_id> # 已有EIP的ID
spec:
containers:
- name: container-0
image: nginx:alpine
resources:
limits:
cpu: 100m
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
imagePullSecrets:
- name: default-secret
annotation |
是否可选 |
参数说明 |
---|---|---|
yangtse.io/eip-id |
必选 |
弹性公网IP的ID。 获取方法: 登录弹性公网IP控制台,在弹性公网IP列表单击需要绑定的EIP名称,找到“ID”字段复制即可。 |
检查Pod的EIP就绪
容器网络控制器会在Pod IP分配后,为Pod绑定EIP并回写分配结果至Pod的annotation(yangtse.io/allocated-ipv4-eip),Pod业务容器的启动时间可能早于EIP分配结果回写成功时间。
您可以尝试为Pod配置init container并使用downwardAPI类型的存储卷把yangtse.io/allocated-ipv4-eip的annotation通过volume挂载到init container里,并在init container中检查EIP是否已经分配成功。您可以参考以下示例配置init container。
apiVersion: v1 kind: Pod metadata: name: example annotations: yangtse.io/pod-with-eip: "true" yangtse.io/eip-bandwidth-size: "5" yangtse.io/eip-network-type: 5_bgp yangtse.io/eip-charge-mode: bandwidth yangtse.io/eip-bandwidth-name: "xxx" spec: initContainers: - name: init image: busybox:latest command: ['timeout', '60', 'sh', '-c', "until grep -E '[0-9]+' /etc/eipinfo/allocated-ipv4-eip; do echo waiting for allocated-ipv4-eip; sleep 2; done"] volumeMounts: - name: eipinfo mountPath: /etc/eipinfo volumes: - name: eipinfo downwardAPI: items: - path: "allocated-ipv4-eip" fieldRef: fieldPath: metadata.annotations['yangtse.io/allocated-ipv4-eip'] ...