當沒有可用的負載平衡時,cloud-controller-manager(CCM)組件自動為LoadBalancer類型的服務建立並管理負載平衡,該執行個體類型包含:傳統型負載平衡CLB(Classic Load Balancer)和網路型負載平衡NLB(Network Load Balancer)。本文以Nginx應用為例,介紹如何通過使用自動建立負載平衡的服務來公開應用。
注意事項
CCM只為
Type=LoadBalancer類型的Service配置負載平衡,對於非LoadBalancer類型的Service則不會為其配置負載平衡。CCM使用聲明式API,會在一定條件下自動根據服務的配置重新整理負載平衡配置。自行在負載平衡控制台上修改的配置均存在被覆蓋的風險。
重要請勿在負載平衡控制台上手動修改Kubernetes建立並維護的負載平衡的任何配置,否則有配置丟失的風險,造成服務不可訪問。
已建立的LoadBalancer類型Service不支援重新指定負載平衡。如需更換負載平衡,請重新建立Service。
當Type=LoadBalancer的Service變更為Type!=LoadBalancer時,CCM會刪除為該負載平衡添加的配置,從而造成無法通過該負載平衡訪問Service。
配額限制
步驟一:部署樣本應用
以下應用部署通過kubectl命令列方式進行。
使用以下樣本應用的YAML內容,建立名為my-nginx.yaml檔案。
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1 kind: Deployment metadata: name: my-nginx # 樣本應用的名稱。 labels: app: nginx spec: replicas: 3 # 設定副本數量。 selector: matchLabels: app: nginx # 對應服務中Selector的值需要與其一致,才可以通過服務公開此應用。 template: metadata: labels: app: nginx spec: containers: - name: nginx image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest # 替換為實際的鏡像地址,格式為:<image_name:tags>。 ports: - containerPort: 80 # 需要在服務中暴露該連接埠。部署樣本應用my-nginx。
kubectl apply -f my-nginx.yaml確認樣本應用狀態正常。
kubectl get deployment my-nginx返回結果樣本:
NAME READY UP-TO-DATE AVAILABLE AGE my-nginx 3/3 3 3 50s
步驟二:通過使用自動建立負載平衡的服務公開應用
可通過控制台和kubectl兩種方式來建立LoadBalancer類型的服務,並通過其公開應用。
控制台操作指導
登入容器計算服務控制台,在左側導覽列選擇叢集列表。
在集群列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇網路 > 服務。
在服務頁面,單擊左上方的建立。
在建立服務對話方塊中,設定服務的相關參數。
配置項
描述
樣本
服務名稱
輸入Service(服務)的名稱。
my-nginx-svc
服務類型
選擇Service類型,Service網路支援以下模式,分別對接不同來源和類型的用戶端的訪問,包括:
選擇負載平衡的服務類型。
負載平衡類型選擇傳統型負載平衡 CLB,選擇資源為建立資源。
按需調整建立 CLB 資源下拉框中的配置項,選擇計費方式為按規格計費(PayBySpec)。
外部流量策略
服務類型為節點連接埠或負載平衡時,才能設定外部流量策略。
Local:流量只發給本節點的Pod。
Cluster:流量可以轉寄到叢集中其他節點上的Pod。
Local
服務關聯
選擇服務要綁定的後端應用。若不進行關聯部署,則不會建立相關的Endpoints對象。關於服務關聯的詳細介紹,請參見services-without-selectors。
名稱:app
值:nginx
連接埠映射
添加服務連接埠(對應Service YAML檔案中的
port)和容器連接埠(對應Service YAML檔案中的targetPort),容器連接埠需要與後端的Pod中暴露的容器連接埠一致。80
註解
為該服務添加一個註解(Annotation),配置負載平衡的參數。更多參數,請參見通過Annotation配置傳統型負載平衡CLB。
重要請勿複用叢集的API Server的Server Load Balancer執行個體,否則將導致叢集訪問異常
本樣本中,將該服務的收費方式設定為按頻寬收費,頻寬峰值設定為2 Mbit/s,從而控制服務的流量。如下所示:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-charge-type:paybybandwidthservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-bandwidth:2
標籤
為該服務添加一個標籤,標識該服務。
無
kubectl操作指導
使用以下樣本服務的YAML內容,建立名為my-nginx-svc.yaml的檔案。
確保Service的
selector欄位值(本樣本為app: nginx)與後端應用Deployment中matchLabels的欄位值一致,從而將該服務關聯至後端應用。apiVersion: v1 kind: Service metadata: labels: app: nginx name: my-nginx-svc namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: LoadBalancer執行以下命令,建立名為my-nginx-svc的服務,並通過其公開應用。
kubectl apply -f my-nginx-svc.yaml執行以下命令,確認LoadBalancer類型的服務已成功建立。
kubectl get svc my-nginx-svc預期輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-nginx-svc LoadBalancer 172.21.5.82 39.106.XX.XX 80/TCP 5m執行以下命令,訪問樣本應用。
curl <YOUR-External-IP> # 請將<YOUR-External-IP>替換為上面擷取到的EXTERNAL-IP地址。預期輸出:
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>