Configurez la portée de découverte de services lorsque les poussées de configuration sont trop longues, lorsque le plan de contrôle d'Alibaba Cloud Service Mesh (ASM) est surchargé ou lorsque les configurations de ressources manquent de précision. ASM découvre et traite alors uniquement les services situés dans les namespaces spécifiés, ce qui accélère la synchronisation de la configuration.
Prérequis
Une instance ASM de version 1.10.5.32 ou ultérieure. Pour obtenir des instructions, consultez Créer une instance ASM.
kubectl configuré pour accéder au cluster Container Service for Kubernetes (ACK) sur le plan de données. Toutes les commandes de cette rubrique s'exécutent sur ce cluster.
La collecte des journaux du plan de contrôle est activée pour l'instance ASM ; l'exemple de cette rubrique l'utilise pour observer les poussées de configuration. Pour obtenir des instructions, consultez Activer la collecte des journaux du plan de contrôle et l'alerte basée sur les journaux (hérité) si l'instance ASM est antérieure à la version 1.17.2.35, ou Activer la collecte des journaux du plan de contrôle et l'alerte basée sur les journaux (nouveau) si l'instance ASM est en version 1.17.2.35 ou ultérieure.
(Facultatif) Une instance ASM de version 1.20 ou ultérieure. Cette version est requise uniquement si vous souhaitez exclure les pods portant des libellés spécifiques de la portée de découverte de services.
Fonctionnement de la portée de découverte de services
Dans cette rubrique, la configuration du proxy sidecar désigne les informations de configuration du maillage qu'un proxy sidecar reçoit du plan de contrôle.
Par défaut, un proxy sidecar sur le plan de données stocke les informations relatives à tous les services présents dans chaque namespace du cluster du plan de données. Ces informations sont conservées même si les charges de travail de ces namespaces n'ont pas l'injection de proxy sidecar activée. Le plan de contrôle ASM surveille également les services dans tous les namespaces du maillage ; ainsi, toute modification liée à un service déclenche la poussée des configurations correspondantes vers tous les proxies sidecar.
La portée de découverte de services utilise des sélecteurs de libellés basés sur les libellés des namespaces du cluster du plan de données. Ces sélecteurs garantissent que le plan de contrôle ASM découvre et traite les services applicatifs uniquement dans les namespaces spécifiés. La configuration du proxy sidecar ne conserve alors que les informations de service provenant des namespaces sélectionnés. Les modifications apportées aux services dans les namespaces non sélectionnés ne déclenchent plus de poussées de configuration vers les proxies sidecar.
Les sélecteurs de libellés de la portée de découverte de services prennent en charge les deux types de règles suivants :
Règle de correspondance exacte de libellé — Spécifiez une clé de libellé et une valeur de libellé. Un namespace correspond uniquement si son libellé correspond exactement à la clé et à la valeur spécifiées.
-
Règle de correspondance d'expression de libellé — Spécifiez une clé de libellé, un opérateur d'expression et un ensemble de valeurs de libellé pour faire correspondre les libellés de namespace sur le plan de données. Les opérateurs suivants sont disponibles :
In — Le namespace sur le plan de données doit posséder la clé de libellé spécifiée, et la valeur de la clé doit figurer dans l'ensemble de valeurs spécifié.
NotIn — Le namespace sur le plan de données doit posséder la clé de libellé spécifiée, et la valeur de la clé ne doit pas figurer dans l'ensemble de valeurs spécifié.
Exists — Le namespace sur le plan de données doit posséder la clé de libellé spécifiée. Aucune valeur de libellé n'est requise lorsque l'opérateur est Exists.
DoesNotExist — Le namespace sur le plan de données ne doit pas posséder la clé de libellé spécifiée. Aucune valeur de libellé n'est requise lorsque l'opérateur est DoesNotExist.
Configurer la portée de découverte de services
Par défaut, le plan de contrôle ASM découvre les services dans tous les namespaces du cluster du plan de données. Définissez Mesh Discovery Mode sur la découverte sélective pour limiter la découverte aux namespaces correspondant à la portée de découverte de services. Utilisez l'une des deux méthodes suivantes, mais pas les deux simultanément. Les deux méthodes définissent la même valeur pour Mesh Discovery Mode et ne diffèrent que par la manière dont vous spécifiez les namespaces à découvrir.
Avant d'utiliser l'une ou l'autre méthode, ouvrez la page de configuration :
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez Service Mesh > Mesh Management.
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez Service Discovery Selectors.
Méthode 1 : Sélectionner les namespaces à découvrir
Utilisez cette méthode pour énumérer les namespaces à découvrir. Seuls les namespaces restant sélectionnés demeurent dans la portée de découverte de services ; vous devez donc mettre à jour la sélection lorsque vous ajoutez un namespace que le plan de contrôle doit découvrir.
Sur la page Service Discovery Selectors, définissez Mesh Discovery Mode sur Automatically Discover Services in the Selected Namespace of a Kubernetes Cluster on the Data Plane.
Sous l'onglet Select Namespace, sélectionnez le cluster cible.
Dans la liste des namespaces qui s'affiche, cliquez sur unselect à droite de chaque namespace que vous ne souhaitez pas voir découvert par le plan de contrôle.
En bas de la page, cliquez sur OK. Dans la boîte de dialogue Confirm, cliquez sur OK.
Méthode 2 : Utiliser un sélecteur de libellé
Utilisez cette méthode pour faire correspondre les namespaces par libellé. Tout namespace dont les libellés correspondent au sélecteur reste dans la portée de découverte de services, y compris les namespaces que vous créez ultérieurement. Avant de configurer le sélecteur, assurez-vous que chaque namespace que vous souhaitez voir découvert par le plan de contrôle porte un libellé correspondant. Les namespaces sans libellé correspondant sont exclus de la portée.
Sur la page Service Discovery Selectors, définissez Mesh Discovery Mode sur Automatically Discover Services in the Selected Namespace of a Kubernetes Cluster on the Data Plane, puis cliquez sur l'onglet Edit Label Selector.
Spécifiez la règle de libellé à laquelle les namespaces doivent correspondre. Par exemple, définissez Key sur
asm-discoveryet Operator sur Exists pour faire correspondre chaque namespace portant le libelléasm-discovery.En bas de la page, cliquez sur OK. Dans la boîte de dialogue Confirm, cliquez sur OK.
Vérifier que l'instance ASM a appliqué la configuration
Dans le volet de navigation de gauche, choisissez Instance Information > Base Information.
-
Sur la page Base Information, vérifiez le Status du maillage.
Si le Status est Running, l'instance ASM a accepté la configuration et est de nouveau prête. Ce statut confirme uniquement la disponibilité de l'instance. Pour confirmer que le plan de contrôle ne traite plus les services dans les namespaces hors de la portée, vérifiez la configuration du proxy sidecar et les journaux du plan de contrôle comme indiqué dans Exemple : Vérifier que la portée de découverte de services prend effet.
Exemple : Vérifier que la portée de découverte de services prend effet
Cet exemple compare le comportement des poussées de configuration avant et après le rétrécissement de la portée de découverte de services. Il utilise deux namespaces dans le cluster ACK sur le plan de données : ns-in-mesh, qui a l'injection automatique de proxy sidecar activée et porte le libellé asm-discovery=enabled, et ns-not-in-mesh, qui ne possède ni l'un ni l'autre. L'application exemple httpbin s'exécute dans les deux namespaces, et l'application exemple sleep est déployée dans ns-not-in-mesh pour déclencher une modification de service.
Étape 1 : Préparer les namespaces et l'application exemple
Créez les namespaces
ns-in-meshetns-not-in-meshpour le cluster ACK sur le plan de données. Pour plus d'informations, consultez Créer un namespace.Activez l'injection automatique de proxy sidecar pour le namespace
ns-in-mesh. Pour plus d'informations, consultez Activer l'injection automatique.-
Exécutez la commande suivante pour ajouter le libellé
asm-discovery=enabledau namespacens-in-meshdans le cluster ACK. Le sélecteur de libellé de l'étape 3 correspond à ce libellé.kubectl label namespace ns-in-mesh asm-discovery=enabled -
Utilisez le contenu suivant pour créer le fichier
httpbin.yaml.apiVersion: v1 kind: ServiceAccount metadata: name: httpbin --- apiVersion: v1 kind: Service metadata: name: httpbin labels: app: httpbin service: httpbin spec: ports: - name: http port: 8000 targetPort: 80 selector: app: httpbin --- apiVersion: apps/v1 kind: Deployment metadata: name: httpbin spec: replicas: 1 selector: matchLabels: app: httpbin version: v1 template: metadata: labels: app: httpbin version: v1 spec: serviceAccountName: httpbin containers: - image: docker.io/kennethreitz/httpbin imagePullPolicy: IfNotPresent name: httpbin ports: - containerPort: 80 -
Exécutez les commandes suivantes pour créer l'application exemple httpbin dans les namespaces
ns-in-meshetns-not-in-mesh.kubectl apply -f httpbin.yaml -n ns-in-mesh kubectl apply -f httpbin.yaml -n ns-not-in-mesh
Étape 2 : Vérifier le comportement de poussée avant de réduire la portée
-
Exécutez la commande suivante pour obtenir le nom du pod httpbin dans le namespace
ns-in-mesh.kubectl get pods -n ns-in-meshSortie attendue :
NAME READY STATUS RESTARTS AGE httpbin-6fcb98998c-46qhr 2/2 Running 0 22m -
Exécutez la commande suivante pour exporter la configuration du proxy sidecar. Dans la commande, remplacez
httpbin-6fcb98998c-46qhrpar le nom du pod httpbin obtenu à l'étape précédente.kubectl exec -it httpbin-6fcb98998c-46qhr -c istio-proxy -n ns-in-mesh -- curl -s localhost:15000/config_dump > config_dump.json -
Ouvrez le fichier
config_dump.jsonque vous avez exporté et recherchezhttpbin.ns-not-in-mesh.La recherche renvoie
httpbin.ns-not-in-mesh, ce qui indique que la configuration du proxy sidecar contient toujours des informations de service provenant du namespacens-not-in-mesh, bien que l'injection automatique de proxy sidecar ne soit pas activée pour ce namespace. -
Utilisez le contenu suivant pour créer le fichier
sleep.yaml.################################################################################################## # Sleep service ################################################################################################## apiVersion: v1 kind: Service metadata: name: sleep labels: app: sleep spec: ports: - port: 80 name: http selector: app: sleep --- apiVersion: apps/v1 kind: Deployment metadata: name: sleep spec: replicas: 1 selector: matchLabels: app: sleep template: metadata: labels: app: sleep spec: containers: - name: sleep image: pstauffer/curl command: ["/bin/sleep", "3650d"] imagePullPolicy: IfNotPresent --- -
Exécutez la commande suivante pour déployer l'application sleep dans le namespace
ns-not-in-meshdu cluster ACK.kubectl apply -f sleep.yaml -n ns-not-in-mesh Vérifiez les journaux du plan de contrôle. Le point d'entrée de la console dépend de la version de l'instance ASM.
Instances ASM antérieures à la version 1.17.2.35
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez Service Mesh > Mesh Management.
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez Instance Information > Base Information.
Sur la page Base Information, cliquez sur View log à côté de Control-plane log collection.
-
Dans le coin supérieur droit de la page Project, définissez la plage de temps sur 5 Minutes pour réduire la portée des journaux.
Sous l'onglet Raw Log, les journaux relatifs à la création de l'application sleep sont visibles. Cela indique que même si l'injection automatique de proxy sidecar n'est pas activée pour le namespace
ns-not-in-mesh, le déploiement d'une application dansns-not-in-meshdéclenche toujours la poussée de configurations par le plan de contrôle vers les proxies sidecar sur le plan de données.
{"content":"2024-01-04T10:27:00.056248Z\tinfo\tads\tPush debounce stable[16] 1 for config ServiceEntry/ns-not-in-mesh/sleep.ns-not-in-mesh.svc.cluster.local: 100.183738ms since last change, 100.183497ms since last push, full=true","_time_":"2024-01-04T18:27:00.056310074+08:00","_source_":"stdout","_container_name_":"discovery","__pack_meta__":"1|MTcwNDM2MjU0MjUyMjE4OTYxMA==|10|4","__topic__":"asm_istiod_discovery","__source__":"log_service","__time__":"1704364020"}
{"content":"2024-01-04T10:26:59.956023Z\tinfo\tads\tFull push, new service ns-not-in-mesh/sleep.ns-not-in-mesh.svc.cluster.local","_time_":"2024-01-04T18:26:59.956087922+08:00","_source_":"stdout","_container_name_":"discovery","__pack_meta__":"1|MTcwNDM2MjU0MjUyMjE4OTYxMA==|10|3","__topic__":"asm_istiod_discovery","__source__":"log_service","__time__":"1704364020"}
Instances ASM 1.17.2.35 et ultérieures
Connectez-vous à la console ASM. Dans le volet de navigation de gauche, choisissez Service Mesh > Mesh Management.
Sur la page Mesh Management, cliquez sur le nom de l'instance ASM. Dans le volet de navigation de gauche, choisissez Log Center.
-
Sur la page Log Center, cliquez sur l'onglet Control-Plane Logs et définissez la plage de temps sur 5 Minutes pour réduire la portée des journaux.
Sous l'onglet Raw Log, les journaux relatifs à la création de l'application sleep sont visibles. Cela indique que même si l'injection automatique de proxy sidecar n'est pas activée pour le namespace
ns-not-in-mesh, le déploiement d'une application dansns-not-in-meshdéclenche toujours la poussée de configurations par le plan de contrôle vers les proxies sidecar sur le plan de données.
{"content":"2024-01-04T10:33:21.180016Z\tinfo\tads\tPush debounce stable[28] 2 for config Address//c847e048f73054cb192835f8a60ea5219//Pod/ns-not-in-mesh/sleep-fc5cdb9c5-pkfvr and 1 more configs: 100.488198ms since last change, 121.179298ms since last push, full=true","_time_":"2024-01-04T18:33:21.180104591+08:00","_source_":"stdout","_container_name_":"discovery","__pack_meta__":"0|MTcwNDM1NjA0OTcxOTcxNzAyMw==|11|9","__topic__":"asm_istiod_discovery","__source__":"log_service","__time__":"1704364401"}
{"content":"2024-01-04T10:33:21.079470Z\tinfo\tmodel\tFull push, new service ns-not-in-mesh/sleep.ns-not-in-mesh.svc.cluster.local","_time_":"2024-01-04T18:33:21.07954976+08:00","_source_":"stdout","_container_name_":"discovery","__pack_meta__":"0|MTcwNDM1NjA0OTcxOTcxNzAyMw==|11|8","__topic__":"asm_istiod_discovery","__source__":"log_service","__time__":"1704364401"}
Étape 3 : Réduire la portée de découverte de services au namespace ns-in-mesh
Suivez la procédure décrite dans Configurer la portée de découverte de services pour ne conserver que le namespace ns-in-mesh dans la portée :
Avec la méthode 1, cliquez sur unselect à droite de chaque namespace autre que
ns-in-mesh.Avec la méthode 2, définissez Key sur
asm-discoveryet Operator sur Exists, ce qui correspond àns-in-meshgrâce au libellé ajouté à l'étape 1.
Étape 4 : Vérifier le comportement de poussée après avoir réduit la portée
-
Exécutez la commande suivante pour exporter à nouveau la configuration du proxy sidecar. Dans la commande, remplacez
httpbin-6fcb98998c-46qhrpar le nom du pod httpbin obtenu à l'étape 2.kubectl exec -it httpbin-6fcb98998c-46qhr -c istio-proxy -n ns-in-mesh -- curl -s localhost:15000/config_dump > config_dump.json -
Ouvrez le fichier
config_dump.jsonque vous avez exporté et recherchezhttpbin.ns-not-in-mesh.La recherche ne renvoie pas
httpbin.ns-not-in-mesh, ce qui indique que la configuration du proxy sidecar ne contient plus d'informations de service provenant du namespacens-not-in-mesh. -
Exécutez la commande suivante pour supprimer l'application sleep du namespace
ns-not-in-meshdans le cluster ACK.kubectl delete -f sleep.yaml -n ns-not-in-mesh -
Vérifiez à nouveau les journaux du plan de contrôle. Utilisez le chemin de navigation correspondant à votre version ASM indiqué dans Étape 2 : Vérifier le comportement de poussée avant de réduire la portée, mais définissez la plage de temps sur 15 Minutes afin que la fenêtre couvre le moment où vous avez supprimé l'application sleep.
Aucun journal relatif à la suppression de l'application sleep n'apparaît. Cela indique que les modifications dans les namespaces situés en dehors de la portée de découverte de services ne déclenchent pas la poussée de configurations par le plan de contrôle vers les proxies sidecar.