通過阿里云負載均衡暴露的服務(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以下版本:在指定已有負載均衡實例時,cloud-controller-manager會自動生成并管理該實例的后端服務器組,并確保監聽器指向這些由K8s管理的后端資源,即使這些監聽器可能之前是由您手動配置的。
使用控制臺
在集群的組件管理頁面查看cloud-controller-manager組件版本。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在組件管理頁面的核心組件頁簽下,查看Cloud Controller Manager組件的版本信息。
使用kubectl命令行(僅適用于ACK專有版集群)
kubectl get pod -n kube-system -o yaml|grep image:|grep cloud-con|uniq
注意事項
在使用已有負載均衡公開應用之前,建議您先了解相關注意事項。詳細信息,請參見:
步驟一:部署示例應用
本文以Nginx無狀態應用為例,指導您如何在ACK中通過負載均衡類型的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類型的服務,并通過其公開應用。
控制臺操作指導
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇
。在服務頁面,單擊創建,在創建服務對話框中設置服務相關的參數。
配置項
描述
示例
服務名稱
輸入Service(服務)的名稱。
my-nginx-svc
服務類型
選擇Service類型,Service網絡支持以下模式,分別對接不同來源和類型的客戶端的訪問,包括:
虛擬集群IP(ClusterIP)主要服務于集群內部通信,僅當服務類型設置為虛擬的ClusterIP時,才支持服務實例之間的發現。通過使用無頭服務Headless Service,您可以與其他服務發現機制互動,而不必依賴Kubernetes默認提供的基于ClusterIP的服務發現和負載均衡。
負載均衡提供了一種方法,通過集成阿里云負載均衡器CLB(Classic Load Balancer)及網絡型負載均衡NLB(Network Load Balancer),可以將集群內部應用對外暴露。相比于NodePort方式,能夠顯著提升應用的可用性和性能。支持配置如下類型:
CLB:配置請參見傳統型負載均衡CLB。
NLB:配置請參見網絡型負載均衡NLB。
節點端口(NodePort)提供了一種便捷的方式,使得外部用戶可以通過節點的IP地址和指定的端口來訪問集群中的服務。通過訪問
<NodeIP>:<NodePort>
,用戶能夠連接到NodePort服務,但是實現負載均衡的配置則需要您自己手動完成。選擇負載均衡的服務類型。
單擊使用已有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的負載均衡實例,否則將導致集群訪問異常
本示例中,將該服務的收費方式設置為按帶寬收費,帶寬峰值設置為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}替換為您通過負載均衡管理控制臺創建的負載均衡實例ID。在使用已有的負載均衡實例時,默認情況下不會為該負載均衡創建監聽或覆蓋已有監聽。如有需要覆蓋監聽,可以設置
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners
為"true"
。本示例中,負載均衡實例為新創建,需要為其創建監聽,因此設為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沒有指定已有負載均衡時,默認創建的負載均衡實例類型為公網。您可以通過設置注解為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 >nginx.org</a>.<br/> Commercial support is available at <a >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所關聯的公網負載均衡,可通過如下操作實現。
控制臺操作指導
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在服務頁面,單擊目標服務操作列的更新或刪除,對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