全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用ASM與Karmada實現多叢集應用管理

更新時間:May 21, 2026

Service Mesh (ASM)支援與Karmada(Kubernetes Armada)配合,使您能夠在多個Kubernetes叢集中部署和運行雲原生應用程式,而無需更改應用程式。Karmada提供了為雲原生情境下的多叢集應用程式管理提供隨插即用的自動化,具有集中式多雲管理、高可用性、故障恢複和流量調度等關鍵功能。本文介紹如何使用ASM與Karmada實現多叢集應用管理。

背景資訊

Karmada使用Kubernetes原生API定義聯邦資源模板,以便輕鬆與現有Kubernetes採用的工具進行整合。同時,Karmada也提供了一個獨立的Propagation (placement) Policy API 來定義多叢集的調度要求。

  • 支援1:N的策略映射機制。您無需每次建立聯邦應用時都標明調度約束。

  • 在使用預設策略的情況下,您可以直接與Kubernetes API互動。

叢集模式

Karmada支援通過PushPull兩種模式來管理成員叢集。PushPull模式的主要區別在於部署資源清單時,訪問成員叢集的方式。

Push模式

Karmada控制平面將直接存取成員叢集的kube-apiserver,以擷取叢集狀態並部署資源清單。

Pull模式

Karmada 控制平面不會直接存取成員叢集,而是將其請求下放給名為karmada-agent的額外組件處理。

每個karmada-agent服務於一個叢集,並承擔以下職責:

  • 將叢集註冊到 Karmada 中(建立Cluster對象)

  • 維護叢集狀態並向 Karmada 報告(更新Cluster對象的狀態)

  • 監聽來自 Karmada 執行空間(命名空間,格式為karmada-es-<cluster name>)的資源清單,並將監聽到的資源部署到其所服務的叢集中。

關鍵組件

Karmada的控制麵包括以下組件:

  • Karmada API Server。

  • Karmada Controller Manager。

  • Karmada Scheduler。

ETCD儲存了Karmada API對象,API Server是所有其他組件通訊的REST端點,Karmada Controller Manager根據您通過API伺服器建立的API對象執行操作。

前提條件

  • 在同一VPC下,已建立兩個ACK叢集(本樣本為member1和member2)。具體操作,請參見建立ACK託管叢集

    說明
    • 本樣本以同一個VPC的兩個叢集作為樣本情境。如果使用不同的VPC,則需要額外配置以使跨VPC能夠在物理網路上連通。

    • 在建立叢集時,建議使用企業安全性群組。

  • 建立ASM執行個體(本樣本為mesh1),且已在default命名空間上配置Sidecar注入策略

  • 已部署一個Karmada主叢集執行個體(本樣本為karmada-master),並將上述兩個ACK叢集作為成員叢集(本樣本為member1和member2)添加到Karmada主叢集中。具體操作,請參見Karmada Installation

  • 已添加兩個叢集到ASM執行個體(mesh1),並建立Serverless入口網關。具體操作,請參見添加叢集到ASM執行個體並建立Serverless入口網關

步驟一:使用Karmada在多叢集中部署應用

使用ASM Serverless網關實現多叢集入口中相同,本文同樣使用Bookinfo樣本。不同於手動將review-3和review-1、review-2分別部署到兩個叢集中的方式,本節示範基於karmada的Propagation Policy,只需在karmada-master叢集中建立傳播策略,即可實現同樣的效果。

  1. 使用以下內容建立bookinfo-karmada.yaml。

    展開查看YAML內容

    # Details service
    apiVersion: v1
    kind: Service
    metadata:
      name: details
      labels:
        app: details
        service: details
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: details
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-details
      labels:
        account: details
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: details-v1
      labels:
        app: details
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: details
          version: v1
      template:
        metadata:
          labels:
            app: details
            version: v1
        spec:
          serviceAccountName: bookinfo-details
          containers:
          - name: details
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-details-v1:1.19.1
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
    ---
    # Ratings service
    apiVersion: v1
    kind: Service
    metadata:
      name: ratings
      labels:
        app: ratings
        service: ratings
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: ratings
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-ratings
      labels:
        account: ratings
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ratings-v1
      labels:
        app: ratings
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ratings
          version: v1
      template:
        metadata:
          labels:
            app: ratings
            version: v1
        spec:
          serviceAccountName: bookinfo-ratings
          containers:
          - name: ratings
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-ratings-v1:1.19.1
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
    ---
    # Reviews service
    apiVersion: v1
    kind: Service
    metadata:
      name: reviews
      labels:
        app: reviews
        service: reviews
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: reviews
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-reviews
      labels:
        account: reviews
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v1
      labels:
        app: reviews
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v1
      template:
        metadata:
          labels:
            app: reviews
            version: v1
        spec:
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-reviews-v1:1.19.1
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v2
      labels:
        app: reviews
        version: v2
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v2
      template:
        metadata:
          labels:
            app: reviews
            version: v2
        spec:
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-reviews-v2:1.19.1
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: reviews-v3
      labels:
        app: reviews
        version: v3
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: reviews
          version: v3
      template:
        metadata:
          labels:
            app: reviews
            version: v3
        spec:
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-reviews-v3:1.19.1
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
    ---
    # Productpage services
    apiVersion: v1
    kind: Service
    metadata:
      name: productpage
      labels:
        app: productpage
        service: productpage
    spec:
      ports:
      - port: 9080
        name: http
      selector:
        app: productpage
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: bookinfo-productpage
      labels:
        account: productpage
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: productpage-v1
      labels:
        app: productpage
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: productpage
          version: v1
      template:
        metadata:
          labels:
            app: productpage
            version: v1
        spec:
          serviceAccountName: bookinfo-productpage
          containers:
          - name: productpage
            image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/examples-bookinfo-productpage-v1:1.19.1
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            securityContext:
              runAsUser: 1000
          volumes:
          - name: tmp
            emptyDir: {}
    ---
  2. 執行以下命令,在karmada主叢集中部署bookinfo應用。

    kubectl --kubeconfig /etc/karmada/karmada-apiserver.config apply -f bookinfo-karmada.yaml
    說明

    karmada主叢集的kubeconfig檔案預設儲存位置為/etc/karmada/karmada-apiserver.config,如果您在部署主叢集時選擇了其他安裝位置,請將--kubeconfig後的路徑替換為實際的路徑。

  3. 使用以下內容建立propagation.yaml。

    apiVersion: policy.karmada.io/v1alpha1
    kind: PropagationPolicy
    metadata:
      name: service-propagation
    spec:
      resourceSelectors:
        - apiVersion: v1
          kind: Service
          name: productpage
        - apiVersion: v1
          kind: Service
          name: details
        - apiVersion: v1
          kind: Service
          name: reviews
        - apiVersion: v1
          kind: Service
          name: ratings
      placement:
        clusterAffinity:
          clusterNames:
            - member1
            - member2
    ---
    apiVersion: policy.karmada.io/v1alpha1
    kind: PropagationPolicy
    metadata:
      name: produtpage-propagation
    spec:
      resourceSelectors:
        - apiVersion: apps/v1
          kind: Deployment
          name: productpage-v1
        - apiVersion: v1
          kind: ServiceAccount
          name: bookinfo-productpage
      placement:
        clusterAffinity:
          clusterNames:
            - member1
    ---
    apiVersion: policy.karmada.io/v1alpha1
    kind: PropagationPolicy
    metadata:
      name: details-propagation
    spec:
      resourceSelectors:
        - apiVersion: apps/v1
          kind: Deployment
          name: details-v1
        - apiVersion: v1
          kind: ServiceAccount
          name: bookinfo-details
      placement:
        clusterAffinity:
          clusterNames:
            - member2
    ---
    apiVersion: policy.karmada.io/v1alpha1
    kind: PropagationPolicy
    metadata:
      name: reviews-propagation
    spec:
      resourceSelectors:
        - apiVersion: apps/v1
          kind: Deployment
          name: reviews-v1
        - apiVersion: apps/v1
          kind: Deployment
          name: reviews-v2
        - apiVersion: apps/v1
          kind: Deployment
          name: reviews-v3
        - apiVersion: v1
          kind: ServiceAccount
          name: bookinfo-reviews
      placement:
        clusterAffinity:
          clusterNames:
            - member1
            - member2
    ---
    apiVersion: policy.karmada.io/v1alpha1
    kind: PropagationPolicy
    metadata:
      name: ratings-propagation
    spec:
      resourceSelectors:
        - apiVersion: apps/v1
          kind: Deployment
          name: ratings-v1
        - apiVersion: v1
          kind: ServiceAccount
          name: bookinfo-ratings
      placement:
        clusterAffinity:
          exclude:
            - member1
    

    PropagationPolicy的.spec.placement.clusterAffinity表示對某一特定叢集的調度限制,如果沒有這個限制,任何叢集都可以作為調度候選者。

    它有四個欄位可以設定。

    配置項

    說明

    LabelSelector

    用於通過標籤選擇成員叢集的過濾器。如果它非空且不為nil,則只會選擇與此過濾器匹配的叢集。

    FieldSelector

    用於通過欄位選擇成員叢集。如果它非空且不為nil,僅匹配此篩選器的叢集將被選擇。

    ClusterNames

    您可以設定欄位以指定所選叢集的ClusterNames

    ExcludeClusters

    您可以設定欄位以排除所選叢集的ClusterNames

    本樣本只使用了ClusterNamesExcludeClusters兩個欄位,更多關於.spec.placement.clusterAffinity欄位的資訊,請參見Resource Propagating

  4. 執行以下命令,部署PropagationPolicy。

    kubectl --kubeconfig /etc/karmada/karmada-apiserver.config apply -f propagation.yaml
  5. 分別使用member1叢集和member2叢集的kubeconfig查看Deployment。

    1. member1

      kubectl --kubeconfig member1 get deployment

      預期輸出:

      NAME             READY   UP-TO-DATE   AVAILABLE   AGE
      productpage-v1   1/1     1            1           12m
      reviews-v1       1/1     1            1           12m
      reviews-v2       1/1     1            1           12m
      reviews-v3       1/1     1            1           12m
    2. member2

      kubectl --kubeconfig member2 get deployment

      預期輸出:

      NAME         READY   UP-TO-DATE   AVAILABLE   AGE
      details-v1   1/1     1            1           16m
      ratings-v1   1/1     1            1           16m
      reviews-v1   1/1     1            1           16m
      reviews-v2   1/1     1            1           16m
      reviews-v3   1/1     1            1           16m

步驟二:添加虛擬服務和網關規則

  1. 在default命名空間下,使用以下內容建立一個名為bookinfo的虛擬服務。具體操作,請參見管理虛擬服務

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: bookinfo
    spec:
      hosts:
      - "*"
      gateways:
      - bookinfo-gateway
      http:
      - match:
        - uri:
            exact: /productpage
        - uri:
            prefix: /static
        - uri:
            exact: /login
        - uri:
            exact: /logout
        - uri:
            prefix: /api/v1/products
        route:
        - destination:
            host: productpage
            port:
              number: 9080
  2. 在default命名空間下,使用以下內容建立一個名為bookinfo-gateway的網關規則。具體操作,請參見管理網關規則

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        istio: ingressgateway # use istio default controller
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"

步驟三:訪問驗證

  1. 擷取入口網關的IP地址。具體操作,請參見擷取入口網關地址

  2. 在瀏覽器地址欄,輸入http://{Serverless入口網關的IP地址}/productpage,並多次重新整理頁面。可以看到頁面出現reviews的3個版本,且比例接近1:1:1。雖然review-v3和其他服務不在同一個叢集中,也可以正常顯示。

    reviews-v3 版本的特徵為 Book Reviews 地區顯示紅色星級評等,頁面底部顯示 Reviews served by: reviews-v3-xxx 標識當前服務版本。

    其中 reviews-v2 版本頁面的評論區顯示黑色星級評等,頁面底部顯示 Reviews served by: reviews-v2-xxx

    其中 reviews-v1 版本頁面的評論區僅顯示評論文字,無任何星級評等表徵圖,頁面底部顯示服務執行個體為 reviews-v1-586d96b89c-6v5p8

相關文檔

在資訊技術和資料管理領域,聯邦應用特別適用於跨組織的合作,能夠在保護資料隱私和安全的同時,實現資訊的有效利用。更多資訊,請參見Federation in Computing