在Kubernetes中,Pod雖然擁有獨立的IP, 但Pod會被快速地建立和刪除,因此不能通過Pod直接對外提供服務。通過服務(Service)這個抽象,能夠解耦前端和後端的關聯,從而實現松耦合的微服務設計。本文介紹如何通過控制台和Kubectl方式建立、更新和刪除服務。

控制台操作指導

建立服務

  1. 單擊頁面右上方的建立
  2. 建立服務對話方塊中,設定相關參數。
    參數 描述
    名稱 設定服務的名稱。
    類型 選擇服務類型,即服務訪問的方式。包括:
    • 虛擬叢集IP:即ClusterIP,指通過叢集的內部IP暴露服務。選擇該值,服務只能夠在叢集內部可以訪問,這也是預設的Service類型。
      说明 您的服務類型為虛擬叢集IP時,才能設定執行個體間探索服務(Headless Service)。您可以使用無頭Service與其他服務發現機制進行介面,而不必與Kubernetes的實現捆綁在一起。
    • 節點連接埠:即NodePort,通過每個Node上的IP和靜態連接埠(NodePort)暴露服務。NodePort服務會路由到ClusterIP服務,這個ClusterIP服務會自動建立。通過請求<NodeIP>:<NodePort>,可以從叢集的外部存取一個NodePort服務。
    • 負載平衡:即LoadBalancer,指阿里雲提供的負載平衡服務(SLB),可選擇公網訪問或內部訪問。阿里雲負載平衡服務可以路由到NodePort服務和ClusterIP服務。
      • 建立SLB:您可以通過單擊修改,修改SLB規格。
      • 使用已有負載平衡: 您可以在已有的列表中選擇SLB規格。
      说明 負載平衡類型支援建立SLB和使用已有SLB,且多個Kubernetes Service可以複用同一個SLB,但是存在以下限制:
      • 使用已有的Server Load Balancer執行個體會強制覆蓋已有監聽。
      • Kubernetes通過Service建立的SLB不能複用(會導致SLB被意外刪除)。只能複用您手動在控制台(或調用OpenAPI)建立的SLB。
      • 複用同一個SLB的多個Service不能有相同的前端監聽連接埠,否則會造成連接埠衝突。
      • 複用SLB時,監聽的名字以及虛擬伺服器組的名字被Kubernetes作為唯一識別碼。請勿修改監聽和虛擬伺服器組的名字。
      • 不支援跨叢集複用SLB。
    關聯 選擇服務要綁定的後端應用。若不進行關聯部署,則不會建立相關的Endpoints對象,您可自己進行綁定,請參見services-without-selectors
    外部流量策略 設定外部流量策略。
    • Local:流量只發給原生Pod。
    • Cluster:流量可以轉寄到叢集中其他節點上的Pod。
    说明 您的服務類型為節點連接埠負載平衡時,才能設定外部流量策略
    連接埠映射 添加服務連接埠(對應Service YAML檔案中的port)和容器連接埠(對應Service YAML檔案中的targetPort),容器連接埠需要與後端的Pod中暴露的容器連接埠一致。
    註解 為該服務添加一個註解(Annotation),配置負載平衡的參數。您可以選擇自訂註解阿里雲註解。例如設定service.beta.kubernetes.io/alicloud-loadbalancer-bandwidth:2表示將該服務的頻寬峰值設定為2Mbit/s,從而控制服務的流量。更多參數請參見通過負載平衡(Server Load Balancer)訪問服務
    標籤 您可為該服務添加一個標籤,標識該服務。
  3. 單擊建立
    在服務列表中可以看到新建立的服務。

更新服務

  1. 在對應服務的操作列中,單擊更新
  2. 更新服務對話方塊中,設定相關參數,然後單擊確定
  3. 在服務列表中,找到所需的服務,單擊右側的詳情,查看服務變化的情況。

Kubectl操作指導

Service YAML樣本
apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet"
  labels:
    app: nignx
  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 Container ServiceACK支援豐富的負載平衡相關的註解(Annotations)。例如,在上面的YAML樣本中,service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type指定Service的訪問方式為intranet(私網訪問)。更多註解,請參見通過負載平衡(Server Load Balancer)訪問服務
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-typeintranet,來建立私網訪問的Service以及相應的私網SLB。更多資訊,請參見t1942045.html#task_1942045t2020446.html#task_1942045
  • ClusterIP:在叢集內部公開服務,可用於叢集內部訪問。
  • NodePort:使用節點的連接埠映射到後端Service,叢集外可以通過節點IP:NodePort訪問。
  • ExternalName:將服務對應到DNS。

建立Service

  1. 參考以上YAML樣本,建立Service YAML檔案。
    下文以建立名為my-nginx-svc.yaml的Service YAML檔案為例進行說明。
  2. 通過Kubectl或CloudShell方式串連叢集。詳細操作,請參見通過 kubectl 串連 Kubernetes 叢集t81209.html#task_y24_gbm_2gb
  3. 執行以下命令,建立Service。
    kubectl apply -f my-nginx-svc.yaml
  4. 執行以下命令,驗證服務是否建立成功。
    kubectl get svc my-nginx-svc
    返回結果樣本:
    NAME           TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)        AGE
    my-nginx-svc   LoadBalancer   172.21.8.22   192.168.0.60     80:31599/TCP   5m
更新Service
  • 方式1:執行以下命令,更新Service。
    kubectl edit service my-nginx-svc
  • 方式2:手動刪除舊的Service,修改YAML檔案後,重新建立Service。
    kubectl apply -f my-nginx-svc.yaml

刪除Service

執行以下命令,刪除Service。
kubectl delete service my-nginx-svc