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 :

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
Installez Istio. Pour plus d'informations, consultez Getting Started.
-
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
-
Créez un fichier nommé bookinfo.yaml et copiez le modèle suivant dans le fichier :
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: {}
---
-
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
-
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>
-
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
-
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
-
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
-
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
-
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.
-
Créez un pod de test pour vérifier les microservices de Bookinfo.
-
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
-
Déployez le pod.
kubectl apply -f test-pod.yaml
-
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.