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.
Prérequis
-
Vous disposez de deux clusters ACK (nommés
member1etmember2dans cet exemple) dans le même virtual private cloud (VPC). Pour plus d'informations, consultez la rubrique Créer un cluster ACK managé.RemarqueCette 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
mesh1dans cet exemple) et configuré une politique d'injection de sidecar pour le namespacedefault. 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-masterdans cet exemple) et ajouté les deux clusters ACK (member1etmember2) 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.
-
Créez un fichier nommé
bookinfo-karmada.yamlavec le contenu suivant. -
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.yamlRemarquePar 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--kubeconfigpar le chemin correct. -
Créez un fichier nommé
propagation.yamlavec 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: - member1Le champ
.spec.placement.clusterAffinityd'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
clusterNamesetexclude. Pour plus d'informations sur le champ.spec.placement.clusterAffinity, consultez la section Propagation des ressources dans la documentation Karmada. -
Exécutez la commande suivante pour déployer la PropagationPolicy :
kubectl --kubeconfig /etc/karmada/karmada-apiserver.config apply -f propagation.yaml -
Utilisez les fichiers kubeconfig des clusters
member1etmember2pour afficher les Deployments dans chaque cluster.-
member1
kubectl --kubeconfig member1 get deploymentSortie 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 -
member2
kubectl --kubeconfig member2 get deploymentSortie 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
-
Dans le namespace
default, créez un VirtualService nommébookinfoavec 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 -
Dans le namespace
default, créez une Gateway nomméebookinfo-gatewayavec 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
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.
-
Dans votre navigateur, saisissez
http://{IP_address_of_the_serverless_ingress_gateway}/productpageet actualisez la page plusieurs fois. La page alterne entre les trois versions du servicereviews, le trafic étant réparti de manière relativement uniforme. Bien quereviews-v3se trouve dans un cluster différent de certains autres services, il fonctionne comme prévu.La page
reviews-v3affiche des étoiles rouges dans la section « Book Reviews » et indiqueReviews served by: reviews-v3-xxxen bas, ce qui permet d'identifier la version actuelle du service.La page
reviews-v2affiche des étoiles noires dans la section « Book Reviews » et indiqueReviews served by: reviews-v2-xxxen bas.La page
reviews-v1affiche uniquement le texte des avis sans notation par étoiles et indique l'instance de service, par exemplereviews-v1-586d96b89c-6v5p8, en bas.