通過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=val1
和key2=val2
條件的ENS節點池會被選中建立ELB,多個Label之間是And關係。key in (val1,val2)
,即符合key=val1
或key=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 |
對應的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 | 電訊廠商資訊:
| 無 |
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以英文半形逗號(,)分隔,例如 | 無 |
如需排除邊緣節點作為後端伺服器,在邊緣節點上打標籤: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=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 | 監聽連接埠對後端的調度演算法:
| 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
進階配置
本節介紹兩種進階方式配置負載平衡。
在不同的情境建立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
找到對應節點池(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。