全部產品
Search
文件中心

:通過使用已有負載平衡的服務暴露應用

更新時間:Nov 21, 2024

通過阿里雲負載平衡暴露的服務(Service),在叢集外可通過負載平衡網域名稱或<IP:服務連接埠>的方式訪問服務,在叢集內可通過<服務名:服務連接埠>的方式訪問服務。本文以Nginx應用為例,介紹如何通過使用已有負載平衡的服務來公開應用。

前提條件

使用說明

對於指定已有負載平衡,ACK叢集的cloud-controller-manager組件版本不同,對應的監聽策略也有所不同:

  • cloud-controller-manager組件為v1.9.3.59-ge3bc999-aliyun及以上版本:在指定已有負載平衡時,cloud-controller-manager預設不再為該執行個體處理監聽。您可以通過添加Annotation(註解)service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true"來啟用監聽配置,或者手動設定該負載平衡的監聽規則。

  • cloud-controller-manager組件為v1.9.3.59-ge3bc999-aliyun以下版本:在指定已有Server Load Balancer執行個體時,cloud-controller-manager會自動產生並管理該執行個體的後端伺服器組,並確保監聽器指向這些由K8s管理的後端資源,即使這些監聽器可能之前是由您手動設定的。

展開查看cloud-controller-manager版本的方法:

使用控制台

在叢集的組件管理頁面查看cloud-controller-manager組件版本。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇營運管理 > 組件管理

  3. 組件管理頁面的核心組件頁簽下,查看Cloud Controller Manager組件的版本資訊。

使用kubectl命令列(僅適用於ACK專有版叢集

kubectl get pod -n kube-system -o yaml|grep image:|grep cloud-con|uniq

注意事項

在使用已有負載平衡公開應用之前,建議您先瞭解相關注意事項。詳細資料,請參見:

步驟一:部署樣本應用

本文以Nginx無狀態應用為例,指導您如何在ACK中通過負載平衡類型的Service暴露應用。

控制台操作指導

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 無狀態

  3. 無狀態頁面,單擊使用鏡像建立,配置應用的基本資料、容器配置、進階配置等。

    1. 應用基本資料頁簽中,配置應用程式名稱,本樣本為my-nginx,其他參數保持預設值,然後單擊下一步

    2. 容器配置頁簽中,設定容器鏡像名稱、連接埠,其他參數保持預設值,然後單擊下一步

      配置項

      取值

      鏡像名稱

      單擊選擇鏡像,在選擇鏡像及版本對話方塊單擊製品中心頁簽,然後搜尋nginx,選擇名稱為openanolis/nginx的鏡像倉庫,單擊選擇鏡像版本,設定鏡像的版本,完成後單擊確定

      連接埠

      • 名稱:nginx。

      • 容器連接埠:80。

    3. 進階配置頁簽中,保持預設,單擊建立,完成Nginx應用的建立。

kubectl操作指導

  1. 使用以下樣本應用的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: 2       # 設定副本數量。
      selector:
        matchLabels:
          app: nginx     # 對應服務中Selector的值需要與其一致,才可以通過服務公開此應用。
      template:
        metadata:
          labels:
            app: nginx
        spec:
        #  nodeSelector:
        #    env: test-team
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80                                # 需要在服務中暴露該連接埠。
  2. 執行以下命令,部署樣本應用my-nginx。

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

    kubectl get deployment my-nginx

    預期輸出:

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

步驟二:通過使用已有負載平衡的服務公開應用

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

控制台操作指導

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

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

  3. 服務頁面,單擊建立,在建立服務對話方塊中設定服務相關的參數。

    配置項

    描述

    樣本

    服務名稱

    輸入Service(服務)的名稱。

    my-nginx-svc

    服務類型

    選擇Service類型,Service網路支援以下模式,分別對接不同來源和類型的用戶端的訪問,包括:

    虛擬叢集IP(ClusterIP)

    虛擬叢集IP(ClusterIP)主要服務於叢集內部通訊,僅當服務類型設定為虛擬ClusterIP時,才支援服務執行個體之間的發現。通過使用無頭服務Headless Service,您可以與其他服務發現機制互動,而不必依賴Kubernetes預設提供的基於ClusterIP的服務發現和負載平衡。

    負載平衡(LoadBalancer)

    負載平衡提供了一種方法,通過整合阿里雲負載平衡器CLB(Classic Load Balancer)及網路型負載平衡NLB(Network Load Balancer),可以將叢集內部應用對外暴露。相比於NodePort方式,能夠顯著提升應用的可用性和效能。支援配置如下類型:

    節點連接埠(NodePort)

    節點連接埠(NodePort)提供了一種便捷的方式,使得外部使用者可以通過節點的IP地址和指定的連接埠來訪問叢集中的服務。通過訪問 <NodeIP>:<NodePort>,使用者能夠串連到NodePort服務,但是實現負載平衡的配置則需要您自己手動完成。

    1. 選擇負載平衡的服務類型。

    2. 單擊使用已有CLB,然後在下拉式清單選擇已建立的CLB執行個體。

      本樣本中的CLB執行個體為新建立,需要為其建立監聽,因此選中強制覆蓋已有監聽

    外部流量策略

    您的服務類型為節點連接埠負載平衡時,才能設定外部流量策略。關於外部流量策略的詳細介紹,請參見Service快速入門

    • Local:流量只發給本節點的Pod。

    • Cluster:流量可以轉寄到叢集中其他節點上的Pod。

    Local

    服務關聯

    選擇服務要綁定的後端應用。若不進行關聯部署,則不會建立相關的Endpoints對象。關於服務關聯的詳細介紹,請參見services-without-selectors

    名稱:app

    值:my-nginx

    連接埠映射

    添加服務連接埠(對應Service YAML檔案中的port)和容器連接埠(對應Service YAML檔案中的targetPort),容器連接埠需要與後端的Pod中暴露的容器連接埠一致。

    80

    註解

    為該服務添加一個註解(Annotation),配置負載平衡的參數。更多參數,請參見通過Annotation配置傳統型負載平衡CLB通過Annotation配置網路型負載平衡NLB

    重要

    請勿複用叢集的API Server的Server Load Balancer執行個體,否則將導致叢集訪問異常

    本樣本中,將該服務的收費方式設定為按頻寬收費,頻寬峰值設定為2 Mbit/s,從而控制服務的流量。如下所示:

    • service.beta.kubernetes.io/alibaba-cloud-loadbalancer-charge-type:paybybandwidth

    • service.beta.kubernetes.io/alibaba-cloud-loadbalancer-bandwidth:2

    標籤

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

    服務刪除保護

    為關鍵業務和敏感性資料的Service開啟刪除保護,以避免誤刪帶來的維護成本。啟用後,僅在手動關閉刪除保護後,資源才能被刪除。

    說明

    該功能需先安裝容器安全性原則的policy-template-controllergatekeeper組件,您可以單擊立即安裝完成組件的部署。

    關閉

    單擊確定

  4. 服務頁面,單擊目標服務名稱,進入服務詳情頁面,在基本資料地區,單擊該服務的外部端點,例如39.106.XX.XX:80,訪問樣本應用。

Kubectl操作指導

  1. 建立Service。

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

    • 修改service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id,請將${YOUR_LB_ID}替換為您通過負載平衡管理主控台建立的Server Load Balancer執行個體ID。

    • 在使用已有的Server Load Balancer執行個體時,預設情況下不會為該負載平衡建立監聽或覆蓋已有監聽。如有需要覆蓋監聽,可以設定service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners"true"。本樣本中,Server Load Balancer執行個體為新建立,需要為其建立監聽,因此設為true。更多註解請參見通過Annotation配置傳統型負載平衡CLB通過Annotation配置網路型負載平衡NLB

    • selector修改為my-nginx.yaml樣本應用檔案中matchLabels的值(即:app: nginx),從而將該服務關聯至後端應用。

    apiVersion: v1
    kind: Service # 定義資來源物件為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

    欄位

    說明

    kind

    定義資來源物件為Service。

    metadata

    定義Service的名稱、Label和命名空間等基本資料。

    metadata.annotations

    支援豐富的負載平衡相關的註解(Annotations)。例如,在上面的YAML樣本中,service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type指定Service的訪問方式為intranet(私網訪問)。更多註解,請參見通過Annotation配置傳統型負載平衡CLB

    spec.selector

    定義Service的選取器。Service會根據Selector和Pod Label的匹配關係,確定Service所要關聯暴露的後端Pod。

    spec.ports.port

    定義Service暴露給ClusterIP的連接埠,叢集內部用戶端訪問Service的入口,即clusterIP:port

    spec.ports.targetPort

    定義後端Pod的連接埠。從port進來的流量,經由kube-proxy流入到後端Pod的targetPort上,最後進入容器。

    spec.type

    定義Service的被訪問方式。

    • LoadBalancer:使用阿里雲負載平衡公開服務。當Service沒有指定已有負載平衡時,預設建立的Server Load Balancer執行個體類型為公網。您可以通過設定註解intranet,來建立私網訪問的Service以及相應的私網負載平衡。更多資訊,請參見通過Annotation配置傳統型負載平衡CLB通過Annotation配置網路型負載平衡NLB

    • ClusterIP:在叢集內部公開服務,可用於叢集內部訪問。

    • NodePort:使用節點的連接埠映射到後端Service,叢集外可以通過節點IP:NodePort訪問。

    • ExternalName:將服務對應到DNS。

  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:30471/TCP   5m
  4. 執行以下命令,訪問樣本應用。

    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>

傳統型負載平衡CLB

建立CLB資源

建立CLB(Classic Load Balancer)時,您可以根據建立CLB資源描述進行建立。更多資訊,請參見建立和管理CLB執行個體

名稱

描述

名稱

自訂CLB的名稱。

訪問方式

根據需要可選擇公網訪問私網訪問

計費方式

根據需要可選按規格計費(PayBySoec)隨用隨付(PayByCLCU)更多資訊,請參見CLB計費概述

IP版本

根據需要可選擇IPv4IPv6

調度演算法

支援輪詢(RR)或加權輪詢(WRR)兩種策略。RR(預設取值):按照訪問順序依次將外部請求依序分發到後端伺服器;WRR:權重值越高的後端伺服器,被輪詢到的次數(機率)也越高。

存取控制

提供監聽層級的存取控制。詳細資料,請參見存取控制

健全狀態檢查

支援TCP和HTTP協議。開啟健全狀態檢查後,您可以通過健全狀態檢查來判斷後端伺服器的業務可用性。健全狀態檢查原理,請參見CLB健全狀態檢查工作原理

其他

您還可以通過Annotation配置傳統型負載平衡。詳細資料,請參見通過Annotation配置傳統型負載平衡CLB

使用已有資源

您可以從下拉式功能表中選擇已有的CLB(Classic Load Balancer)執行個體進行複用。可以選擇是否勾選強制覆蓋已有監聽,更多資訊請參見,使用已有的負載平衡,並強制覆蓋已有監聽

重要

複用CLB執行個體存在一些限制,以及相關的注意事項,詳細資料請參見哪些負載平衡可以被複用?

配置相關資源

名稱

描述

調度演算法

支援輪詢(RR)或加權輪詢(WRR)兩種策略。RR(預設取值):按照訪問順序依次將外部請求依序分發到後端伺服器;WRR:權重值越高的後端伺服器,被輪詢到的次數(機率)也越高。

存取控制

提供監聽層級的存取控制。詳細資料,請參見存取控制

健全狀態檢查

支援TCP和HTTP協議。開啟健全狀態檢查後,您可以通過健全狀態檢查來判斷後端伺服器的業務可用性。健全狀態檢查原理,請參見負載平衡健全狀態檢查工作原理

其他

您還可以通過Annotation配置傳統型負載平衡。詳細資料,請參見通過Annotation配置傳統型負載平衡CLB

網路型負載平衡NLB

建立NLB資源

建立網路型負載平衡NLB(Network Load Balancer ),您可以根據建立NLB資源描述進行建立。更多資訊,請參見建立和管理NLB執行個體

名稱

描述

名稱

自訂NLB的名稱。僅建立NLB需要配置。

訪問方式

根據需要可選擇公網訪問私網訪問

計費方式

隨用隨付。更多資訊,請參見NLB產品計費

IP版本

根據需要可選擇IPv4雙棧

調度演算法

選擇一種調度演算法。

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

  • 加權輪詢(預設):權重值越高的後端伺服器,被輪詢到的次數(機率)也越高。

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

  • 四元組雜湊:基於四元組(源IP、目的IP、源連接埠和目的連接埠)的一致性雜湊,相同的流會調度到相同的後端伺服器。

  • QUIC ID雜湊:基於QUIC ID的一致性雜湊,支援將同一個QUIC ID的請求雜湊到同一台後端伺服器上。

  • 加權最小串連數:除了根據每台後端伺服器設定的權重值來進行輪詢,同時還考慮後端伺服器的實際負載(即串連數)。當權重值相同時,當前串連數越小的後端伺服器被輪詢到的次數(機率)也越高。

健全狀態檢查

開啟或關閉健全狀態檢查。

  • TCP(預設):通過發送SYN握手報文來檢測伺服器連接埠是否存活。

    • 健康響應逾時時間:輸入接收來自健全狀態檢查的響應需要等待的時間。如果後端伺服器在指定的時間內沒有正確響應,則判定為健全狀態檢查失敗。

    • 健康間隔時間:輸入用於健全狀態檢查的時間間隔。

    • 健康閾值:健全狀態檢查連續成功多少次後,將後端伺服器的健全狀態檢查狀態由失敗判定為成功的次數。

    • 不健康閾值:健全狀態檢查連續失敗多少次後,將後端伺服器的健全狀態檢查狀態由成功判定為失敗的次數。

  • HTTP:通過發送HEAD或GET請求類比瀏覽器的訪問行為來檢查伺服器應用是否健康。

    • 網域名稱:輸入健全狀態檢查的網域名稱。

      • 使用後端伺服器內網IP(預設):使用後端伺服器的內網IP地址作為健全狀態檢查的網域名稱。

      • 指定特定網域名稱:輸入一個網域名稱。

    • 路徑:輸入健全狀態檢查頁面的URL。

    • 健康狀態返回碼:可以選擇http_2xx(預設)、http_3xxhttp_4xxhttp_5xx

其他

您還可以通過Annotation配置網路型負載平衡。詳細資料請參見通過Annotation配置網路型負載平衡NLB

專用網路

叢集預設專用網路地區和VPC ID。

虛擬交換器

您可以選擇叢集預設專用網路下,已支援的可用性區域對應的虛擬交換器,還可以單擊建立虛擬交換器選擇建立。

使用已有資源

您可以從下拉式功能表中選擇已有的NLB(Network Load Balancer)執行個體進行複用。還可以根據需要是否勾選強制覆蓋已有監聽,詳細資料請參見使用已有的負載平衡

重要

複用NLB執行個體存在一些限制,以及相關的注意事項,詳細資料請參見哪些負載平衡可以被複用?

配置相關資源

名稱

描述

調度演算法

選擇一種調度演算法。

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

  • 加權輪詢(預設):權重值越高的後端伺服器,被輪詢到的次數(機率)也越高。

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

  • 四元組雜湊:基於四元組(源IP、目的IP、源連接埠和目的連接埠)的一致性雜湊,相同的流會調度到相同的後端伺服器。

  • QUIC ID雜湊:基於QUIC ID的一致性雜湊,支援將同一個QUIC ID的請求雜湊到同一台後端伺服器上。

  • 加權最小串連數:除了根據每台後端伺服器設定的權重值來進行輪詢,同時還考慮後端伺服器的實際負載(即串連數)。當權重值相同時,當前串連數越小的後端伺服器被輪詢到的次數(機率)也越高。

健全狀態檢查

開啟或關閉健全狀態檢查。

  • TCP(預設):通過發送SYN握手報文來檢測伺服器連接埠是否存活。

    • 健康響應逾時時間:輸入接收來自健全狀態檢查的響應需要等待的時間。如果後端伺服器在指定的時間內沒有正確響應,則判定為健全狀態檢查失敗。

    • 健康間隔時間:輸入用於健全狀態檢查的時間間隔。

    • 健康閾值:健全狀態檢查連續成功多少次後,將後端伺服器的健全狀態檢查狀態由失敗判定為成功的次數。

    • 不健康閾值:健全狀態檢查連續失敗多少次後,將後端伺服器的健全狀態檢查狀態由成功判定為失敗的次數。

  • HTTP:通過發送HEAD或GET請求類比瀏覽器的訪問行為來檢查伺服器應用是否健康。

    • 網域名稱:輸入健全狀態檢查的網域名稱。

      • 使用後端伺服器內網IP(預設):使用後端伺服器的內網IP地址作為健全狀態檢查的網域名稱。

      • 指定特定網域名稱:輸入一個網域名稱。

    • 路徑:輸入健全狀態檢查頁面的URL。

    • 健康狀態返回碼:可以選擇http_2xx(預設)、http_3xxhttp_4xxhttp_5xx

其他

您還可以通過Annotation配置網路型負載平衡。詳細資料請參見通過Annotation配置網路型負載平衡NLB

專用網路

叢集預設專用網路地區和VPC ID。

虛擬交換器

您可以選擇叢集預設專用網路下,已支援的可用性區域對應的虛擬交換器,還可以單擊建立虛擬交換器選擇建立。

後續操作

如果您有查看、更新、刪除Service的需求,例如需要修改Service所關聯的公網負載平衡,可通過如下操作實現。

控制台操作指導

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

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

  3. 服務頁面,單擊目標服務操作列的更新刪除,對Service進行查看、更新、刪除操作。

kubectl操作指導

更新Service

  • 方式1:執行以下命令,更新Service。

    kubectl edit service my-nginx-svc
  • 方式2:手動刪除舊的Service,修改YAML檔案後,重新建立Service。

    kubectl apply -f my-nginx-svc.yaml

查看Service

執行以下命令,查看Service。

kubectl get service my-nginx-svc

預期輸出:

NAME           TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)        AGE
my-nginx-svc   LoadBalancer   172.21.XX.XX   192.168.XX.XX     80:31599/TCP   5m

刪除Service

執行以下命令,刪除Service。

kubectl delete service my-nginx-svc