IBM Cloud Docs
Gestion et exposition des applications dans le maillage de services

Gestion et exposition des applications dans le maillage de services

Après avoir installé le module complémentaire Istio dans votre cluster, vous pouvez déployer vos applications dans le maillage de services Istio en configurant l'injection de proxy sidecar Envoy et en exposant vos applications avec un sous-domaine.

Description du modèle d'application BookInfo

L'exemple d'application d' BookInfo s pour Istio inclut la configuration de démonstration de base et les règles de destination par défaut afin que vous puissiez essayer immédiatement les capacités d'Istio.

Dans Istio version 1.4 et versions ultérieures, BookInfo n'est pas offert en tant que module complémentaire géré et doit être installé séparément. Pour installer BookInfo, voir Configuration du modèle d'application BookInfo.

Les quatre microservices de l'application BookInfo comprennent :

  • productpage appelle les microservices details et reviews pour alimenter la page.
  • details contient les informations sur l'ouvrage.
  • ratings contient les informations de classement du livre qui accompagnent une critique de livre.
  • reviews contient les critiques du livre et appelle le microservice ratings. Le microservice reviews comporte plusieurs versions :
    • v1 n'appelle pas le microservice ratings.
    • v2 appelle le microservice ratings et affiche le classement sous forme d'étoiles noires de 1 à 5.
    • v3 appelle le microservice ratings et affiche le classement sous forme d'étoiles rouges de 1 à 5.

Les fichiers YAML de déploiement de chacun de ces microservices sont modifiés pour les proxys sidecar Envoy soient pré-injectés sous forme de conteneurs dans les pods des microservices avant d'être déployés. Pour plus d'informations sur l'injection manuelle en sidecar, consultez la documentation Istio. L'application BookInfo est déjà exposée sur une adresse IP publique par une passerelle Istio. Bien que l'application BookInfo puisse vous aider à démarrer, cette application n'est pas conçue pour être utilisée en production.

Configuration du modèle d'application BookInfo

  1. Installez BookInfo dans votre cluster. Téléchargez le dernier package Istio pour votre système d'exploitation, qui inclut les fichiers de configuration pour l'application BookInfo.
    curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.23.5 sh -
    
  2. Accédez au répertoire du package Istio.
    cd istio-1.23.5
    
  3. Etiquetez l'espace de noms default pour l'injection automatique de composant sidecar.
    kubectl label namespace default istio-injection=enabled
    
  4. Déployez l'application, la passerelle et les règles de destination BookInfo.
    kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
    
  5. Assurez-vous que les microservices BookInfo et leurs pods correspondants sont déployés.
    kubectl get svc
    kubectl get pods
    
    NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)          AGE
    details                   ClusterIP      172.21.19.104    <none>         9080/TCP         2m
    kubernetes                ClusterIP      172.21.0.1       <none>         443/TCP          1d
    productpage               ClusterIP      172.21.168.196   <none>         9080/TCP         2m
    ratings                   ClusterIP      172.21.11.131    <none>         9080/TCP         2m
    reviews                   ClusterIP      172.21.117.164   <none>         9080/TCP         2m
    NAME                                     READY     STATUS      RESTARTS   AGE
    details-v1-6865b9b99d-7v9h8              2/2       Running     0          2m
    productpage-v1-f8c8fb8-tbsz9             2/2       Running     0          2m
    ratings-v1-77f657f55d-png6j              2/2       Running     0          2m
    reviews-v1-6b7f6db5c5-fdmbq              2/2       Running     0          2m
    reviews-v2-7ff5966b99-zflkv              2/2       Running     0          2m
    reviews-v3-5df889bcff-nlmjp              2/2       Running     0          2m
    

Accès public à BookInfo

Procurez-vous l'adresse publique de l'équilibreur de charge istio-ingressgateway qui expose l'application BookInfo.

Création d'une URL de passerelle dans des clusters classiques

  1. Définissez l'hôte Ingress Istio.
    export INGRESS_IP=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    
  2. Définissez le port Ingress Istio.
    export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
    
  3. Créez une variable d'environnement GATEWAY_URL qui utilise l'hôte et le port Ingress Istio.
    export GATEWAY_URL=$INGRESS_IP:$INGRESS_PORT
    
  4. Exécutez la commande curl sur la variable GATEWAY_URL pour vérifier que l'application BookInfo est en cours d'exécution. Une réponse 200 indique que l'application BookInfo s'exécute correctement avec Istio.
    curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
    
  5. Essayez d'actualiser la page plusieurs fois. Différentes versions de la section reviews affichent de façon circulaire des étoiles rouges, des étoiles noires, ou pas d'étoiles.

Création d'une URL de passerelle dans des clusters VPC

  1. Créez une variable d'environnement GATEWAY_URL qui utilise le nom d'hôte Ingress Istio.
    export GATEWAY_URL=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
    
  2. Exécutez la commande curl sur la variable GATEWAY_URL pour vérifier que l'application BookInfo est en cours d'exécution. Une réponse 200 indique que l'application BookInfo s'exécute correctement avec Istio.
    curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
    

Affichage de la page Web BookInfo dans un navigateur

Exécutez la commande suivante en fonction de votre système d'exploitation pour afficher l'application BookInfo dans votre navigateur.

Mac OS ou Linux

open http://$GATEWAY_URL/productpage

Windows

start http://$GATEWAY_URL/productpage

Essayez d'actualiser la page plusieurs fois. Différentes versions de la section reviews affichent de façon circulaire des étoiles rouges, des étoiles noires, ou pas d'étoiles.

Exposition de l'application BookInfo à l'aide d'un sous-domaine fourni par IBM sans TLS

Lorsque vous activez le module complémentaire BookInfo dans votre cluster, la passerelle Istio bookinfo-gateway est créée pour vous. Cette passerelle utilise le service virtuel et les règles de destination Istio pour configurer un équilibreur de charge, istio-ingressgateway, qui expose l'application BookInfo au public. Dans les étapes suivantes, vous allez créer un sous-domaine pour l'adresse IP d'équilibreur de charge istio-ingressgateway dans les clusters classiques ou le nom d'hôte dans les clusters VPC, par l'intermédiaire de laquelle vous pouvez accéder publiquement à l'application BookInfo.

  1. Enregistrez l'adresse IP dans les clusters classiques ou le nom d'hôte dans les clusters VPC pour l'équilibreur de charge istio-ingressgateway en créant un sous-domaine DNS.
    • Classique :
      ibmcloud ks nlb-dns create classic --ip $INGRESS_IP --cluster <cluster_name_or_id>
      
    • Cloud privé virtuel:
      ibmcloud ks nlb-dns create vpc-gen2 --lb-host $GATEWAY_URL --cluster <cluster_name_or_id>
      
  2. Vérifiez que le sous-domaine est créé et copiez-le.
    ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
    

Exemple de sortie pour les clusters classiques

Hostname                                                                                IP(s)              Health Monitor   SSL Cert Status           SSL Cert Secret Name
mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["168.1.1.1"]      None             created                   <certificate>

Exemple de sortie pour les clusters VPC

Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   <certificate>

Dans un navigateur Web, ouvrez la page de produit BookInfo. Etant donné que TLS n'est pas configuré, prenez soin d'utiliser HTTP.

http://<subdomain>/productpage

Essayez d'actualiser la page plusieurs fois. Les demandes adressées à http://<subdomain>/productpage sont reçues par l'équilibreur de charge de la passerelle Istio. Les différentes versions du microservice reviews sont toujours renvoyées de manière aléatoire car la passerelle Istio gère les règles de service virtuel et de routage de destination pour les microservices.

Exposition de l'application BookInfo à l'aide d'un sous-domaine fourni par IBM avec TLS

Lorsque vous activez le module complémentaire BookInfo dans votre cluster, la passerelle Istio bookinfo-gateway est créée pour vous. Cette passerelle utilise le service virtuel et les règles de destination Istio pour configurer un équilibreur de charge, istio-ingressgateway, qui expose l'application BookInfo au public. Dans les étapes suivantes, vous allez créer un sous-domaine pour l'adresse IP d'équilibreur de charge istio-ingressgateway dans les clusters classiques ou le nom d'hôte dans les clusters VPC, par l'intermédiaire de laquelle vous pouvez accéder publiquement à l'application BookInfo. Vous pouvez également utiliser le certificat SSL pour permettre les connexions HTTPS à l'application BookInfo.

  1. Enregistrez l'adresse IP dans les clusters classiques ou le nom d'hôte dans les clusters VPC pour l'équilibreur de charge istio-ingressgateway en créant un sous-domaine DNS.

    • Classique :
      ibmcloud ks nlb-dns create classic --ip $INGRESS_IP --secret-namespace istio-system --cluster <cluster_name_or_id>
      
    • Cloud privé virtuel:
      ibmcloud ks nlb-dns create vpc-gen2 --lb-host $GATEWAY_URL --secret-namespace istio-system --cluster <cluster_name_or_id>
      
  2. Vérifiez que le sous-domaine est créé et notez le nom de votre secret SSL figurant dans la zone SSL Cert Secret Name.

    ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
    

    Exemple de sortie pour les clusters classiques.

    Hostname                                                                                IP(s)              Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["168.1.1.1"]      None             created                   <certificate>
    

    Exemple de sortie pour les clusters VPC

    Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   <certificate>
    

Configuration de la passerelle bookinfo-gateway pour qu'elle utilise la terminaison TLS.

Procédez comme indiqué ci-après pour configurer la terminaison TLS pour la passerelle bookinfo-gateway.

  1. Supprimez la passerelle bookinfo-gateway existante, qui n'est pas configurée pour gérer les connexions TLS.
    kubectl delete gateway bookinfo-gateway
    
  2. Créez un nouveau fichier de configuration de passerelle bookinfo-gateway qui utilise la terminaison TLS. Sauvegardez le fichier YAML suivant sous bookinfo-gateway.yaml. Remplacez <secret_name> par le nom du secret SSL que vous avez précédemment trouvé.
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        istio: ingressgateway
      servers:
      - port:
          number: 443
          name: https
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: <secret_name>
        hosts:
        - "*"
    
  3. Créez la nouvelle passerelle bookinfo-gateway dans votre cluster.
    kubectl apply -f bookinfo-gateway.yaml
    
  4. Dans un navigateur Web, ouvrez la page de produit BookInfo. Prenez soin d'utiliser HTTPS pour le sous-domaine que vous avez trouvé à l'étape 2.
    https://<subdomain>/productpage
    
  5. Essayez d'actualiser la page plusieurs fois. Les demandes adressées à https://<subdomain>/productpage sont reçues par l'équilibreur de charge de la passerelle Istio. Les différentes versions du microservice reviews sont toujours renvoyées de manière aléatoire car la passerelle Istio gère les règles de service virtuel et de routage de destination pour les microservices.

Comprendre ce qu'il s'est passé

Le modèle d'application BookInfo illustre comment trois composants de gestion du trafic d'Istio s'articulent pour acheminer le trafic entrant vers l'application.

Gateway
Le bookinfo-gateway La passerelle décrit un équilibreur de charge, le istio-ingressgateway service dans le istio-system espace de noms qui agit comme point d'entrée pour le trafic HTTP / TCP entrant pour BookInfo. Istio configure l'équilibreur de charge pour qu'il soit à l'écoute des demandes entrantes vers les applications gérées par Istio sur les ports définis dans le fichier de configuration de la passerelle. Pour voir le fichier de configuration de la passerelle BookInfo, exécutez la commande suivante :
kubectl get gateway bookinfo-gateway -o yaml
VirtualService
L' bookinfo VirtualService définit les règles qui contrôlent la façon dont les requêtes sont acheminées au sein du maillage de services en définissant les microservices comme destinations. Dans le service virtuel bookinfo, l'URI /productpage d'une demande est acheminé vers l'hôte productpage sur le port 9080. Ainsi, toutes les demandes pour l'application BookInfo sont d'abord acheminées vers le microservice productpage, qui appelle ensuite les autres microservices de BookInfo. Pour voir la règle de service virtuel, exécutez la commande suivante :
kubectl get virtualservice bookinfo -o yaml
DestinationRule
Après que la passerelle a acheminé la demande conformément à la règle de service virtuel, les details, productpage, ratings et reviews DestinationRules définissent les politiques qui sont appliquées à la requête lorsqu'elle atteint un microservice. Par exemple, lorsque vous actualisez la page de produit de BookInfo, les modifications que vous voyez sont le résultat de l'appel aléatoire de différentes versions,productpage, v1 et v2 du microservice v3, par le microservice reviews. Les versions sont sélectionnées de manière aléatoire car la règle de destination reviews confère la même pondération aux sous-ensembles (subsets), ou aux versions nommées, du microservice. Ces sous-ensembles sont utilisés par les règles de service virtuel lorsque le trafic est acheminé vers des versions spécifiques du service. Pour voir les règles de destination appliquées à BookInfo, exécutez la commande suivante.
kubectl describe destinationrules

Ajout d'applications dans le maillage de services Istio en configurant une injection de composants sidecar

Prêt à gérer vos propres applications avec Istio ? Avant de déployer votre application, vous devez d'abord déterminer si vous voulez injecter des proxys sidecar Envoy sur les pods d'application.

Chaque pod d'application doit exécuter un sidecar proxy d'Envoy pour que les microservices soient dans le maillage de service. Vous pouvez vérifier si les composants sidecar sont injectés dans chaque pod d'application automatiquement ou manuellement. Pour plus d'informations sur l'injection sidecar, consultez la documentation Istio.

Activation de l'injection automatique de composants sidecar

Lorsque l'injection automatique de composants sidecar est activée, un espace de noms est à l'écoute de tout nouveau déploiement et modifie automatiquement la spécification de modèle de pod de sorte que les pods d'application oient créés avec des conteneurs de proxy sidecar Envoy. Activez l'injection automatique de composants sidecar pour un espace de noms lorsque vous envisagez de déployer plusieurs applications que vous souhaitez intégrer à Istio dans cet espace de noms. Notez que l'injection automatique de composants sidecar n'est pas activée pour les espaces de noms par défaut dans le module complémentaire géré Istio.

N'activez pas l'injection de composants sidecar pour les espaces de noms kube-system, ibm-system, ou ibm-operators.

Pour activer l'injection automatique de composants sidecar pour un espace de noms :

  1. Obtenez le nom de l'espace de noms dans lequel vous voulez déployer les applications gérées par Istio.

    kubectl get namespaces
    
  2. Etiquetez l'espace de noms istio-injection=enabled.

    kubectl label namespace <namespace> istio-injection=enabled
    
  3. Déployez les applications dans l'espace de noms labellisé ou redéployez les applications figurant déjà dans l'espace de noms.

    kubectl apply <myapp>.yaml --namespace <namespace>
    
  4. Facultatif : Pour redéployer une application dans cet espace de noms, supprimez le pod d'application de sorte qu'il soit redéployé avec le composant sidecar injecté.

    kubectl delete pod -l app=<myapp>
    
  5. Si vous n'avez pas créé de service pour exposer votre application, créez un service Kubernetes. Votre application doit être exposée par un service Kubernetes pour être incluse en tant que microservice dans le maillage de services Istio. Assurez-vous de respecter les exigences d'Istio pour les pods et les services.

  6. Définissez un service pour l'application.

    apiVersion: v1
    kind: Service
    metadata:
      name: myappservice
    spec:
      selector:
        <selector_key>: <selector_value> # Enter the label key `selector_key` and value `selector_value` pair that you want to use to target the pods where your app runs.
      ports:
      - protocol: TCP
        port: 8080 # The port that the service listens on
    
  7. Créez le service dans votre cluster. Vérifiez que le service se déploie dans le même espace de noms que l'application.

    kubectl apply -f myappservice.yaml -n <namespace>
    

Les pods d'application sont désormais intégrés dans votre maillage de services Istio car ils disposent d'un conteneur sidecar Istio qui s'exécute aux côtés de votre conteneur d'application.

Injection manuelle de composants sidecar

Si vous ne souhaitez pas activer l'injection automatique de composants sidecar pour un espace de noms, vous pouvez effectuer l'injection manuellement dans un fichier YAML de déploiement. Injectez les sidecars manuellement lorsque des applications s'exécutent dans des espaces de nom parallèlement à d'autres déploiements auxquels vous ne voulez pas en injecter automatiquement.

N'activez pas l'injection de composants sidecar pour les espaces de noms kube-system, ibm-system, ou ibm-operators.

  1. Téléchargez le client istioctl.
    curl -L https://istio.io/downloadIstio | sh -
    
  2. Accédez au répertoire du package Istio.
    cd istio-1.23.5
    

Pour injecter manuellement des composants sidecar dans un déploiement :

  1. Injectez le composant sidecar Envoy dans le fichier YAML de déploiement de votre application.

    istioctl kube-inject -f <myapp>.yaml | kubectl apply -f -
    
  2. Déployez votre application.

    kubectl apply <myapp>.yaml
    
  3. Si vous n'avez pas créé de service pour exposer votre application, créez un service Kubernetes. Votre application doit être exposée par un service Kubernetes pour être incluse en tant que microservice dans le maillage de services Istio. Assurez-vous de respecter les exigences d'Istio pour les pods et les services.

  4. Définissez un service pour l'application.

    apiVersion: v1
    kind: Service
    metadata:
      name: myappservice
    spec:
      selector:
        <selector_key>: <selector_value> # Enter the label key `selector_key` and value `selector_value` pair that you want to use to target the pods where your app runs.
      ports:
      - protocol: TCP
        port: 8080 # The port that the service listens on.
    
  5. Créez le service dans votre cluster. Vérifiez que le service se déploie dans le même espace de noms que l'application.

    kubectl apply -f myappservice.yaml -n <namespace>
    

Les pods d'application sont désormais intégrés dans votre maillage de services Istio car ils disposent d'un conteneur sidecar Istio qui s'exécute aux côtés de votre conteneur d'application.

Activation ou désactivation des équilibreurs de charge Istio publics

Par défaut, un équilibreur de charge Istio public, istio-ingressgateway, est activé dans votre cluster pour équilibrer la charge des demandes entrantes entre Internet et vos applications gérées par Istio. Vous pouvez obtenir une disponibilité plus élevée en activant un équilibreur de charge Istio dans chaque zone de votre cluster.

  1. Editez la ressource de mappe de configuration managed-istio-custom.

    kubectl edit cm managed-istio-custom -n ibm-operators
    
  2. Vérifiez que toutes les zones de cluster se trouvent dans les zones istio-ingressgateway-zone.

    Exemple pour un cluster classique multizone dans Dallas :

    istio-ingressgateway-zone-1: "dal10"
    istio-ingressgateway-zone-2: "dal12"
    istio-ingressgateway-zone-3: "dal13"
    
  3. Activez ou désactivez un équilibreur de charge Istio dans chaque zone en affectant aux zones istio-ingressgateway-public-1|2|3-enabled la valeur "true" ou "false".

    Si vous souhaitez que vos applications soient accessibles aux clients, assurez-vous qu'au moins un équilibreur de charge est activé, ou créez des équilibreurs de charge de passerelle personnalisés. Si vous désactivez tous les équilibreurs de charge dans toutes les zones, votre application n'est plus exposée et n'est plus accessible en externe.

    Exemple d'activation d'une passerelle publique dans chaque zone :

    istio-ingressgateway-public-1-enabled: "true"
    istio-ingressgateway-public-2-enabled: "true"
    istio-ingressgateway-public-3-enabled: "true"
    
  4. Sauvegardez et fermez le fichier de configuration.

  5. Vérifiez que les nouveaux services d'équilibreur de charge istio-ingressgateway sont créés.

    kubectl get svc -n istio-system
    

Pour exposer les applications gérées par Istio à l'aide des services d'équilibreur de charge istio-ingressgateway, spécifiez le sélecteur istio: ingressgateway dans votre ressource Gateway. Pour plus d'informations, voir Exposition d'applications gérées par Istio.

Exposition de la passerelle Ingress Istio à l'aide de DNS

Exposez publiquement vos applications gérées par Istio en créant une entrée DNS pour l'équilibreur de charge istio-ingressgateway et en configurant l'équilibreur de charge pour acheminer le trafic vers votre application.

Dans les étapes suivantes, vous allez configurer un sous-domaine permettant à vos utilisateurs d'accéder à votre application en créant les ressources suivantes :

  • Une passerelle appelée my-gateway. Cette passerelle agit en tant que point d'entrée public sur votre application et utilise le service d'équilibreur de charge istio-ingressgateway existant pour exposer votre application. La passerelle peut éventuellement être configurée pour la terminaison TLS.
  • Un service virtuel appelé my-virtual-service. my-gateway utilise les règles que vous définissez dans my-virtual-service pour acheminer le trafic vers votre application.
  • Un sous-domaine pour l'équilibreur de charge istio-ingressgateway. Toutes les demandes utilisateur adressées au sous-domaine sont transmises à votre application selon vos règles de routage my-virtual-service.

Exposition de la passerelle Ingress Istio à l'aide de DNS sans terminaison TLS

  1. Installez le module complémentaire géré istio dans un cluster.
  2. Installez l'interface de ligne de commande istioctl.
  3. Configurez l'injection sidecar pour vos microservices d'application, déployez les microservices d'application dans un espace de nom et créez des services Kubernetes pour les microservices d'application de sorte qu'ils se trouvent dans le maillage de service Istio.

Pour exposer des applications au public :

  1. Créez une passerelle qui utilise le service d'équilibreur de charge istio-ingressgateway public afin d'exposer le port 80 pour HTTP. Remplacez <namespace> par l'espace de nom dans lequel vos microservices gérés par Istio sont déployés. Pour plus d'informations sur les composants YAML de la passerelle, consultez la documentation de référence Istio.

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: my-gateway
    spec:
      selector:
        app: ingressgateway
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
    
  2. Appliquez la passerelle dans l'espace de noms dans lequel sont déployés vos microservices gérés par Istio.

    kubectl apply -f my-gateway.yaml -n <namespace>
    
  3. Créez un service virtuel qui utilise la passerelle my-gateway et définit des règles de routage pour vos microservices d'application. Si vos microservices sont à l'écoute sur un autre port que 80, ajoutez ce port. Pour plus d'informations sur les composants YAML du service virtuel, consultez la documentation de référence Istio.

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: my-virtual-service
      namespace: <namespace> # The namespace where your Istio-managed microservices are deployed.
    spec:
      gateways:
      - my-gateway # `my-gateway` is specified so that the gateway can apply these virtual service routing rules to the `istio-ingressgateway` load balancer.
      hosts:
      - '*'
      http:
      - match:
        - uri:
            exact: /<service_path> # Replace `service_path` with the path that your entrypoint microservice listens on. For example, in the BookInfo app, the path is defined as `/productpage`.
        route:
        - destination:
            host: <service_name> # Replace `service_name` with the name of your entrypoint microservice. For example, in the BookInfo app, `productpage` served as the entrypoint microservice that called the other app microservices.
            port:
              number: 80 # If your microservice listens on a different port, replace `80` with the port.
    
  4. Appliquez les règles de service virtuel dans l'espace de noms dans lequel est déployé votre microservice géré par Istio.

    kubectl apply -f my-virtual-service.yaml -n <namespace>
    
  5. Obtenez l'adresse EXTERNAL-IP (clusters classiques) ou le nom d'hôte (clusters VPC) pour l'équilibreur de charge public istio-ingressgateway. Si vous avez activé un équilibreur de charge Istio dans chaque zone de votre cluster, obtenez l'adresse IP ou le nom d'hôte du service d'équilibreur de charge dans chaque zone.

    kubectl get svc -n istio-system
    
    # Example output for classic clusters
    istio-ingressgateway     LoadBalancer   172.21.XXX.XXX   169.1.1.1       80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP  22m
    
    # Example output for VPC clusters:
    istio-ingressgateway     LoadBalancer   172.21.XXX.XXX   1234abcd-us-south.lb.appdomain.cloud       80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP  22m
    
  6. Enregistrez l'adresse IP ou le nom d'hôte d'équilibreur de charge en créant un sous-domaine DNS. Pour plus d'informations sur l'enregistrement de sous-domaines DNS dans IBM Cloud Kubernetes Service, voir Classique : Enregistrement d'un sous-domaine NLB ou les informations sur l'enregistrement d'un nom d'hôte d'équilibreur de charge VPC avec un sous-domaine DNS pour un VPC ALB ou VPC NLB.

    ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> [--ip <LB_zone2_IP> ...]
    

    Exemple de commande pour les clusters VPC.

    ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname>
    
  7. Vérifiez que le sous-domaine est créé. Dans la sortie, copiez le nom de votre secret SSL dans la zone SSL Cert Secret Name.

    ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
    

    Exemple de sortie pour les clusters classiques.

    Hostname                                                                                IP(s)              Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["168.1.1.1"]      None             created                   <certificate>
    

    Exemple de sortie pour les clusters VPC.

    Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   <certificate>
    
  8. Vérifiez que ce trafic est acheminé vers vos microservices gérés par Istio en entrant l'URL du microservice d'application.

    http://<host_name>/<service_path>
    

Vous avez besoin d'un contrôle plus fin sur le routage ? Pour créer des règles qui sont appliquées après que l'équilibreur de charge a acheminé le trafic vers chaque microservice, telles que des règles pour envoyer le trafic vers différentes versions d'un microservice, vous pouvez créer et appliquer DestinationRules.

Vous devez déboguer des configurations d'entrée ou de sortie ? Assurez-vous que l'option istio-global-proxy-accessLogFile dans la mappe de configuration (configmap) managed-istio-custom est définie sur "/dev/stdout". Les proxy Envoy impriment des informations d'accès dans leur sortie standard que vous pouvez afficher en exécutant les commandes kubectl logs pour les conteneurs Envoy. Si vous constatez que le pod ibm-cloud-provider-ip d'une passerelle est bloqué à l'état pending, reportez-vous à cette rubrique relative au traitement des incidents.

Exposition de la passerelle Ingress Istio à l'aide de DNS avec terminaison TLS

  1. Installez le module complémentaire géré istio dans un cluster.
  2. Installez l'interface de ligne de commande istioctl.
  3. Configurez l'injection sidecar pour vos microservices d'application, déployez les microservices d'application dans un espace de nom et créez des services Kubernetes pour les microservices d'application de sorte qu'ils se trouvent dans le maillage de service Istio.

Pour exposer des applications au public :

  1. Enregistrez l'adresse IP ou le nom d'hôte d'équilibreur de charge en créant un sous-domaine DNS. Pour plus d'informations sur l'enregistrement de sous-domaines DNS dans IBM Cloud Kubernetes Service, voir Classique : Enregistrement d'un sous-domaine NLB ou Enregistrement d'un nom d'hôte d'équilibreur de charge VPC avec un sous-domaine DNS.

    • Clusters classiques :
      ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> [--ip <LB_zone2_IP> ...]
      
    • Clusters VPC :
      ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname>
      
  2. Vérifiez que le sous-domaine est créé. Dans la sortie, copiez le nom de votre secret SSL dans la zone SSL Cert Secret Name.

    ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
    
    # Example output for classic clusters:
    Hostname                                                                                IP(s)              Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["168.1.1.1"]      None             created                   <certificate>
    
    # Example output for VPC clusters:
    Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   <certificate>
    
  3. Créez une passerelle qui utilise le service d'équilibreur de charge istio-ingressgateway public afin d'exposer le port 80 pour HTTP. Remplacez <namespace> par l'espace de nom dans lequel vos microservices gérés par Istio sont déployés. Pour plus d'informations sur les composants YAML de la passerelle, consultez la documentation de référence Istio.

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: my-gateway
      namespace: <namespace>
    spec:
      selector:
        istio: ingressgateway
      servers:
        - port:
            name: https
            protocol: HTTPS
            number: 443
        tls:
          mode: SIMPLE
          serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
          privateKey: /etc/istio/ingressgateway-certs/tls.key
        hosts:
        - "*"
    
  4. Appliquez la passerelle dans l'espace de noms dans lequel sont déployés vos microservices gérés par Istio.

    kubectl apply -f my-gateway.yaml -n <namespace>
    
  5. Créez un service virtuel qui utilise la passerelle my-gateway et définit des règles de routage pour vos microservices d'application. Pour plus d'informations sur les composants YAML du service virtuel, consultez la documentation de référence Istio.

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: my-virtual-service
      namespace: <namespace> # The namespace where your Istio-managed microservices are deployed.
    spec:
      gateways:
      - my-gateway # `my-gateway` is specified so that the gateway can apply these virtual service routing rules to the `istio-ingressgateway` load balancer.
      hosts:
      - '*'
      http:
      - match:
        - uri:
            exact: /<service_path> # Replace `service_path` with the path that your entrypoint microservice listens on. For example, in the BookInfo app, the path is defined as `/productpage`.
        route:
        - destination:
            host: <service_name> # The name of your entrypoint microservice. For example, in the BookInfo app, `productpage` served as the entrypoint microservice that called the other app microservices.
            port:
              number: 443 # If your microservice listens on a different port, replace 443 with the port.
    
  6. Appliquez les règles de service virtuel dans l'espace de noms dans lequel est déployé votre microservice géré par Istio.

    kubectl apply -f my-virtual-service.yaml -n <namespace>
    
  7. Obtenez l'adresse EXTERNAL-IP (clusters classiques) ou le nom d'hôte (clusters VPC) pour l'équilibreur de charge public istio-ingressgateway. Si vous avez activé un équilibreur de charge Istio dans chaque zone de votre cluster, obtenez l'adresse IP ou le nom d'hôte du service d'équilibreur de charge dans chaque zone.

    kubectl get svc -n istio-system
    
    # Example output for classic clusters:
    istio-ingressgateway     LoadBalancer   172.21.XXX.XXX   169.1.1.1       80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP  22m
    
    # Example output for VPC clusters:
    istio-ingressgateway     LoadBalancer   172.21.XXX.XXX   1234abcd-us-south.lb.appdomain.cloud       80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP  22m
    
  8. Vérifiez que ce trafic est acheminé vers vos microservices gérés par Istio en entrant l'URL du microservice d'application.

    https://<host_name>/<service_path>
    

Les certificats du secret d'hôte DNS NLB expirent tous les 90 jours. Le secret dans l'espace de noms par défaut est automatiquement renouvelé par IBM Cloud Kubernetes Service 37 jours avant son expiration, mais vous devez le copier manuellement dans l'espace de noms istio-system chaque fois qu'il est renouvelé. Utilisez des scripts pour automatiser ce processus.

Vous avez besoin d'un contrôle plus fin sur le routage ? Pour créer des règles qui sont appliquées après que l'équilibreur de charge a acheminé le trafic vers chaque microservice, telles que des règles pour envoyer le trafic vers différentes versions d'un microservice, vous pouvez créer et appliquer DestinationRules.

Vous devez déboguer des configurations d'entrée ou de sortie ? Assurez-vous que l'option istio-global-proxy-accessLogFile dans la mappe de configuration (configmap) managed-istio-custom est définie sur "/dev/stdout". Les proxy Envoy impriment des informations d'accès dans leur sortie standard que vous pouvez afficher en exécutant les commandes kubectl logs pour les conteneurs Envoy. Si vous constatez que le pod ibm-cloud-provider-ip d'une passerelle est bloqué à l'état pending, reportez-vous à cette rubrique relative au traitement des incidents.

Sécurisation du trafic au sein d'un cluster en activant mTLS

Activez le chiffrement pour les charges de travail d'un espace de noms afin d'obtenir l'authentification TLS mutuelle (mTLS) dans le cluster. Le trafic qui est routé par Envoy entre les pods dans le cluster est chiffré avec TLS. La gestion de certificats pour mTLS est traitée par Istio. Pour plus d'informations, consultez la documentation d'Istio mTLS.

  1. Créez un fichier de règles d'authentification nommé default.yaml. Cette règle porte sur l'espace de noms et configure toutes les charges de travail du maillage de services pour accepter uniquement les demandes chiffrées avec TLS. Notez qu'aucune spécification targets n'est incluse car la règle s'applique à tous les services du maillage dans cet espace de noms.
    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "default"
    spec:
      mtls:
        mode: STRICT
    
  2. Appliquez la règle d'authentification à un espace de noms.
    kubectl apply -f default.yaml -n <namespace>
    
  3. Créez un fichier de règles de destination nommé destination-mtls.yaml. Cette règle configure les charges de travail du maillage de services dans un espace de noms pour envoyer du trafic à l'aide de TLS. Notez que le caractère générique host: *.local applique ce fichier de destination à tous les services dans le maillage.
    apiVersion: "networking.istio.io/v1beta1"
    kind: "DestinationRule"
    metadata:
      name: "destination-mtls"
    spec:
      host: "*.local"
      trafficPolicy:
        tls:
          mode: ISTIO_MUTUAL
    
  4. Appliquez la règle de destination.
    kubectl apply -f destination-mtls.yaml -n <namespace>
    
  5. Si vous souhaitez obtenir l'authentification TLS mutuelle (mTLS) pour les charges de travail de maillage de services dans d'autres espaces de noms, répétez ces étapes pour chaque espace de noms.

Les règles de destination sont également utilisées pour des raisons autres que l'authentification, telles que le routage du trafic vers différentes versions d'un service. Toute règle de destination que vous créez pour un service doit également contenir le même bloc TLS que celui défini sur mode: ISTIO_MUTUAL. Ce bloc empêche la règle de remplacer les paramètres mTLS à l'échelle du maillage que vous avez configurés dans cette section.