全部產品
Search
文件中心

Container Compute Service:使用Service對外暴露應用

更新時間:Mar 25, 2026

在Kubernetes中,Pod會快速地被建立和刪除,這導致Pod的IP地址不固定,因此無法直接對外提供服務。Service提供了一個固定的IP地址,外部服務(前端)可以通過這個固定的IP地址訪問到後端Pod,而無需關心後端具體是哪些Pod以及它們的IP地址。Service的這種機制實現了前後端的解耦,從而對外提供穩定的服務。本文介紹如何通過ACS控制台和kubectl命令來建立和暴露服務。

方式一:通過控制台建立服務

  1. 登入容器計算服務控制台,在左側導覽列選擇叢集列表

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

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

    配置項

    說明

    樣本

    服務名稱

    設定服務的名稱。

    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

    標籤

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

    配置參數完成後,單擊確定

  4. 建立完成後,在當前服務頁面中,可以找到新建立的服務my-nginx-svc

方式二:通過kubectl建立服務

  1. 在CloudShell上通過kubectl管理Kubernetes叢集

  2. 參考以下內容,建立my-nginx-svc.yaml檔案。

    展開查看my-nginx-svc.yaml

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet"
      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

    容器計算服務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-typeintranet,來建立私網訪問的Service以及相應的私網SLB。

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

    重要

    阿里雲容器計算服務ACS當前並不提供NodePort類型Service的使用,建立該類型的service會失敗或無法生效。

  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.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