通過阿里雲負載平衡暴露的服務(Service),在叢集外可通過負載平衡網域名稱或<IP:服務連接埠>
的方式訪問服務,在叢集內可通過<服務名:服務連接埠>
的方式訪問服務。本文以Nginx應用為例,介紹如何通過使用已有負載平衡的服務來公開應用。
前提條件
已建立ACK叢集或ACK Serverless叢集。具體操作,請參見建立ACK託管叢集、建立ACK專有叢集、建立ACK Serverless叢集。
已通過負載平衡控制台建立CLB或NLB執行個體,且該執行個體與ACK叢集處於同一地區。如果尚未建立,請參見建立和管理CLB執行個體和建立和管理NLB執行個體。
使用說明
對於指定已有負載平衡,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管理的後端資源,即使這些監聽器可能之前是由您手動設定的。
注意事項
在使用已有負載平衡公開應用之前,建議您先瞭解相關注意事項。詳細資料,請參見:
步驟一:部署樣本應用
本文以Nginx無狀態應用為例,指導您如何在ACK中通過負載平衡類型的Service暴露應用。
控制台操作指導
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在無狀態頁面,單擊使用鏡像建立,配置應用的基本資料、容器配置、進階配置等。
在應用基本資料頁簽中,配置應用程式名稱,本樣本為my-nginx,其他參數保持預設值,然後單擊下一步。
在容器配置頁簽中,設定容器鏡像名稱、連接埠,其他參數保持預設值,然後單擊下一步。
配置項
取值
鏡像名稱
單擊選擇鏡像,在選擇鏡像及版本對話方塊單擊製品中心頁簽,然後搜尋
nginx
,選擇名稱為openanolis/nginx的鏡像倉庫,單擊選擇鏡像版本,設定鏡像的版本,完成後單擊確定。連接埠
名稱:nginx。
容器連接埠:80。
在進階配置頁簽中,保持預設,單擊建立,完成Nginx應用的建立。
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: 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 # 需要在服務中暴露該連接埠。
執行以下命令,部署樣本應用my-nginx。
kubectl apply -f my-nginx.yaml
執行以下命令,確認樣本應用狀態正常。
kubectl get deployment my-nginx
預期輸出:
NAME READY UP-TO-DATE AVAILABLE AGE my-nginx 2/2 2 2 50s
步驟二:通過使用已有負載平衡的服務公開應用
您可以通過控制台和kubectl兩種方式來建立LoadBalancer類型的服務,並通過其公開應用。
控制台操作指導
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇
。在服務頁面,單擊建立,在建立服務對話方塊中設定服務相關的參數。
配置項
描述
樣本
服務名稱
輸入Service(服務)的名稱。
my-nginx-svc
服務類型
選擇Service類型,Service網路支援以下模式,分別對接不同來源和類型的用戶端的訪問,包括:
選擇負載平衡的服務類型。
單擊使用已有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-controller和gatekeeper組件,您可以單擊立即安裝完成組件的部署。
關閉
單擊確定。
在服務頁面,單擊目標服務名稱,進入服務詳情頁面,在基本資料地區,單擊該服務的外部端點,例如39.106.XX.XX:80,訪問樣本應用。
Kubectl操作指導
建立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。
執行以下命令,建立名為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:30471/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>
傳統型負載平衡CLB
建立CLB資源
建立CLB(Classic Load Balancer)時,您可以根據建立CLB資源描述進行建立。更多資訊,請參見建立和管理CLB執行個體。
名稱 | 描述 |
名稱 | 自訂CLB的名稱。 |
訪問方式 | 根據需要可選擇公網訪問和私網訪問。 |
計費方式 | 根據需要可選按規格計費(PayBySoec)和隨用隨付(PayByCLCU)更多資訊,請參見CLB計費概述。 |
IP版本 | 根據需要可選擇IPv4和IPv6。 |
調度演算法 | 支援輪詢(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和雙棧。 |
調度演算法 | 選擇一種調度演算法。
|
健全狀態檢查 | 開啟或關閉健全狀態檢查。
|
其他 | 您還可以通過Annotation配置網路型負載平衡。詳細資料請參見通過Annotation配置網路型負載平衡NLB。 |
專用網路 | 叢集預設專用網路地區和VPC ID。 |
虛擬交換器 | 您可以選擇叢集預設專用網路下,已支援的可用性區域對應的虛擬交換器,還可以單擊建立虛擬交換器選擇建立。 |
使用已有資源
您可以從下拉式功能表中選擇已有的NLB(Network Load Balancer)執行個體進行複用。還可以根據需要是否勾選強制覆蓋已有監聽,詳細資料請參見使用已有的負載平衡。
複用NLB執行個體存在一些限制,以及相關的注意事項,詳細資料請參見哪些負載平衡可以被複用?
配置相關資源
名稱 | 描述 |
調度演算法 | 選擇一種調度演算法。
|
健全狀態檢查 | 開啟或關閉健全狀態檢查。
|
其他 | 您還可以通過Annotation配置網路型負載平衡。詳細資料請參見通過Annotation配置網路型負載平衡NLB。 |
專用網路 | 叢集預設專用網路地區和VPC ID。 |
虛擬交換器 | 您可以選擇叢集預設專用網路下,已支援的可用性區域對應的虛擬交換器,還可以單擊建立虛擬交換器選擇建立。 |
後續操作
如果您有查看、更新、刪除Service的需求,例如需要修改Service所關聯的公網負載平衡,可通過如下操作實現。
控制台操作指導
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在服務頁面,單擊目標服務操作列的更新或刪除,對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