通過阿里雲Server Load Balancer (SLB)暴露的服務(Service),在叢集外可通過SLB網域名稱或<IP:服務連接埠>的方式訪問服務,在叢集內可通過<服務名:服務連接埠>的方式訪問服務。本文以Nginx應用為例,介紹如何在ACS叢集中通過使用已有負載平衡的服務來公開應用。
前提條件
已存在通過SLB控制台建立的SLB執行個體,且該執行個體與ACS叢集處於同一地區。本樣本中使用公網CLB執行個體,如果沒有建立,請參見建立和管理CLB執行個體。
注意事項
複用SLB使用限制
被複用的SLB需要滿足以下限制條件:
支援複用通過SLB控制台手動建立的SLB,不支援複用Cloud Controller Manager(CCM)自動建立的SLB及叢集APIServer SLB。
如果您需要在ACS叢集中複用私網類型的SLB,則該SLB需要和ACS叢集處於同一VPC下。
複用SLB的地址類型必須與服務的訪問類型一致:
當服務為公網訪問(即
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "internet")時,所用SLB的地址類型必須為公網;當服務為內部訪問(即
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet")時,所用SLB的地址類型必須為私網。
多個服務不能同時使用一個SLB的同一個監聽連接埠。
跨叢集複用已有SLB時,需要確保兩個叢集的命名空間+Service組合名稱不一致。
CCM只為
Type=LoadBalancer類型的服務配置SLB。對於非LoadBalancer類型的服務,不會為其配置負載平衡。重要當
Type=LoadBalancer的服務變更為其他類型時,CCM會刪除為該SLB添加的配置,從而造成無法通過該SLB訪問服務。CCM使用聲明式API,會在一定條件下自動根據服務的配置重新整理SLB配置。當
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"時,您自行在SLB控制台上修改的配置均存在被覆蓋的風險。重要請勿在SLB控制台上手動修改ACS建立並維護的SLB的任何配置,否則有配置丟失的風險,造成服務不可訪問。
已建立的LoadBalancer類型Service不支援重新指定SLB。如果您需要更換SLB,請重新建立Service。
SLB配額限制
步驟一:部署樣本應用
以下應用部署通過kubectl命令列方式進行。
使用以下樣本應用的YAML內容,建立名為my-nginx.yaml的檔案。
執行以下命令,部署樣本應用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
步驟二:通過使用已有SLB的服務公開應用
您可以通過控制台和kubectl兩種方式來建立LoadBalancer類型的服務,並通過其公開應用。
通過控制台建立服務
登入容器計算服務控制台,在左側導覽列選擇叢集。
在叢集頁面,單擊目的地組群ID,然後在左側導覽列,選擇網路 > 服務。
在服務頁面,單擊左上方的建立。
在建立服務對話方塊中,設定服務的相關參數。
配置項
描述
樣本
名稱
輸入服務的名稱。
my-nginx-svc
服務類型
選擇服務類型,即服務訪問的方式。
建立服務:
服務類型:負載平衡 (LoadBalancer)
負載平衡類型:傳統型負載平衡 CLB
選擇資源:使用已有資源
強制覆蓋已有監聽:勾選
服務關聯
選擇關聯該服務要綁定的後端應用。若不進行關聯部署,則不會建立相關的Endpoints對象,您也可自己進行綁定,請參見services-without-selectors。
通過+引用工作負載標籤選擇my-nginx:
名稱:app
值:nginx
連接埠映射
添加服務連接埠(對應Service YAML檔案中的
port)和容器連接埠(對應Service YAML檔案中的targetPort),容器連接埠需要與後端的Pod中暴露的容器連接埠一致。服務連接埠:80
容器連接埠:80
協議:TCP
註解
為該服務添加一個註解(Annotation),配置負載平衡的參數。更多註解,請參見通過Annotation配置傳統型負載平衡CLB。
本樣本中,將該服務的收費方式設定為按頻寬收費,頻寬峰值設定為2 Mbit/s,從而控制服務的流量。
設定付費模式:
名稱:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-charge-type值:paybybandwidth
設定頻寬:
名稱:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-bandwidth值:2
標籤
為該服務添加一個標籤,標識該服務。
無
單擊建立,在服務頁面,可以看到新建立的服務。
通過該服務在外部 IP 位址(External IP)列的實際IP地址,如39.106.XX.XX:80,訪問樣本應用。

通過kubectl建立服務
使用以下樣本服務的YAML內容,建立名為my-nginx-svc.yaml的檔案。
修改
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id的值,請替換${YOUR_LB_ID}為您通過負載平衡管理主控台建立的SLB執行個體ID。使用已有的SLB執行個體時,預設情況下不會為該SLB建立監聽或覆蓋已有監聽。如有需要,請設定
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners為true。本樣本中,SLB執行個體為新建立,需要為其建立監聽,因此設為true。更多註解,請參見通過Annotation配置傳統型負載平衡CLB。將
selector修改為my-nginx.yaml樣本應用檔案中matchLabels的值(即:app: nginx),從而將該服務關聯至後端應用。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${YOUR_LB_ID} service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: 'true' 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實際地址。curl 39.106.XX.XX返回結果樣本:
<!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>