在Kubernetes中,Pod會快速地被建立和刪除,這導致Pod的IP地址不固定,因此無法直接對外提供服務。Service提供了一個固定的IP地址,外部服務(前端)可以通過這個固定的IP地址訪問到後端Pod,而無需關心後端具體是哪些Pod以及它們的IP地址。Service的這種機制實現了前後端的解耦,從而對外提供穩定的服務。本文介紹如何通過ACS控制台和kubectl命令來建立和暴露服務。
方式一:通過控制台建立服務
登入容器計算服務控制台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇網路 > 服務。
在服務頁面,單擊建立,在建立服務對話方塊中設定服務相關的參數。
配置項
說明
樣本
服務名稱
設定服務的名稱。
my-nginx-svc
服務類型
選擇服務類型,即服務訪問的方式。包括:
虛擬叢集IP:即ClusterIP,通過叢集的內部IP暴露服務。選擇該值後,服務只能在叢集內部訪問。
說明選擇虛擬叢集IP時,支援配置執行個體間服務發現(Headless Service)。可使用Headless Service與其他服務發現機制進行通訊,無需與Kubernetes的實現捆綁。
負載平衡:即LoadBalancer,阿里雲提供的負載平衡服務(SLB),支援選擇公網訪問或私網訪問,可以路由到ClusterIP服務。
建立slb:當選擇按規格計費時,可以通過單擊修改規格,修改SLB規格。
使用已有負載平衡: 可在已有的列表中選擇SLB規格。
說明使用已有的Server Load Balancer執行個體會強制覆蓋已有監聽。
通過Service建立的SLB無法複用,可能導致SLB被意外刪除。僅支援複用在控制台或調用OpenAPI手動建立的SLB。
複用同一個SLB的多個Service,避免前端監聽連接埠一致,否則會造成連接埠衝突。
複用SLB時,Kubernetes將使用監聽的名字以及虛擬伺服器組的名字作為唯一識別碼。請勿修改監聽和虛擬伺服器組的名字。
不支援跨叢集複用SLB。
建立服務:
服務類型:負載平衡 (LoadBalancer)
負載平衡類型:傳統型負載平衡 CLB
選擇資源:建立資源
建立CLB資源:
訪問方式:私網訪問
其他配置使用預設值
服務關聯
選擇服務要綁定的後端應用。若不進行關聯,則不會建立相關的Endpoints對象。關於服務關聯的詳細介紹,請參見Services without selectors。
名稱:app
值:nginx
連接埠映射
添加服務連接埠(對應Service YAML檔案中的
port)和容器連接埠(對應Service YAML檔案中的targetPort),容器連接埠需要與後端Pod中暴露的容器連接埠一致。服務連接埠:80
容器連接埠:80
協議:TCP
註解
為該服務添加一個註解(Annotation),配置虛擬叢集IP類或負載平衡類服務資源的註解。
說明當服務類型為負載平衡時,阿里雲相關註解才會生效。例如,設定
service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:2,表示將該服務的頻寬峰值設定為2 Mbit/s,從而控制服務的流量。更多參數,請參見通過Annotation配置傳統型負載平衡CLB。無
標籤
為該服務添加一個標籤,標識該服務。
無
配置參數完成後,單擊確定。
建立完成後,在當前服務頁面中,可以找到新建立的服務
my-nginx-svc。
方式二:通過kubectl建立服務
參考以下內容,建立my-nginx-svc.yaml檔案。
欄位
說明
kind定義資來源物件為Service。
metadata定義Service的名稱、Label和命名空間等基本資料。
metadata.annotations容器計算服務ACS支援豐富的負載平衡相關的註解(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:使用阿里雲Server Load Balancer公開服務。當Service沒有指定已有SLB時,預設建立的SLB執行個體類型為公網。可通過設定註解service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type為intranet,來建立私網訪問的Service以及相應的私網SLB。ClusterIP:在叢集內部公開服務,可用於叢集內部訪問。
重要阿里雲容器計算服務ACS當前並不提供NodePort類型Service的使用,建立該類型的service會失敗或無法生效。
建立Service。
kubectl apply -f my-nginx-svc.yaml驗證服務是否建立成功。
kubectl get svc my-nginx-svc預期輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-nginx-svc LoadBalancer 172.16.XX.XX 192.168.XX.XX 80/TCP 13s
其他相關操作
更新Service
方式一:更新Service。
kubectl edit service my-nginx-svc方式二:手動刪除舊的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.16.XX.XX 192.168.XX.XX 80/TCP 13s刪除Service
刪除Service。
kubectl delete service my-nginx-svc