通过Annotation配置负载均衡

更新时间: 2023-07-10 12:24:03

通过Service YAML文件中的Annotation(注解),可以实现丰富的负载均衡功能。本文从SLB、监听和后端服务器组三种资源维度介绍通过注解可以对SLB进行的常见配置操作。

注解使用说明

  • 注解的内容是区分大小写。
  • 自2019年09月11日起,annotations字段alicloud更新为alibaba-cloud

    例如:

    更新前:service.beta.kubernetes.io/alicloud-loadbalancer-id

    更新后:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id

    系统将继续兼容alicloud的写法,您无需做任何修改。

SLB

SLB的典型操作

  • 创建一个公网类型的负载均衡
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 创建一个私网类型的负载均衡
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 指定负载均衡规格
    负载均衡规格可参见CreateLoadBalancer。通过该参数可以创建指定规格的SLB,或者更新已有SLB的规格。
    重要 如果您通过SLB控制台修改SLB规格(仅支持修改按规格计费的负载均衡实例),可能会被CCM修改回原规格,请谨慎操作。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type: "PayBySpec"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s1.small"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • 使用已有的负载均衡
    • 默认情况下,使用已有的负载均衡实例,不会覆盖监听,如要强制覆盖已有监听,请配置service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listenerstrue
      说明 复用已有的负载均衡默认不覆盖已有监听,因为以下两点原因:
      • 如果已有负载均衡的监听上绑定了业务,强制覆盖可能会引发业务中断。
      • 由于CCM目前支持的后端配置有限,无法处理一些复杂配置。如果有复杂的后端配置需求,可以在不覆盖监听的情况下,通过控制台自行配置监听。
      如存在以上两种情况不建议强制覆盖监听,如果已有负载均衡的监听端口不再使用,则可以强制覆盖。
    • 使用已有的负载均衡暂不支持添加额外标签(annotation: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-additional-resource-tags)。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LOADBALANCER_ID}"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • 使用已有的负载均衡,并强制覆盖已有监听
    强制覆盖已有监听,如果监听端口冲突,则会删除已有监听。
    重要 复用已有SLB且设置forceoverridetrue时,请勿多个Service复用同一个SLB的同一个监听,否则会导致监听配置冲突。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LOADBALANCER_ID}"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • 创建负载均衡时,指定主备可用区
    • 某些region的负载均衡不支持主备可用区,例如ap-southeast-5。
    • 一旦创建,主备可用区不支持修改。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-master-zoneid: "ap-southeast-5a"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-slave-zoneid: "ap-southeast-5a"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 创建按带宽付费的负载均衡
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-charge-type: "paybybandwidth"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-bandwidth: "2"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
    说明 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-bandwidth为带宽峰值。
  • 为负载均衡指定虚拟交换机
    • 通过阿里云专有网络控制台查询交换机ID,然后使用如下的Annotation为负载均衡实例指定虚拟交换机。
    • 虚拟交换机必须与Kubernetes集群属于同一个VPC。
    • 为负载均衡指定虚拟交换机,以下两项Annotation必选。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
       service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet"
       service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vswitch-id: "${YOUR_VSWITCH_ID}"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • 为负载均衡添加额外标签

    多个Tag以逗号分隔,例如"k1=v1,k2=v2"

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-additional-resource-tags: "Key1=Value1,Key2=Value2" 
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 创建IPv6类型的负载均衡
    • 集群的kube-proxy代理模式需要是IPVS。
    • 生成的IPv6地址仅可在支持IPv6的环境中访问。
    • 创建后IP类型不可更改。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-ip-version: "ipv6"
      name: nginx
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: LoadBalancer
  • 为负载均衡开启删除保护

    默认开启删除保护。

    重要 对于LoadBalancer类型的Service创建的负载均衡,如果手动在SLB控制台开启了删除保护,仍可通过kubectl delete svc {your-svc-name}的方式删除Service关联的负载均衡。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-delete-protection: "on"
      name: nginx
    spec:
      externalTrafficPolicy: Local
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: LoadBalancer
  • 为负载均衡开启配置修改保护

    默认开启配置修改保护。

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-modification-protection: "ConsoleProtection"
      name: nginx
    spec:
      externalTrafficPolicy: Local
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: LoadBalancer
  • 指定负载均衡名称
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-name: "your-svc-name"
      name: nginx
    spec:
      externalTrafficPolicy: Local
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: LoadBalancer
  • 指定负载均衡所属的资源组
    阿里云资源管理平台查询资源组ID,然后使用以下Annotation为负载均衡实例指定资源组。
    说明 资源组ID创建后不可被修改。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-resource-group-id: "rg-xxxx"
      name: nginx
    spec:
      externalTrafficPolicy: Local
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: LoadBalancer
  • 为Service设置Hostname
    • your_service_name需要符合域名命名规则。
    • 添加该annotation后,Service的EXTERNAL-IP将会从默认的SLB IP更改为your_service_name。在集群中访问SLB IP时,流量将会绕行SLB再转发至集群中。
    • 添加该annotation后,如果监听协议为TCP或UDP,集群内访问SLB IP时将会存在回环访问问题。详细信息,请参见客户端无法访问负载均衡SLB
    • 添加该annotation不会自动绑定SLB与域名。如需进行绑定,请至域名服务页面购买域名并自行绑定SLB。购买域名,请参见购买域名
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "http:80"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-hostname: "${your_service_hostname}"
      name: nginx-svc
      namespace: default
    spec:
      ports:
      - name: http
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: LoadBalancer

    预期输出:

    NAME         TYPE           CLUSTER-IP       EXTERNAL-IP            PORT(S)                      AGE
    nginx-svc    loadBalancer   47.100.XX.XX     www.example.com        80:30248/TCP,443:32670/TCP   10s
  • 创建一个按使用量计费的负载均衡
    负载均衡实例计费方式:
    • PayBySpec:默认值,按规格计费。
    • PayByCLCU:按使用量计费。

    按使用量计费的负载均衡不支持设置规格。即取值PayByCLCUservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec不可同时存在。负载均衡实例创建后,仅支持变更为PayByCLCU类型。

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type: "PayByCLCU"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer

监听

监听的典型操作

  • 为TCP类型的负载均衡配置会话保持时间
    • 参数service.beta.kubernetes.io/alibaba-cloud-loadbalancer-persistence-timeout仅对TCP协议的监听生效。
    • 如果负载均衡实例配置了多个TCP协议的监听端口,则默认将该配置应用到所有TCP协议的监听端口。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-persistence-timeout: "1800"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • 为HTTP和HTTPS协议的监听配置会话保持(insert cookie)
    • 仅支持HTTP及HTTPS协议的负载均衡实例。
    • 如果配置了多个HTTP或者HTTPS的监听端口,该会话保持默认应用到所有HTTP和HTTPS监听端口。
    • 配置insert cookie,以下四项Annotation必选。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-session: "on"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-session-type: "insert"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cookie-timeout: "1800"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "http:80"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 为负载均衡配置访问控制策略组
    • 需要先在阿里云负载均衡控制台上创建一个负载均衡访问控制策略组,然后记录该访问控制策略组ID(acl-id),然后使用如下Annotation创建一个带有访问控制的负载均衡实例。
    • 白名单适合只允许特定IP访问的场景,black黑名单适用于只限制某些特定IP访问的场景。
    • 创建带有访问控制的负载均衡,以下三项Annotation必选。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-acl-status: "on"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-acl-id: "${YOUR_ACL_ID}"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-acl-type: "white"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • 为负载均衡指定转发端口
    • 端口转发是指将HTTP端口的请求转发到HTTPS端口上。
    • 设置端口转发需要先在阿里云控制台上创建一个证书并记录cert-id。
    • 如需设置端口转发,以下三项Annotation必选。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "https:443,http:80"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "${YOUR_CERT_ID}"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-forward-port: "80:443"
      name: nginx
      namespace: default
    spec:
      ports:
      - name: https
        port: 443
        protocol: TCP
        targetPort: 80
      - name: http
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 为负载均衡设置调度算法
    • rr(默认值):轮询,按照访问顺序依次将外部请求依序分发到后端服务器。
    • wrr:加权轮询,权重值越高的后端服务器,被轮询到的次数(概率)也越高。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler: "wrr"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • 创建UDP类型的监听
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "udp:80"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 创建HTTP类型的监听
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "http:80"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 创建HTTPS类型的监听

    需要先在阿里云控制台上创建一个证书并记录cert-id,然后使用如下Annotation创建一个HTTPS类型的SLB。

    说明 HTTPS请求会在SLB层解密,然后以HTTP请求的形式发送给后端的Pod。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "https:443"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "${YOUR_CERT_ID}"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 创建带健康检查的监听
    • 设置TCP类型的健康检查
      • TCP端口默认开启健康检查。
      • 设置TCP类型的健康检查,以下所有Annotation必选。
      apiVersion: v1
      kind: Service
      metadata:
        annotations:
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-switch: "on"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-type: "tcp"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-timeout: "8"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-healthy-threshold: "4"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-unhealthy-threshold: "4"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval: "3"
        name: nginx
        namespace: default
      spec:
        ports:
        - port: 80
          protocol: TCP
          targetPort: 80
        selector:
          run: nginx
        type: LoadBalancer
    • 设置UDP类型的健康检查
      • UDP端口默认开启健康检查。
      • 设置UDP类型的健康检查,以下所有Annotation必选。
      apiVersion: v1
      kind: Service
      metadata:
        annotations:
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-switch: "on"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval: "5"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-timeout: "10"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-healthy-threshold: "3"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-unhealthy-threshold: "3"
        name: nginx
        namespace: default
      spec:
        ports:
        - port: 80
          protocol: UDP
          targetPort: 80
        selector:
          run: nginx
        type: LoadBalancer
    • 为TCP和UDP监听关闭健康检查
      apiVersion: v1
      kind: Service
      metadata:
        annotations:
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-switch: "off" #关闭健康检查
        name: nginx
        namespace: default
      spec:
        ports:
        - port: 443
          protocol: TCP
          targetPort: 443
        selector:
          run: nginx
        type: LoadBalancer
    • 设置HTTP类型的健康检查
      apiVersion: v1
      kind: Service
      metadata:
        annotations:
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-flag: "on"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-type: "http"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-uri: "/test/index.html"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-healthy-threshold: "4"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-unhealthy-threshold: "4"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-timeout: "10"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval: "3"
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "http:80"
          # 设置健康检查方法,该Annotation可选
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-method: "head"
        name: nginx
        namespace: default
      spec:
        ports:
        - port: 80
          protocol: TCP
          targetPort: 80
        selector:
          run: nginx
        type: LoadBalancer
  • 为监听设置连接优雅中断

    仅支持TCP和UDP协议。如需设置连接优雅中断,以下两项annotation必选。

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain: "on"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain-timeout: "30"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 为监听配置通过X-Forwarded-Proto头字段获取SLB的监听协议
    仅支持HTTP和HTTPS协议。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "http:80"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-xforwardedfor-proto: "on"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 为监听设置连接空闲超时时间
    仅支持HTTP和HTTPS协议。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "http:80"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-idle-timeout: "30"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 关闭监听的HTTP2特性
    仅支持HTTPS协议。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "https:443"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "${YOUR_CERT_ID}"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-http2-enabled: "off"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 为监听配置指定请求超时时间
    仅支持HTTP和HTTPS协议。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "http:80"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-request-timeout: "60"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 为监听指定链接超时时间
    仅支持TCP协议。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-established-timeout: "60"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 为监听配置安全策略
    安全策略包含HTTPS可选的TLS协议版本和配套的加密算法套件,仅支持HTTPS协议。详细信息,可参见CreateLoadBalancerHTTPSListener
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "https:443,http:80"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "${YOUR_CERT_ID}"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-tls-cipher-policy: "tls_cipher_policy_1_2"
      name: nginx
      namespace: default
    spec:
      ports:
      - name: https
        port: 443
        protocol: TCP
        targetPort: 443
      - name: http
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 为监听同时配置TCP及UDP协议
    说明 该功能要求Kubernetes集群版本不低于v1.24。关于如何升级集群版本,请参见升级ACK集群
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      namespace: default
    spec:
      ports:
      - name: tcp
        port: 80
        protocol: TCP
        targetPort: 80
      - name: udp
        port: 80
        protocol: UDP
        targetPort: 81
      selector:
        app: nginx
      sessionAffinity: None
      type: LoadBalancer
  • 为TCP和UDP类型的监听配置Proxy rotocol协议

    ProxyProtocol协议配置后,可通过ProxyProtocol协议携带客户端源地址到后端服务器。

    重要 该功能不支持在线平滑迁移,切换ProxyProtocol需要业务停服升级, 请谨慎配置。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-proxy-protocol: "on"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer

后端服务器组

后端服务器的典型操作

  • 使用指定Label的Worker节点作为后端服务器

    多个Label以逗号分隔。例如"k1=v1,k2=v2"。多个Label之间是And关系。

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-label: "failure-domain.beta.kubernetes.io/zone=ap-southeast-5a"
      name: nginx
      namespace: default
    spec:
      ports:
      - port: 443
        protocol: TCP
        targetPort: 443
      selector:
        run: nginx
      type: LoadBalancer
  • 使用Pod所在的节点作为后端服务器
    • 默认externalTrafficPolicy为Cluster模式,会将集群中所有节点挂载到后端服务器。Local模式仅将Pod所在节点作为后端服务器。

    • Local模式需要设置调度策略为加权轮询wrr。

      说明

      在v1.9.3.164-g2105d2e-aliyun及之后版本,外部流量策略设置为Local模式的服务会自动根据Node上的Pod数量为Node设置权重,权重计算规则请参见Local模式下如何自动设置Node权重?

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler: "wrr"
      name: nginx
      namespace: default
    spec:
      externalTrafficPolicy: Local
      ports:
      - port: 80
        protocol: TCP
        targetPort: 80
      selector:
        run: nginx
      type: LoadBalancer
  • 移除SLB后端unschedulable状态的节点
    • kubectl cordonkubectl drain命令会将节点置为unschedulable状态,默认service.beta.kubernetes.io/alibaba-cloud-loadbalancer-remove-unscheduled-backend的取值为off,此时不会将处于unschedulable状态的节点从SLB的后端服务器组移除。
    • 若需要从SLB的后端服务器组移除unschedulable状态的节点,请将service.beta.kubernetes.io/alibaba-cloud-loadbalancer-remove-unscheduled-backend的取值设置为on。
    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-remove-unscheduled-backend: "on"
      name: nginx
    spec:
      externalTrafficPolicy: Local
      ports:
      - name: http
        port: 30080
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: LoadBalancer
  • 直接将Pod ENI挂载到SLB后端
    支持在Terway网络模式下,通过annotationservice.beta.kubernetes.io/backend-type:"eni"将Pod直接挂载到SLB后端,提升网络转发性能。
      apiVersion: v1
      kind: Service
      metadata:
        annotations:
          service.beta.kubernetes.io/backend-type: "eni"
        name: nginx
      spec:
        ports:
        - name: http
          port: 30080
          protocol: TCP
          targetPort: 80
        selector:
          app: nginx
        type: LoadBalancer
    说明 您也可以手动将service.beta.kubernetes.io/backend-type:"eni"中的eni设置为ecs将ECS挂载到SLB后端。
  • 复用已有虚拟服务器组

    支持通过annotationservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port复用已有虚拟服务器组。该annotation仅在复用已有SLB场景下生效。具体的使用示例,请参见通过CCM跨集群部署服务

  • 设置Service接收流量的权重。

    在多个Service复用同一个SLB的场景下,支持通过annotationservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight设置当前Service接收流量的权重。该annotation仅在复用已有虚拟服务器组场景下生效。具体的使用示例,请参见通过CCM跨集群部署服务

常用注解

  • SLB常用注解

    注解类型描述默认值支持的CCM版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-typestring取值:internet或者intranet
    • internet:服务通过公网访问,此为默认值。对应SLB的地址类型必须为公网
    • intranet:服务通过私网访问。对应SLB的地址类型必须为私网
    internetv1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-charge-typestring取值:paybytraffic或者paybybandwidthpaybytrafficv1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-idstring负载均衡实例的ID。通过service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id指定您已有的SLB,默认情况下,使用已有的负载均衡实例,不会覆盖监听,如要强制覆盖已有监听,请配置service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listenerstruev1.9.3.81-gca19cd4-aliyun及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-specstring负载均衡实例的规格。可参见:CreateLoadBalancerslb.s1.smallv1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-master-zoneidstring主后端服务器的可用区ID。v1.9.3.10-gfb99107-aliyun及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-slave-zoneidstring备后端服务器的可用区ID。v1.9.3.10-gfb99107-aliyun及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listenersstring绑定已有负载均衡时,是否强制覆盖该SLB的监听。false:不覆盖v1.9.3.81-gca19cd4-aliyun及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-bandwidthstring负载均衡的带宽,仅适用于公网类型的负载均衡。50v1.9.3.10-gfb99107-aliyun及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vswitch-idstring负载均衡实例所属的VSwitch ID。设置该参数时需同时设置addresstype为intranet。v1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-additional-resource-tagsstring需要添加的Tag列表,多个标签用逗号分隔。例如:"k1=v1,k2=v2"v1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-ip-versionstring负载均衡实例的IP版本,取值:ipv4或ipv6。ipv4v1.9.3.220-g24b1885-aliyun及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-delete-protectionstring负载均衡删除保护,取值:on或off。onv1.9.3.313-g748f81e-aliyun及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-modification-protectionstring负载均衡配置修改保护,取值:ConsoleProtection或NonProtection。ConsoleProtectionv1.9.3.313-g748f81e-aliyun及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-resource-group-idstring负载均衡所属资源组ID。v1.9.3.313-g748f81e-aliyun及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-namestring负载均衡实例名称。v1.9.3.313-g748f81e-aliyun及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-hostnamestring为Service设置Hostname。Hostname需要符合DNS命名规则。v2.3.0及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-typestring实例计费方式。取值:
    • PayBySpec:默认值,按规格计费。
    • PayByCLCU:按使用量计费。
    PayBySpecv2.4.0及以上版本
  • 监听的常用注解

    注解类型描述默认值支持的CCM版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-schedulerstring调度算法。取值wrr或rr
    • wrr:权重值越高的后端服务器,被轮询到的次数(概率)也越高。
    • rr:默认取值,按照访问顺序依次将外部请求依序分发到后端服务器。
    rrv1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-portstring多个值之间由逗号分隔,例如:https:443,http:80v1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-persistence-timeoutstring会话保持时间。

    仅针对TCP协议的监听,取值:0~3600(秒)

    默认情况下,取值为0,会话保持关闭。

    可参见:CreateLoadBalancerTCPListener

    0v1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-sessionstring是否开启会话保持。取值:on或off
    说明 仅对HTTP和HTTPS协议的监听生效。

    可参见:CreateLoadBalancerHTTPListenerCreateLoadBalancerHTTPSListener

    offv1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-session-typestringcookie的处理方式。取值:
    • insert:植入Cookie。
    • server:重写Cookie。
    说明
    • 仅对HTTP和HTTPS协议的监听生效。
    • service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-session取值为on时,该参数必选。

    可参见:CreateLoadBalancerHTTPListenerCreateLoadBalancerHTTPSListener

    v1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cookie-timeoutstringCookie超时时间。取值:1s~86400s。
    说明 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-sessiononservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-session-typeinsert时,该参数必选。

    可参见:CreateLoadBalancerHTTPListenerCreateLoadBalancerHTTPSListener

    v1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cookiestring服务器上配置的Cookie名称。

    长度为1~200个字符,只能包含ASCII英文字母和数字字符,不能包含逗号、分号或空格,也不能以$开头。

    说明

    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-sessiononservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-sticky-session-typeserver时,该参数必选。

    可参见:CreateLoadBalancerHTTPListenerCreateLoadBalancerHTTPSListener

    v1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-idstring阿里云上的证书ID。您需要在SLB控制台先上传证书。v1.9.3.164-g2105d2e-aliyun及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-flagstring取值:on或off
    • TCP监听默认为on且不可更改。
    • HTTP监听默认为off。
    默认为off。TCP不需要改参数。因为TCP默认打开健康检查,用户不可设置。v1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-typestring健康检查类型,取值:tcp或http

    可参见:CreateLoadBalancerTCPListener

    tcpv1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-uristring用于健康检查的URI。
    说明 当健康检查类型为TCP模式时,无需配置该参数。

    可参见:CreateLoadBalancerTCPListener

    v1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-portstring健康检查使用的端口。取值:1~65535。v1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-healthy-thresholdstring健康检查连续成功多少次后,将后端服务器的健康检查状态由fail判定为success。

    取值:2~10

    可参见:CreateLoadBalancerTCPListener

    3v1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-unhealthy-thresholdstring健康检查连续失败多少次后,将后端服务器的健康检查状态由success判定为fail。取值:

    2~10

    可参见:CreateLoadBalancerTCPListener

    3v1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-intervalstring健康检查的时间间隔。

    取值:1s~50s

    可参见:CreateLoadBalancerTCPListener

    2v1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-timeoutstring接收来自运行状况检查的响应需要等待的时间,适用于TCP模式。如果后端ECS在指定的时间内没有正确响应,则判定为健康检查失败。

    取值:1s~300s

    说明 如果service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-timeout的值小于service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval的值,则service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-timeout无效,超时时间为service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval的值。

    可参见:CreateLoadBalancerTCPListener

    5v1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-timeoutstring接收来自运行状况检查的响应需要等待的时间,适用于HTTP模式。如果后端ECS在指定的时间内没有正确响应,则判定为健康检查失败。

    取值:1s~300s

    说明 如果service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-timeout的值小于service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval的值,则service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-timeout无效,超时时间为service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval的值。

    可参见:CreateLoadBalancerTCPListener

    5v1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-domainstring用于健康检查的域名。
    • $_ip:后端服务器的私网IP。当指定了IP或该参数未指定时,负载均衡会使用各后端服务器的私网IP当做健康检查使用的域名。
    • domain:域名长度为1~80,只能包含字母、数字、点号(.)和连字符(-)。
    v1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-httpcodestring健康检查正常的HTTP状态码,多个状态码用逗号(,)分割。取值:
    • http_2xx
    • http_3xx
    • http_4xx
    • http_5xx
    默认值为http_2xx
    http_2xxv1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-acl-statusstring是否开启访问控制功能。取值:on或offoffv1.9.3.164-g2105d2e-aliyun及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-acl-idstring监听绑定的访问策略组ID。当AclStatus参数的值为on时,该参数必选。v1.9.3.164-g2105d2e-aliyun及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-acl-typestring访问控制类型。

    取值:white或black

    • white:仅转发来自所选访问控制策略组中设置的IP地址或地址段的请求,白名单适用于应用只允许特定IP访问的场景。设置白名单存在一定业务风险。一旦设名单,就只有白名单中的IP可以访问负载均衡监听。如果开启了白名单访问,但访问策略组中没有添加任何IP,则负载均衡监听会转发全部请求。
    • black: 来自所选访问控制策略组中设置的IP地址或地址段的所有请求都不会转发,黑名单适用于应用只限制某些特定IP访问的场景。如果开启了黑名单访问,但访问策略组中没有添加任何IP,则负载均衡监听会转发全部请求。当AclStatus参数的值为on时,该参数必选。
    v1.9.3.164-g2105d2e-aliyun及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-forward-portstring将HTTP请求转发至HTTPS指定端口。取值如80:443v1.9.3.164-g2105d2e-aliyun及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drainstring是否开启连接优雅中断,取值:on或offv2.0.1及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain-timeoutstring设置连接优雅中断超时时间。单位:秒。取值:10~900v2.0.1及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-xforwardedfor-protostring配置是否通过X-Forwarded-Proto头字段获取SLB的监听协议。取值:on或offoffv2.1.0及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-idle-timeoutstring为监听设置连接空闲超时时间。单位:秒。取值范围:1~6015v2.1.0及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-http2-enabledstring是否开启HTTP2特性。取值:on或offonv2.1.0及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-established-timeoutstring连接超时时间。仅支持TCP协议。

    单位:秒。取值:10~900。更多信息,请参见CreateLoadBalancerTCPListener

    v2.3.0及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-request-timeoutstring指定请求超时时间。

    支持HTTP和HTTPS协议。单位:秒。取值:1~180。在超时时间内后端服务器一直没有响应,负载均衡将放弃等待,给客户端返回HTTP 504错误码。

    60v2.3.0及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-methodstring监听HTTP类型健康检查的健康检查方法。取值:headgetv2.3.0及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-tls-cipher-policystring安全策略包含HTTPS可选的TLS协议版本和配套的加密算法套件。详细信息,请参见CreateLoadBalancerHTTPSListener。取值:
    • tls_cipher_policy_1_0
    • tls_cipher_policy_1_1
    • tls_cipher_policy_1_2
    • tls_cipher_policy_1_2_strict
    • tls_cipher_policy_1_2_strict_with_1_3
    tls_cipher_policy_1_0v2.4.0及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-proxy-protocolstring为TCP及UDP监听配置ProxyProtocol协议。取值:onoffoffv2.6.0及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-switchstringTCP及UDP监听是否开启健康检查。取值:onoffonv2.6.0及以上版本
  • 后端服务器组的常用注解

    注解类型描述默认值支持的CCM版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-labelstring通过Label指定SLB后端挂载哪些Worker节点。v1.9.3及以上版本
    externalTrafficPolicystring哪些节点可以作为后端服务器,取值:
    • Cluster:使用所有后端节点作为后端服务器。
    • Local:使用Pod所在节点作为后端服务器。
    Clusterv1.9.3及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-remove-unscheduled-backendstring从SLB后端移除SchedulingDisabled Node。取值:on或offoffv1.9.3.164-g2105d2e-aliyun及以上版本
    service.beta.kubernetes.io/backend-typestringSLB后端服务器类型。
    取值:
    • eni:将Pod挂载到SLB后端,仅Terway网络模式下生效,可以提高网络转发性能。
    • ecs:将ECS挂载到SLB后端。
    Flannel网络模式:默认值为ecs
    Terway网络模式:
    • 2020年8月10日之前创建的Terway集群默认值为ecs
    • 2020年8月10日之后创建的Terway集群默认值为eni
    v1.9.3.164-g2105d2e-aliyun及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-portstring复用已有虚拟服务器组,仅在复用已有SLB场景下生效。如果有多个端口及虚拟服务器组的组合,可以通过半角逗号(,)分隔。v2.0.1及以上版本
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weightstring在多个Service复用同一个SLB的场景下,设置当前Service接收流量的权重。该Annotation仅在复用已有虚拟服务器组场景下生效。v2.0.1及以上版本
阿里云首页 容器服务 Kubernetes 版 ACK 相关技术圈