Tous les produits
Search
Centre de documentation

Elastic Container Instance:Déployer l'application Bookinfo dans Istio

Dernière mise à jour :Aug 11, 2026

Istio est un maillage de services open source qui offre des fonctionnalités de gestion du trafic, d'observabilité, de sécurité et de politique. Lorsqu'il est intégré à Kubernetes, Istio vous aide à gérer et contrôler les applications conteneurisées tout en améliorant les performances, la sécurité et la fiabilité. Cette rubrique utilise l'exemple d'application Bookinfo pour illustrer comment utiliser Istio dans un cluster Kubernetes géré par vos soins, connecté à Elastic Container Instance via un VNode.

Informations générales

Istio est une plateforme de maillage de services open source qui gère le trafic entre les microservices et traite les communications réseau ainsi que les risques de sécurité. Intégré à Kubernetes, Istio propose une gestion du trafic standardisée et sécurisée, simplifiant ainsi le déploiement et l'exploitation (O&M).

Bookinfo simule une entrée de catalogue unique d'une librairie en ligne, affichant les descriptions des livres, des détails tels que l'ISBN et le nombre de pages, ainsi que les avis des lecteurs. Bookinfo est une application hétérogène composée de quatre microservices écrits dans différents langages, ce qui en fait un candidat idéal pour démontrer les fonctionnalités d'Istio. Voici l'architecture de bout en bout de Bookinfo :

bookinfo

  • Productpage : un microservice Python qui appelle les microservices Details et Reviews pour générer une page. Il fournit les fonctionnalités de connexion et de déconnexion.

  • Details : un microservice Ruby qui contient les informations sur les livres.

  • Reviews : un microservice Java qui contient les critiques de livres. Il existe en trois versions :

    • Version 1 : n'appelle pas le microservice Ratings.

    • Version 2 : appelle le microservice Ratings et note un livre avec une à cinq étoiles noires.

    • Version 3 : appelle le microservice Ratings et note un livre avec une à cinq étoiles rouges.

  • Ratings : un microservice Node.js qui fournit les notes basées sur les critiques de livres.

Pour plus d'informations, consultez Istio.

Prérequis

Cette rubrique s'applique aux clusters Kubernetes gérés par vos soins. Assurez-vous que votre cluster répond aux conditions suivantes :

  • Un VNode est déployé dans le cluster Kubernetes géré par vos soins.

  • Si le cluster Kubernetes géré par vos soins est déployé dans un centre de données, celui-ci doit être connecté à Alibaba Cloud.

  • Si le cluster Kubernetes géré par vos soins est déployé sur une instance Elastic Compute Service (ECS) et que le plug-in réseau est Flannel, assurez-vous que le gestionnaire de contrôle cloud Kubernetes (CCM) est déployé dans le cluster. Cela garantit l'interconnexion entre Elastic Container Instance et les pods sur les nœuds réels. Pour plus d'informations, consultez Déployer le CCM.

Préparatifs

  1. Installez Istio. Pour plus d'informations, consultez Getting Started.

  2. Créez un namespace et configurez les libellés pour ce namespace.

    kubectl create namespace istio-test
    kubectl label namespace istio-test istio-injection=enabled

Procédure

Déployer l'application Bookinfo

  1. Créez un fichier nommé bookinfo.yaml et copiez le modèle suivant dans le fichier :

    Remarque

    Dans l'exemple de code YAML ci-dessous, des nodeSelectors sont ajoutés pour planifier les pods sur des VNodes. Vous pouvez également configurer eci-profile pour planifier les pods sur des VNodes. Pour plus d'informations, consultez Planifier les pods sur un VNode et Utiliser eci-profile pour planifier les pods sur un VNode.

    Développer le fichier bookinfo.yaml

    # Copyright Istio Authors
    #
    #   Licensed under the Apache License, Version 2.0 (the "License");
    #   you may not use this file except in compliance with the License.
    #   You may obtain a copy of the License at
    #
    #       http://www.apache.org/licenses/LICENSE-2.0
    #
    #   Unless required by applicable law or agreed to in writing, software
    #   distributed under the License is distributed on an "AS IS" BASIS,
    #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    #   See the License for the specific language governing permissions and
    #   limitations under the License.
    ##################################################################################################
    # This file defines the services, service accounts, and deployments for the Bookinfo sample.
    #
    # To apply all 4 Bookinfo services, their corresponding service accounts, and deployments:
    #
    #   kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
    #
    # Alternatively, you can deploy any resource separately:
    #
    #   kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -l service=reviews # reviews Service
    #   kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -l account=reviews # reviews ServiceAccount
    #   kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -l app=reviews,version=v3 # reviews-v3 Deployment
    ##################################################################################################
    ##################################################################################################
    # 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:
          nodeSelector:     # Configure a specific nodeSelector
            k8s.aliyun.com/vnode: "true"
          tolerations:      # Configure specific tolerations
          - key: k8s.aliyun.com/vnode
            operator: "Equal"
            value: "true"
            effect: "NoSchedule"
          serviceAccountName: bookinfo-details
          containers:
          - name: details
            image: docker.io/istio/examples-bookinfo-details-v1:1.16.4
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
            securityContext:
              runAsUser: 1000
    ---
    ##################################################################################################
    # 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:
          nodeSelector:     # Configure a specific nodeSelector
            k8s.aliyun.com/vnode: "true"
          tolerations:      # Configure specific tolerations
          - key: k8s.aliyun.com/vnode
            operator: "Equal"
            value: "true"
            effect: "NoSchedule"
          serviceAccountName: bookinfo-ratings
          containers:
          - name: ratings
            image: docker.io/istio/examples-bookinfo-ratings-v1:1.16.4
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
            securityContext:
              runAsUser: 1000
    ---
    ##################################################################################################
    # 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:
          nodeSelector:     # Configure a specific nodeSelector
            k8s.aliyun.com/vnode: "true"
          tolerations:      # Configure specific tolerations
          - key: k8s.aliyun.com/vnode
            operator: "Equal"
            value: "true"
            effect: "NoSchedule"
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: docker.io/istio/examples-bookinfo-reviews-v1:1.16.4
            imagePullPolicy: IfNotPresent
            env:
            - name: LOG_DIR
              value: "/tmp/logs"
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            - name: wlp-output
              mountPath: /opt/ibm/wlp/output
            securityContext:
              runAsUser: 1000
          volumes:
          - name: wlp-output
            emptyDir: {}
          - name: tmp
            emptyDir: {}
    ---
    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:
          nodeSelector:     # Configure a specific nodeSelector
            k8s.aliyun.com/vnode: "true"
          tolerations:      # Configure specific tolerations
          - key: k8s.aliyun.com/vnode
            operator: "Equal"
            value: "true"
            effect: "NoSchedule"
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: docker.io/istio/examples-bookinfo-reviews-v2:1.16.4
            imagePullPolicy: IfNotPresent
            env:
            - name: LOG_DIR
              value: "/tmp/logs"
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            - name: wlp-output
              mountPath: /opt/ibm/wlp/output
            securityContext:
              runAsUser: 1000
          volumes:
          - name: wlp-output
            emptyDir: {}
          - name: tmp
            emptyDir: {}
    ---
    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:
          nodeSelector:     # Configure a specific nodeSelector
            k8s.aliyun.com/vnode: "true"
          tolerations:      # Configure specific tolerations
          - key: k8s.aliyun.com/vnode
            operator: "Equal"
            value: "true"
            effect: "NoSchedule"
          serviceAccountName: bookinfo-reviews
          containers:
          - name: reviews
            image: docker.io/istio/examples-bookinfo-reviews-v3:1.16.4
            imagePullPolicy: IfNotPresent
            env:
            - name: LOG_DIR
              value: "/tmp/logs"
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            - name: wlp-output
              mountPath: /opt/ibm/wlp/output
            securityContext:
              runAsUser: 1000
          volumes:
          - name: wlp-output
            emptyDir: {}
          - name: tmp
            emptyDir: {}
    ---
    ##################################################################################################
    # 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:
          nodeSelector:     # Configure a specific nodeSelector
            k8s.aliyun.com/vnode: "true"
          tolerations:      # Configure specific tolerations
          - key: k8s.aliyun.com/vnode
            operator: "Equal"
            value: "true"
            effect: "NoSchedule"
          serviceAccountName: bookinfo-productpage
          containers:
          - name: productpage
            image: docker.io/istio/examples-bookinfo-productpage-v1:1.16.4
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9080
            volumeMounts:
            - name: tmp
              mountPath: /tmp
            securityContext:
              runAsUser: 1000
          volumes:
          - name: tmp
            emptyDir: {}
    ---
  2. Déployez l'application Bookinfo.

    kubectl -n istio-test apply -f bookinfo.yaml

    Le résultat suivant s'affiche :

    xxx# kubectl -n istio-test apply -f bookinfo.yaml
    service/details created
    serviceaccount/bookinfo-details created
    deployment.apps/details-v1 created
    service/ratings created
    serviceaccount/bookinfo-ratings created
    deployment.apps/ratings-v1 created
    service/reviews created
    serviceaccount/bookinfo-reviews created
    deployment.apps/reviews-v1 created
    deployment.apps/reviews-v2 created
    deployment.apps/reviews-v3 created
    service/productpage created
    serviceaccount/bookinfo-productpage created
    deployment.apps/productpage-v1 created
  3. Consultez le statut de Bookinfo.

    kubectl -n istio-test get pods -o wide

    Le résultat suivant s'affiche :

    [xxx@xxx ~]# kubectl -n istio-test get pods -o wide
    NAME                                   READY   STATUS    RESTARTS   AGE     IP          NODE                          NOMINATED NODE   READINESS GATES
    details-v1-5f957dd5ff-kdvpc            2/2     Running   0          14m     192.168.xxx cn-qingdao.vnd-m5echu4xxx     <none>           <none>
    productpage-v1-85976f8df7-ht5dg        2/2     Running   0          72s     192.168.xxx cn-qingdao.vnd-m5echu4xxx     <none>           <none>
    ratings-v1-69fb6864cf-9l7fp            2/2     Running   0          23m     192.168.xxx cn-qingdao.vnd-m5echu4xxx     <none>           <none>
    reviews-v1-77f77b5-sssgw               2/2     Running   0          7m13s   192.168.xxx cn-qingdao.vnd-m5echu4xxx     <none>           <none>
    reviews-v2-5b9b5676c-bcjx9             2/2     Running   0          23m     192.168.xxx cn-qingdao.vnd-m5echu4xxx     <none>           <none>
    reviews-v3-6ff46dbb9c-kf2gl            2/2     Running   0          13m     192.168.xxx cn-qingdao.vnd-m5echu4xxx     <none>           <none>
  4. Vérifiez les microservices de Bookinfo.

    kubectl -n istio-test get services

    Le résultat suivant s'affiche :

    NAME          TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
    details       ClusterIP   10.96.1.xxx   <none>        9080/TCP   25m
    productpage   ClusterIP   10.96.2.xxx   <none>        9080/TCP   25m
    ratings       ClusterIP   10.96.1.xxx   <none>        9080/TCP   25m
    reviews       ClusterIP   10.96.1.xxx   <none>        9080/TCP   25m

Déployer une passerelle Istio

  1. Créez un fichier nommé bookinfo-gateway.yaml et copiez le modèle suivant dans le fichier :

    Développer le fichier bookinfo-gateway.yaml

    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:
        - "*"
    ---
    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. Déployez une passerelle Istio.

    kubectl -n istio-test apply -f bookinfo-gateway.yaml

    Résultat attendu :

    [root@xxx ~]# kubectl -n istio-test apply -f bookinfo-gateway.yaml
    gateway.networking.istio.io/bookinfo-gateway created
    virtualservice.networking.istio.io/bookinfo created
  3. Consultez la passerelle Istio.

    kubectl -n istio-test get gateway

    Le résultat suivant s'affiche :

    NAME                AGE
    bookinfo-gateway    88s

Vérifier les microservices de Bookinfo

  1. Obtenez l'adresse hôte de la passerelle Istio.

    Sélectionnez un service Ingress Istio en fonction du type de cluster. Dans cette rubrique, LoadBalancer est sélectionné comme service Ingress Istio.

    kubectl -n istio-system get service istio-ingressgateway

    Le résultat suivant s'affiche :

    [xxx@xxx ~]# kubectl -n istio-system get service istio-ingressgateway
    NAME                   TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)                                                                      AGE
    istio-ingressgateway   LoadBalancer   10.96.xxx    <pending>     15021:31682/TCP,80:32247/TCP,443:31049/TCP,31400:30519/TCP,15443:31511/TCP   43m

    Le paramètre istio-ingressgateway du message renvoyé indique l'adresse hôte (au format IP:Port) de la passerelle Ingress Istio. Dans cette rubrique, l'adresse hôte est 10.96.XX.XX:80.

  2. Créez un pod de test pour vérifier les microservices de Bookinfo.

    1. Créez un fichier nommé test-pod.yaml et copiez le modèle suivant dans le fichier :

      Développer le fichier test-pod.yaml

      apiVersion: v1
      kind: Pod
      metadata:
        name: centos
      spec:
        nodeSelector:    
          k8s.aliyun.com/vnode: "true"
        tolerations:      
        - key: k8s.aliyun.com/vnode
          operator: "Equal"
          value: "true"
          effect: "NoSchedule"
        containers:
        - name: eip
          image: registry-vpc.cn-shanghai.aliyuncs.com/eci_open/centos:7
          command:
          - bash
          - -c
          - sleep inf
    2. Déployez le pod.

      kubectl apply -f test-pod.yaml
  3. Connectez-vous au pod de test et exécutez les commandes suivantes pour vérifier les microservices de Bookinfo.

    kubectl exec -it centos -- bash
    curl -s http://10.96.XX.XX:80/productpage | grep -o "<title>.*</title>"

    Remplacez 10.96.xxx:80 par l'adresse interne de votre passerelle d'entrée. Si la commande renvoie <title>Simple BookStore App</title>, l'application Bookinfo est accessible via la passerelle d'entrée Istio.