更新时间:2024-12-12 GMT+08:00
分享

创建负载均衡类型的服务

操作场景

负载均衡(LoadBalancer)类型的服务可以通过弹性负载均衡(ELB)从公网访问到工作负载,与弹性IP方式相比提供了高可靠的保障。负载均衡访问方式由公网弹性负载均衡服务地址以及设置的访问端口组成,例如“10.117.117.117:80”

在访问负载均衡类型的服务时,从ELB过来的流量会先访问到节点,然后通过Service转发到Pod。

图1 负载均衡(LoadBalancer)

在使用CCE Turbo集群 + 独享型ELB实例时,支持ELB直通Pod,使部署在容器中的业务时延降低、性能无损耗。

从集群外部访问时,从ELB直接转发到Pod;集群内部访问可通过Service转发到Pod。

图2 ELB直通容器

约束与限制

  • CCE中的负载均衡(LoadBalancer)访问类型使用弹性负载均衡 ELB提供网络访问,存在如下产品约束:
    • 自动创建的ELB实例建议不要被其他资源使用,否则会在删除时被占用,导致资源残留。
    • v1.15及之前版本集群使用的ELB实例请不要修改监听器名称,否则可能导致无法正常访问。
  • 创建Service后,如果服务亲和从集群级别切换为节点级别,连接跟踪表将不会被清理,建议用户创建Service后不要修改服务亲和属性,如需修改请重新创建Service。
  • 当服务亲和设置为节点级别(即externalTrafficPolicy为Local)时,集群内部可能使用ELB地址访问不通,具体情况请参见集群内无法访问Service的说明
  • CCE Turbo集群(云原生2.0网络模型)中,仅当Service的后端对接使用主机网络(HostNetwork)的Pod时,亲和级别支持配置为节点级别。
  • 独享型ELB仅支持1.17及以上集群。
  • 独享型ELB网络类型必须支持私网(有私有IP地址)。如果需要Service支持HTTP,则独享型ELB规格需要支持应用型(HTTP/HTTPS)。
  • 集群服务转发模式为IPVS时,不支持配置节点的IP作为Service的externalIP,会导致节点不可用。
  • IPVS模式集群下,Ingress和Service(或不同集群Service不同端口)使用相同ELB实例时,无法在集群内的节点和容器中访问Ingress(或其他集群的Service),因为kube-proxy会在ipvs-0的网桥上挂载LB类型的Service地址,ELB的流量会被ipvs-0网桥劫持。建议Ingress和Service(或不同集群的Service)使用不同ELB实例。

创建LoadBalancer类型Service

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 在左侧导航栏中选择“服务”,在右上角单击“创建服务”
  3. 设置参数。

    • Service名称:自定义服务名称,可与工作负载名称保持一致。
    • 访问类型:选择“负载均衡”
    • 命名空间:工作负载所在命名空间。
    • 服务亲和:详情请参见服务亲和(externalTrafficPolicy)
      • 集群级别:集群下所有节点的IP+访问端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源IP。
      • 节点级别:只有通过负载所在节点的IP+访问端口才可以访问此服务关联的负载,服务访问没有因路由跳转导致的性能损失,且可以获取到客户端源IP。
    • 选择器:添加标签,Service根据标签选择Pod,填写后单击“确认添加”。也可以引用已有工作负载的标签,单击“引用负载标签”,在弹出的窗口中选择负载,然后单击“确定”
    • 协议版本:默认不开启,开启后服务的集群内IP地址(ClusterIP)可以选择设置为IPv6地址,具体请参见如何通过CCE搭建IPv4/IPv6双栈集群?该功能仅在1.15及以上版本的集群创建时开启了IPv6功能才会显示。
    • 负载均衡器:选择弹性负载均衡的类型、创建方式。

      ELB类型可选择“独享型”“共享型”,独享型ELB还可以根据支持的协议类型选择“网络型(TCP/UDP/TLS)”“应用型(HTTP/HTTPS)”“网络型(TCP/UDP/TLS)&应用型(HTTP/HTTPS)”

      创建方式可选择“选择已有”“自动创建”。不同创建方式的配置详情请参见表1

      当集群使用共享VPC时,不支持自动创建共享型ELB。

      表1 ELB配置

      创建方式

      配置

      选择已有

      仅支持选择与集群在同一个VPC下的ELB实例。如果没有可选的ELB实例,请单击“创建负载均衡器”跳转到ELB控制台创建。

      自动创建

      • 实例名称:请填写ELB名称。
      • 企业项目:该参数仅对开通企业项目的企业客户账号显示。企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理。
      • 可用区(仅独享型ELB支持):可以选择在多个可用区创建负载均衡实例,提高服务的可用性。如果业务需要考虑容灾能力,建议选择多个可用区。
      • 前端子网(仅独享型ELB支持):用于分配ELB实例对外服务的IP地址。
      • 后端子网(仅独享型ELB支持):用于与后端服务建立连接的IP地址。
      • 网络型规格/应用型规格/规格(仅独享型ELB支持):
        • 弹性规格:适用于业务用量波动较大的场景,按实际使用量收取每小时使用的容量费用。v1.21.10-r10、v1.23.8-r10、v1.25.3-r10及以上版本集群支持使用弹性规格。
        • 固定规格:适用于业务用量较为稳定的场景,按固定规格折算收取每小时使用的容量费用。
      • 弹性公网IP:选择“自动创建”时,可配置公网带宽的计费方式及带宽大小。
      • 资源标签:通过为资源添加标签,可以对资源进行自定义标记,实现资源的分类。您可以在TMS中创建“预定义标签”,预定义标签对所有支持标签功能的服务资源可见,通过使用预定义标签可以提升标签创建和迁移效率。
      • 全域弹性公网(仅独享型ELB支持):选择绑定全域弹性公网IP实例,实现公网带宽资源在实例间分配与使用,控制全域弹性公网IP与公网间通信的速率。关于全域弹性公网更多信息,请参见全域公网带宽概述

      负载均衡配置:您可以单击负载均衡配置的“编辑”按钮配置ELB实例的参数,在弹出窗口中配置ELB实例的参数。

      • 分配策略:可选择加权轮询算法、加权最少连接或源IP算法。
        • 加权轮询算法:根据后端服务器的权重,按顺序依次将请求分发给不同的服务器。它用相应的权重表示服务器的处理性能,按照权重的高低以及轮询方式将请求分配给各服务器,相同权重的服务器处理相同数目的连接数。常用于短连接服务,例如HTTP等服务。
        • 加权最少连接:最少连接是通过当前活跃的连接数来估计服务器负载情况的一种动态调度算法。加权最少连接就是在最少连接数的基础上,根据服务器的不同处理能力,给每个服务器分配不同的权重,使其能够接受相应权值数的服务请求。常用于长连接服务,例如数据库连接等服务。
        • 源IP算法:将请求的源IP地址进行Hash运算,得到一个具体的数值,同时对后端服务器进行编号,按照运算结果将请求分发到对应编号的服务器上。这可以使得对不同源IP的访问进行负载分发,同时使得同一个客户端IP的请求始终被派发至某特定的服务器。该方式适合负载均衡无cookie功能的TCP协议。
      • 会话保持:默认不启用,可选择“源IP地址”。基于源IP地址的简单会话保持,即来自同一IP地址的访问请求转发到同一台后端服务器上。

        分配策略使用源IP算法时,不支持设置会话保持。

    • 健康检查:设置负载均衡的健康检查配置。
      表2 健康检查参数

      参数

      说明

      协议

      端口配置协议为TCP时,支持TCP和HTTP协议;当端口配置协议为UDP时,支持UDP协议。

      • 检查路径(仅HTTP健康检查协议支持):指定健康检查的URL地址。检查路径只能以/开头,长度范围为1-80。

      端口

      健康检查默认使用业务端口(Service的NodePort和容器端口)作为健康检查的端口;您也可以重新指定端口用于健康检查,重新指定端口会为服务增加一个名为cce-healthz的服务端口配置。

      • 节点端口:使用共享型负载均衡或不关联ENI实例时,节点端口作为健康检查的检查端口;如不指定将随机一个端口。取值范围为30000-32767。
      • 容器端口:使用独享型负载均衡关联ENI实例时,容器端口作为健康检查的检查端口。取值范围为1-65535。

      检查周期(秒)

      每次健康检查响应的最大间隔时间,取值范围为1-50。

      超时时间(秒)

      每次健康检查响应的最大超时时间,取值范围为1-50。

      最大重试次数

      健康检查最大的重试次数,取值范围为1-10。

    • 端口配置:
      • 协议:请根据业务的协议类型选择。Service在使用ELB提供的TLS或HTTP协议时,根据Kubernetes中定义的实现方案,需要将该参数设置为TCP并选择对应的监听器前端协议。详细说明请参见Service所用的协议
      • 容器端口:工作负载程序实际监听的端口,需用户确定。例如nginx默认使用80端口。
      • 服务端口:Service使用的端口,端口范围为1-65535。

        负载均衡服务支持创建某个端口范围的监听器,您最多可为每个监听器添加10个互不重叠的监听端口段。

        为负载均衡服务配置区间端口监听需满足以下条件:

        • 集群版本为v1.23.18-r0、v1.25.13-r0、v1.27.10-r0、v1.28.8-r0、v1.29.4-r0、v1.30.1-r0及以上。
        • 使用独享型ELB且选择TCP/UDP/TLS协议。
        • 该功能依赖ELB能力,使用该功能前请确认当前区域是否支持。ELB已发布区域请参见四层协议全端口监听和转发
      • 监听器前端协议:ELB监听器的前端协议,是客户端与负载均衡监听器建立流量分发连接所使用的协议。当选择独享型负载均衡器类型时,包含“应用型(HTTP/HTTPS)”方可支持配置HTTP/HTTPS;包含“网络型(TCP/UDP/TLS)”方可支持配置TLS。
      • 健康检查:健康检查选项设置为“自定义检查”时,可以为不同协议的端口配置健康检查,参数说明请参见表2

      在创建LoadBalancer类型Service时,会自动生成一个随机节点端口号(NodePort)。

    • 监听器配置:
      • SSL解析方式:当监听器端口启用HTTPS/TLS时可选择SSL解析方式。v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上版本的集群支持。
        • 单向认证:仅进行服务器端认证。如需认证客户端身份,请选择双向认证。
        • 双向认证:双向认证需要负载均衡实例与访问用户互相提供身份认证,从而允许通过认证的用户访问负载均衡实例,后端服务器无需额外配置双向认证。
      • CA证书:SSL解析方式选择“双向认证”时需要添加CA证书,用于认证客户端身份。CA证书又称客户端CA公钥证书,用于验证客户端证书的签发者;在开启HTTPS双向认证功能时,只有当客户端能够出具指定CA签发的证书时,HTTPS连接才能成功。
      • 服务器证书:当监听器端口启用HTTPS/TLS时,必须选择一个服务器证书。如果当前无可选证书,需前往弹性负载均衡控制台进行创建,详情请参见创建证书
      • SNI:当监听器端口启用HTTPS/TLS时,可以选择是否添加SNI证书。如果需要添加SNI证书,则证书中必须包含域名。如果当前无可选证书,需前往弹性负载均衡控制台进行创建,详情请参见创建证书

        如果无法根据客户端请求的域名查找到域名对应的SNI证书,则默认返回服务器证书。

      • 安全策略:当监听器端口启用HTTPS/TLS时,支持选择可用的安全策略,更多信息请参见安全策略。v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上版本的集群支持。
      • 后端协议:当监听器端口启用HTTPS时,支持使用HTTP或HTTPS协议对接后端服务,默认为HTTP。当监听器端口启用TLS时,支持使用TCP或TLS协议对接后端服务,默认为TCP。v1.23.14-r0、v1.25.9-r0、v1.27.6-r0、v1.28.4-r0及以上版本的集群支持。
      • 访问控制:
        • 继承ELB已有配置:CCE不对ELB侧已有的访问控制进行修改。
        • 允许所有IP访问:不设置访问控制。
        • 白名单:仅所选IP地址组可以访问ELB地址。
        • 黑名单:所选IP地址组无法访问ELB地址。
      • 高级配置:

        配置

        说明

        使用限制

        获取监听器端口号

        开启后可以将ELB实例的监听端口从报文的HTTP头中带到后端云服务器。

        独享型ELB实例的端口启用HTTP/HTTPS时支持配置。

        获取客户端请求端口号

        开启后可以将客户端的源端口从报文的HTTP头中带到后端云服务器。

        独享型ELB实例的端口启用HTTP/HTTPS时支持配置。

        重写X-Forwarded-Host

        开启后将以客户端请求头的Host重写X-Forwarded-Host传递到后端云服务器。

        独享型ELB实例的端口启用HTTP/HTTPS时支持配置。

        数据压缩

        开启将对特定文件类型进行压缩;关闭则不会对任何文件类型进行压缩。

        • Brotli支持压缩所有类型。
        • Gzip支持压缩的类型如下:

          text/xml text/plain text/css application/javascript application/x-javascript application/rss+xml application/atom+xml application/xml application/json。

        独享型ELB实例的端口启用HTTP/HTTPS时支持配置。

        空闲超时时间(秒)

        客户端连接空闲超时时间。在超过空闲超时时间一直没有请求, 负载均衡会暂时中断当前连接,直到下一次请求时重新建立新的连接。

        共享型ELB实例的端口使用UDP协议时不支持此配置。

        请求超时时间(秒)

        等待客户端请求超时时间。包括两种情况:

        • 读取整个客户端请求头的超时时长,如果客户端未在超时时长内发送完整个请求头,则请求将被中断。
        • 两个连续body体的数据包到达LB的时间间隔,超出请求超时时间将会断开连接。

        仅端口启用HTTP/HTTPS时支持配置。

        响应超时时间(秒)

        等待后端服务器响应超时时间。请求转发后端服务器后,在等待超过响应超时时间没有响应,负载均衡将终止等待,并返回 HTTP504错误码。

        仅端口启用HTTP/HTTPS时支持配置。

        开启HTTP2

        客户端与ELB之间的HTTPS请求的HTTP2功能的开启状态。 开启后,可提升客户端与ELB间的访问性能,但ELB与后端服务器间仍采用HTTP1.X协议。

        仅端口启用HTTPS时支持配置。

    • 注解:LoadBalancer类型Service有一些CCE定制的高级功能,通过注解annotations实现,具体注解的内容请参见使用Annotation配置负载均衡类型的服务

  4. 单击“确定”,创建Service。

通过kubectl命令行创建-使用已有ELB

您可以在创建工作负载时通过kubectl命令行设置Service访问方式。本节以nginx为例,说明kubectl命令实现负载均衡 ( LoadBalancer )访问的方法。

  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 创建并编辑nginx-deployment.yaml以及nginx-elb-svc.yaml文件。

    其中,nginx-deployment.yaml和nginx-elb-svc.yaml为自定义名称,您可以随意命名。

    vi nginx-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx 
            name: nginx
          imagePullSecrets:
          - name: default-secret

    vi nginx-elb-svc.yaml

    若需要开启会话保持,工作负载的各实例需设置反亲和部署,即所有的实例都部署在不同节点上。具体请参见设置工作负载亲和/反亲和调度(podAffinity/podAntiAffinity)

    apiVersion: v1 
    kind: Service 
    metadata: 
      name: nginx
      annotations:
        kubernetes.io/elb.id: <your_elb_id>                         # ELB ID,替换为实际值
        kubernetes.io/elb.class: performance                   # 负载均衡器类型
        kubernetes.io/elb.lb-algorithm: ROUND_ROBIN                   # 负载均衡器算法
        kubernetes.io/elb.session-affinity-mode: SOURCE_IP          # 会话保持类型为源IP
        kubernetes.io/elb.session-affinity-option: '{"persistence_timeout": "30"}'     # 会话保持时间(分钟)
        kubernetes.io/elb.health-check-flag: 'on'                   # 开启ELB健康检查功能
        kubernetes.io/elb.health-check-option: '{
          "protocol":"TCP",
          "delay":"5",
          "timeout":"10",
          "max_retries":"3"
        }'
    spec:
      selector: 
         app: nginx
      ports: 
      - name: service0 
        port: 80     #访问Service的端口,也是负载均衡上的监听器端口。
        protocol: TCP 
        targetPort: 80  #Service访问目标容器的端口,此端口与容器中运行的应用强相关
        nodePort: 31128  #节点的端口号,如不指定,将在30000-32767范围内随机生成一个端口号
      type: LoadBalancer

    上述示例通过Annotation(注解)实现负载均衡的一些高级功能,例如会话保持、健康检查等,对应的说明请参见表3

    除本示例中的功能外,如需了解更多高级功能相关注解及示例,请参见使用Annotation配置负载均衡类型的服务

    表3 annotations参数

    参数

    是否必填

    参数类型

    描述

    kubernetes.io/elb.id

    String

    为负载均衡实例的ID。

    在关联已有ELB时:必填。

    获取方法:

    在控制台的“服务列表”中,单击“网络 > 弹性负载均衡 ELB”,单击ELB的名称,在ELB详情页的“基本信息”页签下找到“ID”字段复制即可。

    说明:

    系统优先根据kubernetes.io/elb.id注解对接ELB,若此字段未指定,则会根据spec.loadBalancerIP字段(非必填,且仅1.23及以前版本可用)对接ELB。

    请尽量不要使用spec.loadBalancerIP字段对接ELB,该字段在将来的集群版本中会被Kubernetes官方废弃,详情请参见Deprecation

    kubernetes.io/elb.class

    String

    请根据不同的应用场景和功能需求选择合适的负载均衡器类型。

    取值如下:

    说明:

    负载均衡类型的服务对接已有的独享型ELB时,该独享型ELB必须支持网络型(TCP/UDP)规格。

    kubernetes.io/elb.lb-algorithm

    String

    后端云服务器组的负载均衡算法,默认值为“ROUND_ROBIN”。

    取值范围:

    • ROUND_ROBIN:加权轮询算法。
    • LEAST_CONNECTIONS:加权最少连接算法。
    • SOURCE_IP:源IP算法。
    说明:

    当该字段的取值为SOURCE_IP时,后端云服务器组绑定的后端云服务器的权重设置(weight字段)无效,且不支持开启会话保持。

    kubernetes.io/elb.session-affinity-mode

    String

    支持基于源IP地址的简单会话保持,即来自同一IP地址的访问请求转发到同一台后端服务器上。

    • 不启用:不填写该参数。
    • 开启会话保持:需增加该参数,取值“SOURCE_IP”,表示基于源IP地址。
    说明:

    当kubernetes.io/elb.lb-algorithm设置为“SOURCE_IP”(源IP算法)时,不支持开启会话保持。

    kubernetes.io/elb.session-affinity-option

    表4 Object

    ELB会话保持配置选项,可设置会话保持的超时时间。

    kubernetes.io/elb.health-check-flag

    String

    是否开启ELB健康检查功能。

    • 开启:空值或"on"
    • 关闭:"off"

    开启时需同时填写kubernetes.io/elb.health-check-option字段。

    kubernetes.io/elb.health-check-option

    表5 Object

    ELB健康检查配置选项。

    表4 elb.session-affinity-option字段数据结构说明

    参数

    是否必填

    参数类型

    描述

    persistence_timeout

    String

    当elb.session-affinity-mode是“SOURCE_IP”时生效,设置会话保持的超时时间(分钟)。

    默认值为:"60",取值范围:1-60。

    表5 elb.health-check-option字段数据结构说明

    参数

    是否必填

    参数类型

    描述

    delay

    String

    健康检查间隔(秒)。

    默认值:5,取值范围:1-50

    timeout

    String

    健康检查的超时时间(秒)。

    默认值:10,取值范围1-50

    max_retries

    String

    健康检查的最大重试次数。

    默认值:3,取值范围1-10

    protocol

    String

    健康检查的协议。

    取值范围:“TCP”或者“HTTP”

    path

    String

    健康检查的URL,协议是“HTTP”时配置。

    默认值:“/”

    取值范围:1-80字符

  3. 创建工作负载。

    kubectl create -f nginx-deployment.yaml

    回显如下,表示工作负载已创建完成。

    deployment/nginx created

    kubectl get pod

    回显如下,工作负载状态为Running状态,表示工作负载已运行中。

    NAME                     READY     STATUS             RESTARTS   AGE
    nginx-2601814895-c1xhw   1/1       Running            0          6s

  4. 创建服务。

    kubectl create -f nginx-elb-svc.yaml

    回显如下,表示服务已创建。

    service/nginx created

    kubectl get svc

    回显如下,表示工作负载访问方式已设置成功。

    NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    kubernetes   ClusterIP      10.247.0.1       <none>        443/TCP        3d
    nginx        LoadBalancer   10.247.130.196   10.78.42.242   80:31540/TCP   51s

  5. 在浏览器中输入访问地址,例如输入10.78.42.242:80。10.78.42.242为负载均衡实例IP地址,80为对应界面上的访问端口。

    可成功访问nginx。

    图3 通过负载均衡访问nginx

通过kubectl命令行创建-自动创建ELB

您可以在创建工作负载时通过kubectl命令行设置Service访问方式。本节以nginx为例,说明kubectl命令实现负载均衡 ( LoadBalancer )访问的方法。

  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 创建并编辑nginx-deployment.yaml以及nginx-elb-svc.yaml文件。

    其中,nginx-deployment.yaml和nginx-elb-svc.yaml为自定义名称,您可以随意命名。

    vi nginx-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: nginx 
            name: nginx
          imagePullSecrets:
          - name: default-secret

    vi nginx-elb-svc.yaml

    若需要开启会话保持,工作负载的各实例需设置反亲和部署,即所有的实例都部署在不同节点上。具体请参见设置工作负载亲和/反亲和调度(podAffinity/podAntiAffinity)

    共享型负载均衡(公网访问)Service示例:
    apiVersion: v1 
    kind: Service 
    metadata: 
      annotations:   
        kubernetes.io/elb.class: union
        kubernetes.io/elb.autocreate: '{
          "type": "public",
          "bandwidth_name": "cce-bandwidth-1551163379627",
          "bandwidth_chargemode": "bandwidth",
          "bandwidth_size": 5,
          "bandwidth_sharetype": "PER",
          "vip_subnet_cidr_id": "*****",
          "vip_address": "**.**.**.**",
          "eip_type": "5_bgp"
        }'
        kubernetes.io/elb.enterpriseID: '0'       # 负载均衡所属企业项目ID
        kubernetes.io/elb.lb-algorithm: ROUND_ROBIN                   # 负载均衡器算法
        kubernetes.io/elb.session-affinity-mode: SOURCE_IP          # 会话保持类型为源IP
        kubernetes.io/elb.session-affinity-option: '{"persistence_timeout": "30"}'     # 会话保持时间(分钟)
        kubernetes.io/elb.health-check-flag: 'on'                   # 开启ELB健康检查功能
        kubernetes.io/elb.health-check-option: '{
          "protocol":"TCP",
          "delay":"5",
          "timeout":"10",
          "max_retries":"3"
        }'
        kubernetes.io/elb.tags: key1=value1,key2=value2           # 添加ELB资源标签
      labels: 
        app: nginx 
      name: nginx 
    spec: 
      ports: 
      - name: service0 
        port: 80
        protocol: TCP 
        targetPort: 80
      selector: 
        app: nginx 
      type: LoadBalancer
    独享型负载均衡(公网访问)Service示例 - 仅支持1.17及以上集群:
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
      namespace: default
      annotations:
        kubernetes.io/elb.class: performance
        kubernetes.io/elb.autocreate: '{
          "type": "public",
          "bandwidth_name": "cce-bandwidth-1626694478577",
          "bandwidth_chargemode": "bandwidth",
          "bandwidth_size": 5,
          "bandwidth_sharetype": "PER",
          "eip_type": "5_bgp",
          "vip_subnet_cidr_id": "*****",
          "vip_address": "**.**.**.**",
          "elb_virsubnet_ids": ["*****"],
          "ipv6_vip_virsubnet_id": "*****",
          "available_zone": [
             "cn-north-4b"
          ],
          "l4_flavor_name": "L4_flavor.elb.s1.small"
        }'
        kubernetes.io/elb.enterpriseID: '0'       # 负载均衡所属企业项目ID
        kubernetes.io/elb.lb-algorithm: ROUND_ROBIN                   # 负载均衡器算法
        kubernetes.io/elb.session-affinity-mode: SOURCE_IP          # 会话保持类型为源IP
        kubernetes.io/elb.session-affinity-option: '{"persistence_timeout": "30"}'     # 会话保持时间(分钟)
        kubernetes.io/elb.health-check-flag: 'on'                   # 开启ELB健康检查功能
        kubernetes.io/elb.health-check-option: '{
          "protocol":"TCP",
          "delay":"5",
          "timeout":"10",
          "max_retries":"3"
        }'
        kubernetes.io/elb.tags: key1=value1,key2=value2           # 添加ELB资源标签
    spec:
      selector:
        app: nginx
      ports:
      - name: cce-service-0
        targetPort: 80
        nodePort: 0
        port: 80
        protocol: TCP
      type: LoadBalancer

    上述示例通过Annotation(注解)实现负载均衡的一些高级功能,例如会话保持、健康检查等,对应的说明请参见表6

    除本示例中的功能外,如需了解更多高级功能相关注解及示例,请参见使用Annotation配置负载均衡类型的服务

    表6 annotations参数

    参数

    是否必填

    参数类型

    描述

    kubernetes.io/elb.class

    String

    请根据不同的应用场景和功能需求选择合适的负载均衡器类型。

    取值如下:

    kubernetes.io/elb.autocreate

    elb.autocreate object

    自动创建service关联的ELB

    示例:

    • 自动创建公网共享型ELB:

      值为 '{"type":"public","bandwidth_name":"cce-bandwidth-1551163379627","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}'

    • 自动创建私网共享型ELB:

      值为 '{"type":"inner", "name": "A-location-d-test"}'

    kubernetes.io/elb.subnet-id

    -

    String

    为集群所在子网的ID,取值范围:1-100字符。

    • Kubernetes v1.11.7-r0及以下版本的集群自动创建时为必填参数。
    • Kubernetes v1.11.7-r0以上版本的集群:可不填。

    获取方法请参见:VPC子网接口与OpenStack Neutron子网接口的区别是什么?

    kubernetes.io/elb.enterpriseID

    String

    v1.15及以上版本的集群支持此字段,v1.15以下版本默认创建到default项目下。

    为ELB企业项目ID,选择后可以直接创建在具体的ELB企业项目下。

    该字段不传(或传为字符串'0'),则将资源绑定给默认企业项目。

    获取方法:

    登录控制台后,单击顶部菜单右侧的“企业 > 项目管理”,在打开的企业项目列表中单击要加入的企业项目名称,进入企业项目详情页,找到“ID”字段复制即可。

    kubernetes.io/elb.lb-algorithm

    String

    后端云服务器组的负载均衡算法,默认值为“ROUND_ROBIN”。

    取值范围:

    • ROUND_ROBIN:加权轮询算法。
    • LEAST_CONNECTIONS:加权最少连接算法。
    • SOURCE_IP:源IP算法。
    说明:

    当该字段的取值为SOURCE_IP时,后端云服务器组绑定的后端云服务器的权重设置(weight字段)无效,且不支持开启会话保持。

    kubernetes.io/elb.session-affinity-mode

    String

    支持基于源IP地址的简单会话保持,即来自同一IP地址的访问请求转发到同一台后端服务器上。

    • 不启用:不填写该参数。
    • 开启会话保持:需增加该参数,取值“SOURCE_IP”,表示基于源IP地址。
    说明:

    当kubernetes.io/elb.lb-algorithm设置为“SOURCE_IP”(源IP算法)时,不支持开启会话保持。

    kubernetes.io/elb.session-affinity-option

    表4 Object

    ELB会话保持配置选项,可设置会话保持的超时时间。

    kubernetes.io/elb.health-check-flag

    String

    是否开启ELB健康检查功能。

    • 开启:“(空值)”或“on”
    • 关闭:“off”

    开启时需同时填写kubernetes.io/elb.health-check-option字段。

    kubernetes.io/elb.health-check-option

    表5 Object

    ELB健康检查配置选项。

    kubernetes.io/elb.tags

    String

    为ELB添加资源标签,仅自动创建ELB时支持设置,且集群版本需满足v1.23.11-r0、v1.25.6-r0、v1.27.3-r0及以上。

    格式为key=value,同时添加多个标签时以英文逗号(,)隔开。

    表7 elb.autocreate字段数据结构说明

    参数

    是否必填

    参数类型

    描述

    name

    String

    自动创建的负载均衡的名称。

    取值范围:只能由中文、英文字母、数字、下划线、中划线、点组成,且长度范围为1-64个字符。

    默认名称:cce-lb+service.UID

    type

    String

    负载均衡实例网络类型,公网或者私网。

    • public:公网型负载均衡
    • inner:私网型负载均衡

    默认类型:inner

    bandwidth_name

    公网型负载均衡必填

    String

    带宽的名称,默认值为:cce-bandwidth-******。

    取值范围:只能由中文、英文字母、数字、下划线、中划线、点组成,且长度范围为1-64个字符。

    bandwidth_chargemode

    String

    带宽付费模式。

    • bandwidth:按带宽
    • traffic:按流量

    默认类型:bandwidth

    bandwidth_size

    公网型负载均衡必填

    Integer

    带宽大小,默认1Mbit/s~2000Mbit/s,请根据Region带宽支持范围设置。

    调整带宽时的最小单位会根据带宽范围不同存在差异。
    • 小于等于300Mbit/s:默认最小单位为1Mbit/s。
    • 300Mbit/s~1000Mbit/s:默认最小单位为50Mbit/s。
    • 大于1000Mbit/s:默认最小单位为500Mbit/s。

    bandwidth_sharetype

    公网型负载均衡必填

    String

    带宽共享方式。

    • PER:独享带宽

    eip_type

    公网型负载均衡必填

    String

    弹性公网IP类型。

    • 5_telcom:电信
    • 5_union:联通
    • 5_bgp:全动态BGP
    • 5_sbgp:静态BGP

    具体类型以各区域配置为准,详情请参见弹性公网IP控制台。

    vip_subnet_cidr_id

    String

    指定ELB所在的子网,该子网必须属于集群所在的VPC。

    如不指定,则ELB与集群在同一个子网。

    仅v1.21及以上版本的集群支持指定该字段。

    vip_address

    String

    负载均衡器的内网IP。仅支持指定IPv4地址,不支持指定IPv6地址。

    该IP必须为ELB所在子网网段中的IP。若不指定,自动从ELB所在子网网段中生成一个IP地址。

    仅v1.23.11-r0、v1.25.6-r0、v1.27.3-r0及以上版本集群支持指定该字段。

    available_zone

    Array of strings

    负载均衡所在可用区。

    可以通过查询可用区列表获取所有支持的可用区。

    独享型负载均衡器独有字段。

    l4_flavor_name

    String

    四层负载均衡实例规格名称。

    可以通过查询规格列表获取所有支持的类型。

    • 弹性规格:适用于业务用量波动较大的场景,按实际使用量收取每小时使用的容量费用。v1.21.10-r10、v1.23.8-r10、v1.25.3-r10及以上版本集群支持使用弹性规格。
    • 固定规格:适用于业务用量较为稳定的场景,按固定规格折算收取每小时使用的容量费用。

    独享型负载均衡器独有字段。

    l7_flavor_name

    String

    七层负载均衡实例规格名称。

    可以通过查询规格列表获取所有支持的类型。

    • 弹性规格:适用于业务用量波动较大的场景,按实际使用量收取每小时使用的容量费用。v1.21.10-r10、v1.23.8-r10、v1.25.3-r10及以上版本集群支持使用弹性规格。
    • 固定规格:适用于业务用量较为稳定的场景,按固定规格折算收取每小时使用的容量费用。

    独享型负载均衡器独有字段,必须与l4_flavor_name对应规格的类型一致,即都为弹性规格或都为固定规格。

    elb_virsubnet_ids

    Array of strings

    负载均衡后端所在子网,不填默认为集群子网。不同实例规格将占用不同数量子网IP,不建议使用其他资源(如集群,节点等)的子网网段。

    独享型负载均衡器独有字段。

    示例:

    "elb_virsubnet_ids": [
       "14567f27-8ae4-42b8-ae47-9f847a4690dd"
     ]

    ipv6_vip_virsubnet_id

    String

    双栈类型负载均衡器所在子网的IPv6网络ID,需要对应的子网开启IPv6,仅使用双栈集群时需填写。

    独享型负载均衡器独有字段。

  3. 创建工作负载。

    kubectl create -f nginx-deployment.yaml

    回显如下,表示工作负载已开始创建。

    deployment/nginx created

    kubectl get pod

    回显如下,工作负载状态为Running状态,表示工作负载已运行中。

    NAME                     READY     STATUS             RESTARTS   AGE
    nginx-2601814895-c1xhw   1/1       Running            0          6s

  4. 创建服务。

    kubectl create -f nginx-elb-svc.yaml

    回显如下,表示服务已创建。

    service/nginx created

    kubectl get svc

    回显如下,表示工作负载访问方式已设置成功。

    NAME         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    kubernetes   ClusterIP      10.247.0.1       <none>        443/TCP        3d
    nginx        LoadBalancer   10.247.130.196   10.78.42.242   80:31540/TCP   51s

  5. 在浏览器中输入访问地址,例如输入10.78.42.242:80。10.78.42.242为负载均衡实例IP地址,80为对应界面上的访问端口。

    可成功访问nginx。

    图4 通过负载均衡访问nginx

相关文档