Pod的IP地址一般是私网的IP地址,但是在ACK的Terway网络模式中,某些场景下的Pod需要独立的公网IP地址。本文介绍如何为Terway网络中的Pod挂载独立的公网EIP。

背景信息

一般情况下,Terway网络模式中的Pod访问公网的流量是通过主机SNAT(Source Network Address Translation)或者外部SNAT通过EIP而实现,对于Pod的公网入口流量一般是通过LoadBalancer类型的Service流入。在有的场景中Pod需要独立的公网地址,例如:
  • Pod的对外映射端口是随机的,一般常见于UDP(User Datagram Protocol)的游戏服务器或电话会议等。例如RTSP协议,对不同的客户端使用不同的端口。
  • Pod访问公网流量存在争抢,Pod需要独立的公网出口。

关于ACK集群Terway网络模式的更多信息,请参见使用Terway网络插件

步骤一:升级Terway组件至最新版本

您需升级Terway组件到支持EIP功能的版本。关于升级Terway组件的具体步骤,请参见管理组件

说明 目前Terway组件v1.0.10.280-gdc2cb6c-aliyun及以上版本支持EIP功能。建议您升级Terway组件至最新版本。

步骤二:为Terway部署EIP相关的配置和权限

Terway为Pod配置EIP需要EIP相关的权限去申请和配置EIP,所以需要部署额外的配置和权限。

为Terway模式的RAM角色配置EIP相关权限

  1. 为Terway模式的RAM角色配置EIP相关权限。

    对于专有版集群或者2020年06月份之前创建的托管版集群,Terway的权限是通过Worker节点上的RAM角色进行配置。

    1. 登录容器服务管理控制台
    2. 在控制台左侧导航栏中,单击集群
    3. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
    4. 单击集群资源页签,然后单击Worker RAM角色链接。
    5. 权限管理页签,单击目标授权策略名称,进入授权策略详情页面。
      授权策略详情
    6. 单击修改策略内容,从右侧滑出侧边栏修改策略内容面板,在策略内容Action字段中补充以下策略,然后单击确定
      修改策略内容
      "vpc:DescribeVSwitches",
      "vpc:AllocateEipAddress",
      "vpc:DescribeEipAddresses",
      "vpc:AssociateEipAddress",
      "vpc:UnassociateEipAddress",
      "vpc:ReleaseEipAddress"
      说明 在策略内容的任意一个Action字段的最后一行补充英文逗号()。

    对于Pro托管版集群,或者是2020年6月份及之后创建的标准托管版集群,Terway的权限是通过RAM角色AliyunCSManagedNetworkRole进行配置。

    您需要在RAM控制台中为这个角色添加以下EIP相关权限。
    "vpc:DescribeVSwitches",
    "vpc:AllocateEipAddress",
    "vpc:DescribeEipAddresses",
    "vpc:AssociateEipAddress",
    "vpc:UnassociateEipAddress",
    "vpc:ReleaseEipAddress"
    1. RAM角色AliyunCSManagedNetworkRole页面的RAM角色列表中,单击目标授权策略名称右侧的添加权限
    2. 添加权限面板的选择权限区域,单击+新建权限策略创建自定义策略。
      关于如何创建自定义策略,请参见创建自定义策略
    3. 在您创建的自定义权限策略中添加以下权限。
      关于如何修改自定义策略内容,请参见修改自定义策略内容
      "vpc:DescribeVSwitches",
      "vpc:AllocateEipAddress",
      "vpc:DescribeEipAddresses",
      "vpc:AssociateEipAddress",
      "vpc:UnassociateEipAddress",
      "vpc:ReleaseEipAddress"
  2. 部署Terway配置以支持EIP功能。
    1. 执行以下命令修改Terway的配置ConfigMap。
      kubectl edit cm eni-config -n kube-system
    2. eni_conf中增加以下内容。
      "enable_eip_pool": "true"
      注意 如果您希望在指定EIP的时候能够强制解绑之前的实例,还需要在eni_conf中增加参数"allow_eip_rob": "true"
    3. 执行以下命令重建Terway实例。
      kubectl delete pod -n kube-system -l app=terway-eniip

步骤三:通过注解为指定Pod创建和关联EIP

通过指定Pod中的annotations可以创建或者关联EIP到此Pod中。根据不同场景,配置注解方式如下:
  • 自动分配EIP场景
    • 添加以下注解,为Pod创建并绑定一个EIP:
      k8s.aliyun.com/pod-with-eip: "true"
      示例YAML如下。
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx-deployment-basic
        labels:
          app: nginx
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            annotations:
              k8s.aliyun.com/pod-with-eip: "true" # 为Nginx容器自动分配公网EIP地址。
            labels:
              app: nginx
          spec:
            containers:
            - name: nginx
              image: nginx
    • 添加以下注解,指定EIP的带宽,默认带宽5 Mbps(与EIP的默认值保持一致):
      k8s.aliyun.com/eip-bandwidth: 5
  • 指定EIP场景

    添加以下注解,为Pod指定EIP实例ID:

    k8s.aliyun.com/pod-eip-instanceid: "<youreipInstanceId>"
    说明
    • 由于单个EIP不支持关联多个Pod,所以不适用于Deployment和StatefulSet等场景。
    • 默认情况下如果EIP已经绑定了实例,则会创建EIP失败。如果希望解绑之前的实例再绑定新的实例,需要在上述修改ConfigMap中配置"allow_eip_rob": "true"
    • 指定EIP实例ID的场景只能用于单个副本实例的情况,例如,Deployment不能超过1个Replicas。

验证配置

当Pod变成Running状态之后,可以观察部署完后的Pod中annotationsk8s.aliyun.com/allocated-eipAddress值来查看到它分配到的关联EIP地址,通过这个EIP即可访问到Pod。