全部產品
Search
文件中心

Container Service for Kubernetes:通過配置Annotation對ELB進行的常見配置

更新時間:Jun 08, 2024

通過Service YAML檔案中的Annotation(註解),可以實現豐富的負載平衡功能。本文從邊緣負載平衡(Edge Load Balancer,ELB)、監聽和後端伺服器組以及邊緣Elastic IP Address(邊緣EIP)四種資源維度來介紹通過註解可以對ELB進行的常見配置操作。

注意事項

  • 註解內容區分大小寫,規定統一使用小寫。

  • Service類型必須指定為 type: LoadBalancer

  • 使用ELB作為負載平衡必須指定LB類型:loadBalancerClass: alibabacloud.com/elb

邊緣負載平衡ELB

重要

負載平衡規格、付費方式請參見CreateLoadBalancer,負載平衡一經建立不支援配置更新。

建立一個由EdgeControllerManager管理的ELB

  • 必須指定NodePoolSelector,目前支援兩種形式:

    • key1=val1,key2=val2,即同時符合key1=val1key2=val2條件的ENS節點池會被選中建立ELB,多個Label之間是And關係。

    • key in (val1,val2),即符合key=val1key=val2條件的ENS節點池會被選中建立ELB,多個Value之間為Or的關係。

  • openyurt.io/topologyKeys: openyurt.io/nodepool為指定節點池內的服務拓撲,確保流量只會轉寄到本節點池內的負載Pod上。

    對應的YAML:

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      namespace: default
      annotations:
        openyurt.io/topologyKeys: openyurt.io/nodepool           #開啟流量拓撲
        service.openyurt.io/nodepool-labelselector: key1=val1    #選擇ENS節點池 
    spec:
      ports:
      - name: nginx-80
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: LoadBalancer
      loadBalancerClass: alibabacloud.com/elb

建立ELB時指定規格

註解內容

描述

預設值

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec

Server Load Balancer執行個體規格,請參見執行個體規格和計費,通過該參數可以建立指定規格的ELB。

elb.s2.small

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-pay-type

負載平衡付費類型,僅支援隨用隨付(PostPaid)。計費規則,請參見計費說明

PostPaid

對應的YAML:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool          
    service.openyurt.io/nodepool-labelselector: key1=val1   
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: elb.s1.small
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-pay-type: PostPaid    
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb

建立ELB時指定網路暴露類型

註解內容

描述

預設值

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type

負載平衡暴露類型:

  • internet:服務通過公網訪問,購買一個私網ELB,並且購買一個EIP綁定這個私網ELB。

  • intranet:服務通過私網訪問,購買一個私網ELB。

internet

對應的YAML:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool          
    service.openyurt.io/nodepool-labelselector: key1=val1
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internet 
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb

建立公網暴露服務時,選擇EIP規格

公網暴露會購買一個私網ELB和一個公網EIP。

註解內容

描述

預設值

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-bandwidth

公網頻寬為峰值頻寬。單位:Mbps。

10

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-isp

電訊廠商資訊:

  • cmcc: 中國移動。

  • unicom: 中國聯通。

  • elecom: 中國電信。

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-instance-charge-type

EIP的執行個體計費方式,僅支援隨用隨付(PostPaid)。

PostPaid

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-internet-charge-type

EIP的公網頻寬計費方式,僅支援月95頻寬計費(95BandwidthByMonth)。

95BandwidthByMonth

對應的YAML:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool           #開啟流量拓撲
    service.openyurt.io/nodepool-labelselector: key1=val1    #選擇ENS節點池
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: internet     
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-bandwidth: "10"
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-isp: cmcc
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-instance-charge-type: "PostPaid"
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-eip-internet-charge-type: "95BandwidthByMonth"
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb

後端伺服器組

  • 採用Local模式的外部流量策略僅將掛載應用Pod的節點作為後端伺服器。若多個Service共用一個ELB,則不支援設定為Local模式的外部流量策略。

  • 外部流量策略採用Cluster模式,將會將制定VPC內所有的ENS叢集節點作為後端伺服器。

對應的YAML:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool           #開啟流量拓撲
    service.openyurt.io/nodepool-labelselector: key1=val1    #選擇ENS節點池
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb
  externalTrafficPolicy: Local

使用指定Label的邊緣節點作為後端伺服器

註解內容

描述

預設值

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-label

指定通過Label指定CLB後端掛載哪些Worker節點。多個Label以英文半形逗號(,)分隔,例如k1=v1,k2=v2。多個Label之間是And關係。

如需排除邊緣節點作為後端伺服器,在邊緣節點上打標籤:node.kubernetes.io/exclude-from-external-load-balancers=true

對應的YAML:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool
    service.openyurt.io/nodepool-labelselector: key1=val1
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-label: key2=val2
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb
  externalTrafficPolicy: Local

配置ELB後端權重

註解內容

描述

預設值

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-weight

如果監聽採用權重輪詢(WRR)方法,則會根據後端的權重均衡訪問請求到後端伺服器,其中多個節點與權重以逗號分隔。

例如base=50,node1=80,node2=90,其中base表示應用到全部後端伺服器的權重,對指定節點的權重將會按照指定值設定。

base=100

對應的YAML:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool
    service.openyurt.io/nodepool-labelselector: key1=val1,key2=val2
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-weight: base=50,node1=80,node2=90
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb

監聽

ECM會根據Service的Spec.ports的連接埠自動建立監聽,後端監聽連接埠由叢集分配。如需指定後端監聽連接埠,則需要設定nodePort: ${YOUR_SPEC_PORT}。YAML如下:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool
    service.openyurt.io/nodepool-labelselector: key1=val1
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    nodePort: 30080
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb

為監聽設定調度演算法

註解內容

描述

預設值

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler

監聽連接埠對後端的調度演算法:

  • wrr:加權輪詢,權重值越高的後端伺服器被輪詢的次數越多。

  • rr:輪詢,按照訪問順序依次將外部請求分發給後端伺服器。

  • wlc:除了根據每台後端伺服器設定的權重值來進行輪詢,同時還考慮後端伺服器的實際負載(即串連數)。

  • sch:基於源IP地址的一致性Hash,相同的源地址會調度到相同的後端伺服器。

  • qch:基於QUIC Connection ID 一致性Hash,相同的QUIC Connection ID會調度到相同的後端伺服器。

  • iqch:針對iQUIC CID的特定三個位元組進行一致Hash,第2~第4個位元組相同的會調度到相同的後端伺服器。

rr

對應的YAML:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool
    service.openyurt.io/nodepool-labelselector: key1=val1
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler: "wrr"
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    nodePort: 30080
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb

為TCP類型連接埠配置會話保持時間

註解內容

描述

預設值

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-persistence-timeout

會話保持時間。僅針對TCP協議的監聽。如果Server Load Balancer執行個體配置了多個TCP協議的監聽連接埠,則預設將該配置應用到所有TCP協議的監聽連接埠。

單位:秒。取值[0, 3600]。為0表示會話保持關閉。

0

為TCP類型連接埠配置連線逾時時間

註解內容

描述

預設值

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-established-timeout

連線逾時時間。單位:秒。取值範圍為[10, 900]。

500

對應的YAML:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
    openyurt.io/topologyKeys: openyurt.io/nodepool
    service.openyurt.io/nodepool-labelselector: key1=val1,key2=val2
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-established-timeout: "900"
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    nodePort: 30080
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb

配置監聽的健全狀態檢查

註解內容

描述

預設值

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-healthy-threshold

健全狀態檢查連續成功多少次後,將後端伺服器的健全狀態檢查狀態由 fail(後台伺服器不可達)判定為 success(後台伺服器可達)。取值範圍為[2~10]。

3

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-unhealthy-threshold

健全狀態檢查連續失敗多少次後,將後端伺服器的健全狀態檢查狀態由 success(後台伺服器可達)判定為 fail(後台伺服器不可達)。取值範圍為[2~10]。

3

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-check-interval

健全狀態檢查的時間間隔。取值範圍為[2~10]。單位:秒。

2

service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-timeout

接收來自健全狀態檢查的響應需要等待的時間。如果後端 ECS 在指定的時間內沒有響應,則判定為健全狀態檢查失敗。取值範圍為[1~300]。單位:秒。

5

對應的YAML:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: default
  annotations:
   openyurt.io/topologyKeys: openyurt.io/nodepool
   service.openyurt.io/nodepool-labelselector: key1=val1,key2=val2
   service.beta.kubernetes.io/alibaba-cloud-loadbalancer-healthy-threshold: "5"
   service.beta.kubernetes.io/alibaba-cloud-loadbalancer-unhealthy-threshold: "5"
   service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-interval: "2"
   service.beta.kubernetes.io/alibaba-cloud-loadbalancer-health-check-connect-timeout: "5"
spec:
  ports:
  - name: nginx-80
    port: 80
    protocol: TCP
    nodePort: 30080
    targetPort: 80
  selector:
    app: nginx
  type: LoadBalancer
  loadBalancerClass: alibabacloud.com/elb

進階配置

本節介紹兩種進階方式配置負載平衡。

  1. 在不同的情境建立Service。

    指定已有的ELB

    使用既存的負載平衡時,需要指定網路的ID以及其對應的負載平衡ID。

    • 按以下YAML建立Service。

      apiVersion: v1
      kind: Service
      metadata:
        name: nginx
        namespace: default
        annotations:
          openyurt.io/topologyKeys: openyurt.io/nodepool           #開啟流量拓撲
          service.openyurt.io/nodepool-labelselector: key1=val1
          service.beta.kubernetes.io/alibaba-cloud-loadbalancer-managed-by-user: "true"
      spec:
        ports:
        - name: nginx-80
          port: 80
          protocol: TCP
          targetPort: 80
        selector:
          app: nginx
        type: LoadBalancer
        loadBalancerClass: alibabacloud.com/elb

    多個Service複用一個ELB

    • 只可採用Cluster模式的外部流量策略。

    • 需要使用者自己管理的ELB執行個體,並且指定使用的ELB。

    • 如果開啟EIP提供公網訪問能力,需要使用者自己建立EIP執行個體並且管理。

    • 需要指定強制覆蓋監聽為true。

    對應的YAML:

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      namespace: default
      annotations:
        openyurt.io/topologyKeys: openyurt.io/nodepool           #開啟流量拓撲
        service.openyurt.io/nodepool-labelselector: key1=val1
        service.openyurt.io/elb-force-override-listeners: "true"
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-managed-by-user: "true"
    spec:
      ports:
      - name: nginx-80
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: nginx
      type: LoadBalancer
      loadBalancerClass: alibabacloud.com/elb
  2. 找到對應節點池(ENS VPC)的PoolService,執行以下命令為其配置指定負載平衡。

    kubectl annotate ps {<SERVICENAME>-NodePoolID} service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id=<lb_ID>
    說明

    上述命令中的<SERVICENAME>請替換為實際的節點池(ENS VPC)的PoolService的名稱;

    <lb_ID> 請替換為實際的LoadBalancer ID。