全部產品
Search
文件中心

Container Compute Service:通過使用已有負載平衡的服務公開應用

更新時間:Dec 28, 2024

通過阿里雲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配額限制

  • CCM會為Type=LoadBalancer類型的Service建立負載平衡。預設情況下一個使用者可以保留60個執行個體。如果需要建立的數量大於60,請到配額平台提交申請

  • CCM會根據Service的配置將ECS掛載到負載平衡後端伺服器組中。

    • 預設情況下一個ECS執行個體可掛載的後端伺服器組的數量為50個,如果一台ECS需要掛載到更多的後端伺服器組中,請到配額平台提交申請

    • 預設情況下一個執行個體可以掛載200個後端伺服器,如果需要掛載更多的後端伺服器,請到配額平台提交申請

  • CCM會根據Service中定義的連接埠建立監聽。預設情況下一個執行個體可以添加50個監聽,如需添加更多監聽,請到配額平台提交申請

  • 更多負載平衡使用限制,請參見CLB使用限制NLB使用限制

    負載平衡配額查詢請參見負載平衡配額管理

步驟一:部署樣本應用

以下應用部署通過kubectl命令列方式進行。

  1. 在CloudShell上通過kubectl管理Kubernetes叢集

  2. 使用以下樣本應用的YAML內容,建立名為my-nginx.yaml的檔案。

    展開查看YAML內容

    apiVersion: apps/v1
    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
            ports:
            - containerPort: 80        #需要在服務中暴露該連接埠。
  3. 執行以下命令,部署樣本應用my-nginx。

    kubectl apply -f my-nginx.yaml
  4. 執行以下命令,確認樣本應用狀態正常。

    kubectl get deployment my-nginx

    返回結果樣本:

    NAME       READY   UP-TO-DATE   AVAILABLE   AGE
    my-nginx   3/3     3            3           50s

步驟二:通過使用已有SLB的服務公開應用

您可以通過控制台kubectl兩種方式來建立LoadBalancer類型的服務,並通過其公開應用。

通過控制台建立服務

  1. 登入容器計算服務控制台,在左側導覽列選擇叢集

  2. 叢集頁面,單擊目的地組群ID,然後在左側導覽列,選擇網路 > 服務

  3. 服務頁面,單擊左上方的建立

  4. 建立服務對話方塊中,設定服務的相關參數。

    配置項

    描述

    樣本

    名稱

    輸入服務的名稱。

    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

    標籤

    為該服務添加一個標籤,標識該服務。

  5. 單擊建立,在服務頁面,可以看到新建立的服務。

  6. 通過該服務在外部 IP 位址(External IP)列的實際IP地址,如39.106.XX.XX:80,訪問樣本應用。

    image

通過kubectl建立服務

  1. 使用以下樣本服務的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-listenerstrue。本樣本中,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
  2. 執行以下命令建立名為my-nginx-svc的服務,並通過其公開應用。

    kubectl apply -f my-nginx-svc.yaml
  3. 執行以下命令確認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
  4. 執行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>