Tous les produits
Search
Centre de documentation

Alibaba Cloud Service Mesh:Gérer les applications multi-clusters avec ASM et Karmada

Dernière mise à jour :Aug 11, 2026

Service Mesh (ASM) s'intègre à Karmada (Kubernetes Armada) pour déployer et exécuter des applications cloud-native sur plusieurs clusters Kubernetes sans modifier le code de l'application. Karmada offre une automatisation plug-and-play pour la gestion des applications multi-clusters dans les environnements cloud-native, avec des fonctionnalités clés telles que la gestion centralisée du multicloud, la haute disponibilité, la reprise après incident et l'ordonnancement du trafic. Cette rubrique explique comment utiliser ASM et Karmada pour gérer des applications multi-clusters.

Informations générales

Karmada utilise les API natives de Kubernetes pour définir des modèles de ressources fédérées, ce qui facilite l'intégration avec les outils Kubernetes existants. Karmada propose également une API PropagationPolicy autonome pour définir les exigences d'ordonnancement multi-clusters.

  • Il prend en charge un mécanisme de mappage de politique 1:N, ce qui évite de spécifier des contraintes d'ordonnancement à chaque création d'une application fédérée.

  • Lorsque vous utilisez les politiques par défaut, vous pouvez interagir directement avec l'API Kubernetes.

Modes de cluster

Karmada peut gérer les clusters membres selon deux modes : push et pull. La principale différence entre les modes push et pull réside dans la manière dont les clusters membres sont accessibles lors du déploiement des manifestes.

Mode Push

Le plan de contrôle Karmada accède directement au kube-apiserver d'un cluster membre pour obtenir l'état du cluster et déployer les manifestes.

Mode Pull

Le plan de contrôle Karmada n'accède pas directement aux clusters membres. Il délègue les requêtes à un composant agent nommé karmada-agent.

Chaque karmada-agent dessert un seul cluster et assume les responsabilités suivantes :

  • Enregistre le cluster auprès de Karmada (crée un objet Cluster).

  • Maintient et signale l'état du cluster à Karmada (met à jour le statut de l'objet Cluster).

  • Surveille les manifestes depuis l'espace d'exécution Karmada (un namespace au format karmada-es-<nom du cluster>) et les applique au cluster qu'il dessert.

Composants clés

Le plan de contrôle Karmada comprend les composants suivants :

  • Karmada API Server

  • Karmada Controller Manager

  • Karmada Scheduler

etcd stocke les objets API Karmada. L'API Server fournit le point de terminaison REST pour tous les autres composants. Le Karmada Controller Manager agit sur les objets API que vous créez via le serveur d'API.

image

Prérequis

  • Vous disposez de deux clusters ACK (nommés member1 et member2 dans cet exemple) dans le même virtual private cloud (VPC). Pour plus d'informations, consultez la rubrique Créer un cluster ACK managé.

    Remarque
    • Cette rubrique utilise deux clusters dans le même VPC à titre d'exemple. Si vos clusters se trouvent dans des VPC différents, vous devez configurer la connectivité réseau entre les VPC.

    • Nous vous recommandons d'utiliser un groupe de sécurité de type entreprise lors de la création des clusters.

  • Vous avez créé une instance ASM (nommée mesh1 dans cet exemple) et configuré une politique d'injection de sidecar pour le namespace default. Pour plus d'informations, consultez les rubriques Créer une instance ASM et Configurer une politique d'injection de sidecar.

  • Vous avez déployé une instance de cluster principal Karmada (nommée karmada-master dans cet exemple) et ajouté les deux clusters ACK (member1 et member2) en tant que clusters membres. Pour plus d'informations, consultez la page Installation de Karmada.

  • Vous avez ajouté les deux clusters à l'instance ASM (mesh1) et créé une passerelle d'entrée serverless. Pour plus d'informations, consultez la rubrique Ajouter des clusters à une instance ASM et créer une passerelle d'entrée serverless.

Étape 1 : Déployer les applications avec Karmada

Cette rubrique utilise l'application exemple Bookinfo, suivant un processus similaire à celui décrit dans la rubrique Utiliser une passerelle serverless ASM pour l'entrée multi-clusters. Toutefois, au lieu de déployer manuellement différentes versions de reviews sur des clusters distincts, cette rubrique montre comment obtenir le même résultat en créant une PropagationPolicy Karmada dans le cluster karmada-master.

  1. Créez un fichier nommé bookinfo-karmada.yaml avec le contenu suivant.

    Afficher le contenu 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. Exécutez la commande suivante pour déployer l'application Bookinfo dans le cluster principal Karmada :

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

    Par défaut, le fichier kubeconfig du cluster principal Karmada est enregistré sous /etc/karmada/karmada-apiserver.config. Si vous avez choisi un autre chemin d'installation, remplacez le chemin après --kubeconfig par le chemin correct.

  3. Créez un fichier nommé propagation.yaml avec le contenu suivant.

    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
    

    Le champ .spec.placement.clusterAffinity d'une PropagationPolicy définit les contraintes d'ordonnancement pour un cluster spécifique. Sans ces contraintes, tout cluster peut être candidat à l'ordonnancement.

    Vous pouvez configurer les quatre champs suivants :

    |
    **Paramètre**
    |
    **Description**
    | | --- | --- | |
    labelSelector
    |
    Filtre permettant de sélectionner les clusters membres en fonction de leurs libellés. Si ce champ n'est pas vide, seuls les clusters correspondant au filtre sont sélectionnés.
    | |
    fieldSelector
    |
    Filtre permettant de sélectionner les clusters membres en fonction de leurs champs. Si ce champ n'est pas vide, seuls les clusters correspondant au filtre sont sélectionnés.
    | |
    clusterNames
    |
    Liste des noms de clusters à inclure explicitement dans la sélection.
    | |
    exclude
    |
    Liste des noms de clusters à exclure explicitement de la sélection.La documentation officielle mentionne le champ sous le nom `ExcludeClusters`, mais la configuration réelle utilise `exclude`.
    |

    Cet exemple utilise uniquement les champs clusterNames et exclude. Pour plus d'informations sur le champ .spec.placement.clusterAffinity, consultez la section Propagation des ressources dans la documentation Karmada.





















  4. Exécutez la commande suivante pour déployer la PropagationPolicy :

    kubectl --kubeconfig /etc/karmada/karmada-apiserver.config apply -f propagation.yaml
  5. Utilisez les fichiers kubeconfig des clusters member1 et member2 pour afficher les Deployments dans chaque cluster.

    1. member1

      kubectl --kubeconfig member1 get deployment

      Sortie attendue :

      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

      Sortie attendue :

      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

Étape 2 : Ajouter un VirtualService et une Gateway

  1. Dans le namespace default, créez un VirtualService nommé bookinfo avec le contenu suivant. Pour plus d'informations, consultez la rubrique Gérer les VirtualServices.

    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. Dans le namespace default, créez une Gateway nommée bookinfo-gateway avec le contenu suivant. Pour plus d'informations, consultez la rubrique Gérer les Gateways.

    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:
        - "*"

Étape 3 : Vérifier l'accès

  1. Obtenez l'adresse IP de la passerelle d'entrée. Pour plus d'informations, consultez la rubrique Obtenir l'adresse IP d'une passerelle d'entrée.

  2. Dans votre navigateur, saisissez http://{IP_address_of_the_serverless_ingress_gateway}/productpage et actualisez la page plusieurs fois. La page alterne entre les trois versions du service reviews, le trafic étant réparti de manière relativement uniforme. Bien que reviews-v3 se trouve dans un cluster différent de certains autres services, il fonctionne comme prévu.

    La page reviews-v3 affiche des étoiles rouges dans la section « Book Reviews » et indique Reviews served by: reviews-v3-xxx en bas, ce qui permet d'identifier la version actuelle du service.

    La page reviews-v2 affiche des étoiles noires dans la section « Book Reviews » et indique Reviews served by: reviews-v2-xxx en bas.

    La page reviews-v1 affiche uniquement le texte des avis sans notation par étoiles et indique l'instance de service, par exemple reviews-v1-586d96b89c-6v5p8, en bas.