Premiers pas avec les principes et pratiques de l'architecture Istio

Site officiel : https://istio.io/v1.11/zh/docs/concepts/what-is-istio/

architecture istio

image.png

En fait, Istio est une implémentation de l'architecture Service Mesh. La communication entre les services (comme le Service A accédant ici au Service B) s'effectuera via un proxy (la valeur par défaut est Envoy).

De plus, le protocole réseau intermédiaire prend en charge HTTP/1.1, HTTP/2, gRPC ou TCP, qui peuvent être considérés comme couvrant les protocoles de communication traditionnels. Cette couche d'agents est appelée le plan de données.

Le plan de contrôle est subdivisé en Pilote, Citadelle et Galley. Leurs fonctions respectives sont les suivantes :

Pilot:为 Envoy 提供了服务发现,流量管理和智能路由(AB 测试、金丝雀发布等),以及错误处理(超时、重试、熔断)功能。

Citadel:为服务之间提供认证和证书管理,可以让服务自动升级成 TLS 协议。

Galley:Galley 是 Istio 的配置验证、提取、处理和分发组件。它负责将其余的 Istio 组件与从底层平台(例如 Kubernetes)获取用户配置的细节隔离开来。

Le plan de données communique avec le plan de contrôle. D'une part, il peut obtenir les informations requises entre les services, et d'autre part, il peut également rapporter les données métriques des appels de service.

Pourquoi utiliser Istio ?

Grâce à l'équilibrage de charge, à l'authentification interservices, à la surveillance, etc., Istio facilite la création d'un réseau dans lequel les services sont déjà déployés avec peu ou pas de modifications de leur code . Ajoutez la prise en charge d'Istio aux services en déployant un proxy side-car spécial dans tout l'environnement. Le proxy intercepte toutes les communications réseau entre les microservices, puis utilise les fonctionnalités de son plan de contrôle pour configurer et gérer Istio. Cela inclut :

  • Équilibrage de charge automatique pour le trafic HTTP, gRPC, WebSocket et TCP.
  • Contrôle précis du comportement du trafic avec des règles de routage riches, des tentatives, un basculement et une injection de fautes.
  • Couche de stratégie enfichable et API de configuration prenant en charge le contrôle d'accès, la limitation de débit et les quotas.
  • Mesure, journalisation et traçage automatisés de tout le trafic au sein du cluster, y compris les entrées et sorties vers le cluster.
  • Activez une communication interservices sécurisée dans un cluster avec une authentification forte et une authentification basée sur l'autorisation.

Istio est conçu pour être évolutif afin de répondre à différents besoins de déploiement.

Gestion du trafic

La configuration simple des règles et le routage du trafic d'Istio vous permettent de contrôler le trafic entre les services et le processus d'appel d'API. Istio simplifie la configuration des propriétés de niveau de service (telles que les disjoncteurs, les délais d'attente et les tentatives) et facilite l'exécution de tâches importantes (telles que les tests A/B, les déploiements Canary et les déploiements par étapes en fonction du pourcentage de trafic).
Avec une meilleure visibilité sur votre trafic et des fonctionnalités de récupération après panne prêtes à l'emploi, vous pouvez détecter les problèmes avant qu'ils ne surviennent, rendant les appels plus fiables et votre réseau plus robuste, quoi qu'il arrive.

État de prise en charge de la version Istio

Version Actuellement pris en charge date d'émission Arrêter la maintenance Versions Kubernetes prises en charge Non testé, versions Kubernetes éventuellement prises en charge
maître Non, développement uniquement - - - -
1.15 Oui 31 août 2022 ~ Mars 2023 (attendu) 1,22, 1,23, 1,24, 1,25 1.16, 1.17, 1.18, 1.19, 1.20, 1.21
1.14 Oui 24 mai 2022 ~ janvier 2023 (prévu) 1.21, 1.22, 1.23, 1.24 1.16, 1.17, 1.18, 1.19, 1.20
1.13 Oui 11 février 2022 ~ octobre 2022 (attendu) 1,20, 1,21, 1,22, 1,23 1.16, 1.17, 1.18, 1.19
1.12 Oui 18 novembre 2021 12 juillet 2022 1.19, 1.20, 1.21, 1.22 1.16, 1.17, 1.18
1.11 Non 12 août 2021 25 mars 2022 1.18, 1.19, 1.20, 1.21, 1.22 1.16, 1.17
1.10 Non 18 mai 2021 7 janvier 2022 1.18, 1.19, 1.20, 1.21 1.16, 1.17, 1.22
1.9 Non 9 février 2021 8 octobre 2021 1.17, 1.18, 1.19, 1.20 1.15, 1.16
1.8 Non 10 novembre 2020 12 mai 2021 1.16, 1.17, 1.18, 1.19 1.15
1.7 Non 21 août 2020 25 février 2021 1.16, 1.17, 1.18 1.15
1.6 et versions antérieures Non - - - -

1.Télécharger

curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.11.7 TARGET_ARCH=x86_64 sh -


#转到 Istio 包目录。例如,如果包是 istio-1.11.7:
cd istio-1.11.7

#将 istioctl 客户端添加到路径
export PATH=$PWD/bin:$PATH


2. Installez istio

istioctl install --set profile=demo -y

Ajoutez une étiquette à l'espace de noms pour demander à Istio d'injecter automatiquement le proxy side-car Envoy lors du déploiement de l'application :

kubectl label namespace default istio-injection=enabled

#Désinstaller istio

istioctl manifest generate --set profile=demo | kubectl delete -f -

3. Déployer l'exemple d'application

Cet exemple déploie une application qui présente diverses fonctionnalités d'Istio et se compose de quatre microservices distincts. Cette application imite une catégorie dans une librairie en ligne et affiche des informations sur un livre. La page affiche une description du livre, des détails sur le livre (ISBN, nombre de pages, etc.) et quelques commentaires sur le livre.

L'application Bookinfo est divisée en quatre microservices distincts :
productpage. Ce microservice appellera les microservices de détails et d'avis pour générer des pages.
détails. Ce microservice contient des informations sur le livre.
Ce microservice contient des critiques liées à des livres. Il appelle également le microservice de notation.
Ce microservice contient des informations de notation constituées de critiques de livres.

Il existe 3 versions du microservice d'avis :
La version v1 n'appelle pas le service d'avis.
La version v2 appellera le service de notation et utilisera 1 à 5 icônes étoiles noires pour afficher les informations de notation.
La version v3 appellera le service de notation et utilisera 1 à 5 icônes étoiles rouges pour afficher les informations de notation.
La figure ci-dessous montre l'architecture de bout en bout de cette application.
image.png

Déployez l'exemple d'application Bookinfo :

bookinfo.yaml

##################################################################################################
# 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:
      serviceAccountName: bookinfo-details
      containers:
      - name: details
        image: docker.io/istio/examples-bookinfo-details-v1:1.16.2
        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:
      serviceAccountName: bookinfo-ratings
      containers:
      - name: ratings
        image: docker.io/istio/examples-bookinfo-ratings-v1:1.16.2
        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:
      serviceAccountName: bookinfo-reviews
      containers:
      - name: reviews
        image: docker.io/istio/examples-bookinfo-reviews-v1:1.16.2
        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:
      serviceAccountName: bookinfo-reviews
      containers:
      - name: reviews
        image: docker.io/istio/examples-bookinfo-reviews-v2:1.16.2
        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:
      serviceAccountName: bookinfo-reviews
      containers:
      - name: reviews
        image: docker.io/istio/examples-bookinfo-reviews-v3:1.16.2
        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:
      serviceAccountName: bookinfo-productpage
      containers:
      - name: productpage
        image: docker.io/istio/examples-bookinfo-productpage-v1:1.16.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
        securityContext:
          runAsUser: 1000
      volumes:
      - name: tmp
        emptyDir: {
    
    }
---

Déployer bookinfo

kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

kubectl get po


#测试页面
kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"


4. Ouvrir les applications vers le monde extérieur

À ce stade, l’application BookInfo a été déployée, mais n’est pas encore accessible au monde extérieur. Pour ouvrir l'accès, vous devez créer une passerelle d'entrée Istio , qui mappe un chemin vers un itinéraire au bord du maillage.

  1. Associez l'application à la passerelle Istio :

Si le cluster s'exécute dans un environnement qui ne prend pas en charge les équilibreurs de charge externes (par exemple : minikube), l'adresse IP EXTERNE d'istio-ingressgateway sera affichée comme état. Veuillez utiliser le NodePort ou la redirection de port du service pour accéder à la passerelle.

kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

kubectl get svc -n istio-system

#服务的 NodePort
kubectl -n istio-system edit svc istio-ingressgateway

kubectl get svc -n istio-system

Assurez-vous qu'il n'y a aucun problème avec le fichier de configuration :

istioctl analyze

Déterminer l'adresse IP et le port entrants

Suivez les instructions ci-dessous : Si votre environnement ne dispose pas d'équilibreur de charge externe, sélectionnez plutôt un port de nœud.
Définir le port entrant


export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')

#ceph1主机Ip
export INGRESS_HOST=ceph1

export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

echo "$GATEWAY_URL"

echo "http://$GATEWAY_URL/productpage"

Vérifier l'accès externe

Utilisez un navigateur pour afficher la page produit de l'application Bookinfo afin de vérifier que Bookinfo a activé l'accès externe.

  1. Exécutez la commande suivante pour obtenir l'adresse d'accès externe de l'application Bookinfo.
kubectl get svc istio-ingressgateway -n istio-system


curl ceph1:31479/productpage



for i in `seq 1 100`; do curl -s -o /dev/null http://ceph1:31479/productpage; done


Copiez et collez l'adresse de sortie de la commande ci-dessus dans le navigateur et accédez-y pour confirmer si la page produit de l'application Bookinfo peut être ouverte.

5. Afficher le tableau de bord

Istio s'intègre à plusieurs applications de télémétrie. La télémétrie peut vous aider à comprendre la structure du maillage de services, à afficher la topologie du réseau et à analyser l'état du maillage.
Utilisez les instructions ci-dessous pour déployer un tableau de bord Kiali , ainsi que Prometheus , Grafana et Jaeger .

  1. Installez Kiali et d'autres plugins et attendez la fin du déploiement.
kubectl apply -f samples/addons

kubectl rollout status deployment/kiali -n istio-system


2. Modifier le NodePort d'accès externe Kiali

kubectl -n istio-system get svc

kubectl -n istio-system edit svc kiali

#type: NodePort


kubectl -n istio-system get svc |grep kiali

#访问 Kiali 仪表板  
http://ceph1:32514

Dans le menu de navigation de gauche, sélectionnez Graphique , puis dans la liste déroulante Espace de noms , sélectionnez par défaut .
Pour afficher les données de suivi, vous devez envoyer une demande au service. Le nombre de requêtes dépend du taux d'échantillonnage d'Istio. Le taux d'échantillonnage est défini lors de l'installation d'Istio et le taux d'échantillonnage par défaut est de 1 %. Vous devez envoyer au moins 100 requêtes avant que la première trace soit visible. Utilisez la commande suivante pour envoyer 100 requêtes au service productpage :

URL de test

for i in `seq 1 100`; do curl -s -o /dev/null http://ceph1:31479/productpage; done

Paramètres Kiali
image.png

6. Testez l'istio

1. Appliquer les règles cibles par défaut

Créez DestinationRule
pour chaque service . Avant d'utiliser Istio pour contrôler le routage des versions de Bookinfo, vous devez définir les versions disponibles dans la règle de destination et les nommer des sous-ensembles.

#设置
kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml

#查询
kubectl get destinationrules -o yaml

À ce stade, Istio a terminé toutes les reprises et le premier exemple de déploiement est terminé.

2. Demander le routage

Itinéraire par version

Il existe actuellement trois versions des avis. Visitez la page /productpage de l'application Bookinfo dans votre navigateur et actualisez-la plusieurs fois. Nous avons constaté que parfois les résultats des critiques de livres incluent des notes par étoiles, et parfois non. En effet, il n’existe pas de route explicite de version de service par défaut.

Ce que nous devons faire maintenant, c'est laisser istio prendre en charge le routage, comme le routage de tout le trafic vers la version v1 de chaque microservice. Istio est très simple à mettre en œuvre, il suffit d'ajouter un service virtuel (VirtualService).

3. Exemple : acheminer tout le trafic vers la version v1 de chaque microservice

#virtual-service-all-v1.yaml是官方提供的示例文件

kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

Son contenu est le suivant :

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: productpage
spec:
  hosts:
  - productpage
  http:
  - route:
    - destination:
        host: productpage
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1  #在这里指定了所有的http请求都通过v1完成,而v1在默认的规则中有定义
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: details
spec:
  hosts:
  - details
  http:
  - route:
    - destination:
        host: details
        subset: v1
---

Après des tests, il a été constaté que les avis ne changeaient plus de style.

4. Routage selon différentes identités d'utilisateurs

  接下来,您将更改路由配置,以便将来自特定用户的所有流量路由到特定服务版本。在这,来自名为 Jason 的用户的所有流量将被路由到服务 reviews:v2。
  请注意,Istio 对用户身份没有任何特殊的内置机制。事实上,productpage 服务在所有到 reviews 服务的 HTTP 请求中都增加了一个自定义的 end-user 请求头,从而达到了本例子的效果。

N'oubliez pas que les avis : v2 est la version qui inclut la fonctionnalité de notation par étoiles.

  1. Exécutez la commande suivante pour activer le routage basé sur l'utilisateur :
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml

2. Confirmez que la règle a été créée

kubectl get virtualservice reviews -o yaml

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
  ...
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1

3. Sur la page /productpage de l'application Bookinfo, connectez-vous en tant qu'utilisateur Jason.
Actualisez le navigateur. Que vois-tu? Une note par étoiles apparaît à côté de chaque avis.

4. Connectez-vous en tant qu'utilisateur différent (choisissez le nom de votre choix).
Actualisez le navigateur. Maintenant, les étoiles ont disparu. En effet, le trafic de tous les utilisateurs, à l'exception de Jason, est acheminé vers les avis : v1.

Vous avez configuré avec succès Istio pour acheminer le trafic en fonction de l'identité de l'utilisateur.

5. Version de transfert de trafic en niveaux de gris

Vous pouvez également transférer une partie du trafic des avis vers la version v3, sur la base de laquelle la publication en niveaux de gris, les tests A/B, etc. peuvent être mis en œuvre :

#将所有流量都路由到每个服务的v1版本
kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

#将reviews服务 50%的流量转移到v3
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml

Le contenu est le suivant :

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 50
    - destination:
        host: reviews
        subset: v3
      weight: 50

Actualisez la page /productpage dans le navigateur et il y a environ 50 % de chances que vous voyiez du contenu d'évaluation avec des étoiles rouges sur la page. En effet, les avis v3 accèdent au service de notation avec des notes par étoiles, mais pas la v1.

Si vous pensez que le microservice reviews:v3 est stable, vous pouvez acheminer 100 % du trafic vers reviews:v3 en appliquant cette règle de service virtuel :

#将reviews服务的全部流量都切换到v3版本

kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-v3.yaml

De cette façon, toutes les demandes sont transmises à la v3.
Si vous devez supprimer le réseau virtuel de tous les services, vous pouvez exécuter :

kubectl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml

Les informations de routage de tous les services sont configurées dans le fichier de configuration virtual-service-all-v1.yaml. Si elles sont supprimées, toutes les informations de routage seront supprimées.

6. Délai d'attente

Le délai d'expiration des requêtes http peut être spécifié à l'aide du champ timeout des règles de routage. Par défaut, les délais d'attente sont désactivés

Ici, nous allons expérimenter le délai d'expiration de la demande du service d'avis, et acheminer la demande vers la version v2 du service d'avis, qui appellera le service d'évaluation. Nous introduisons d'abord artificiellement un délai de 2 s (injection de fautes) sur le service d'évaluation, et puis configurez le délai d'expiration du service de révisions. timeout
1. Créez un fichier de configuration dans le répertoire /samples/bookinfo/networking.

#创建配置文件
cat > samples/bookinfo/networking/virtual-service-reviews-v2-timeout.yaml <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - fault:
      delay:
        percent: 100
        fixedDelay: 2s
    route:
    - destination:
        host: ratings
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v2
    #timeout: 0.5s
EOF

Injectez un délai de 2s sur le service de notation,

2. Pour appliquer la configuration de routage, exécutez-la simplement dans le répertoire courant.

kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-v2-timeout.yaml

3. Visitez le site Web. Vous pouvez constater que l'application Bookinfo fonctionne normalement (le symbole étoile de la note est affiché), mais il y aura un délai de 2 secondes à chaque actualisation de la page.

4. Rééditez le fichier, relâchez l'appel au service d'avis et ajoutez un délai d'attente de demande d'une demi-seconde (supprimez le commentaire sur le délai d'attente)

5. Réappliquez la configuration ou exécutez la commande à l'étape 2, puis vérifiez si la configuration est mise à jour via la commande suivante

kubectl get virtualservice -o yaml

6. Actualisez à nouveau la page Web.
À ce stade, vous devriez voir qu'elle reviendra dans 1 seconde au lieu des 2 secondes précédentes, mais les avis ne sont pas disponibles (la page ne contient aucune donnée d'avis).

Même si le délai d'expiration est configuré sur une demi-seconde, la réponse prend toujours 1 seconde car il y a des tentatives codées en dur dans le service productpage, il appelle donc le service d'avis pour expirer (réessayer) deux fois avant de revenir.

7. Réessayez

Décrit la stratégie de nouvelle tentative à utiliser lorsqu'une requête HTTP échoue. Par exemple, la règle suivante définit le nombre maximum de tentatives à 3 lors de l'appel du service rating : V1, chaque délai d'expiration de nouvelle tentative est de 2 secondes.

#创建配置文件
cat > samples/bookinfo/networking/ratings-route-v1-request-timeout.yaml <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
    retries:
      attempts: 3
      perTryTimeout: 2s
      retryOn: gateway-error,connect-failure,refused-stream
EOF


kubectl apply -f samples/bookinfo/networking/ratings-route-v1-request-timeout.yaml

8. Fusion

Les disjoncteurs sont un mécanisme utile fourni par Istio pour créer des applications de microservices résilientes. Dans un disjoncteur, définissez une limite pour un seul appel d'hôte dans le service, comme le nombre de connexions simultanées ou le nombre d'appels ayant échoué vers cet hôte. Une fois la limite déclenchée, le fusible « se déclenche » et cesse de se connecter à cet hôte.

Utilisez le mode disjoncteur pour échouer rapidement sans que les clients tentent de se connecter à un hôte surchargé ou défectueux.
Déployer httpbin

httpbin est un projet open source écrit en Python+Flask, qui peut être utilisé pour tester diverses requêtes et réponses HTTP. Site officiel : http://httpbin.org/

kubectl apply -f samples/httpbin/httpbin.yaml

Le contenu du fichier de configuration est :

##################################################################################################
# httpbin service
##################################################################################################
apiVersion: v1
kind: ServiceAccount
metadata:
  name: httpbin
---
apiVersion: v1
kind: Service
metadata:
  name: httpbin
  labels:
    app: 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

8.1 Configurer le disjoncteur.
Créez une règle de disjoncteur de destination (DestinationRule) et appliquez les paramètres du disjoncteur lors de l'appel du service httpbin :

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: httpbin
spec:
  host: httpbin
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 1  #最大连接数
      http:
        http1MaxPendingRequests: 1  #http请求pending状态的最大请求数
        maxRequestsPerConnection: 1  #在一定时间内限制对后端服务发起的最大请求数
    outlierDetection:  #熔断设置
      consecutiveErrors: 1  #从连接池开始拒绝连接,已经连接失败的次数,当通过HTTP访问时,返回代码是502、503或504则视为错误。
      interval: 1s  #拒绝访问扫描的时间间隔,即在interval(1s)内连续发生1个consecutiveErrors错误,则触发服务熔断,格式是1h/1m/1s/1ms,但必须大于等于1ms。即分析是否需要剔除的频率,多久分析一次,默认10秒。
      baseEjectionTime: 3m  #最短拒绝访问时长。这个时间主机将保持拒绝访问,且如果决绝访问达到一定的次数。格式:1h/1m/1s/1ms,但必须大于等于1ms。实例被剔除后,至少多久不得返回负载均衡池,默认是30秒。
      maxEjectionPercent: 100  #服务在负载均衡池中被拒绝访问(被移除)的最大百分比,负载均衡池中最多有多大比例被剔除,默认是10%。
EOF

Vérifiez que la règle cible a été créée correctement :

kubectl get destinationrule httpbin -o yaml

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: httpbin
  ...
spec:
  host: httpbin
  trafficPolicy:
    connectionPool:
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
      tcp:
        maxConnections: 1
    outlierDetection:
      baseEjectionTime: 180.000s
      consecutiveErrors: 1
      interval: 1.000s
      maxEjectionPercent: 100

client

Créez un programme client pour envoyer du trafic vers le service httpbin. Il s'agit d'un client de test de charge appelé Fortio, qui peut contrôler le nombre de connexions, le nombre de concurrence et le délai d'envoi des requêtes HTTP. Fortio peut déclencher efficacement la politique de disjoncteur définie précédemment dans DestinationRule.

kubectl apply -f samples/httpbin/sample-client/fortio-deploy.yaml

kubectl get po


Attendez un instant que le client soit déployé avec succès ! ! !

Connectez-vous au pod client et utilisez l'outil Fortio pour appeler le service httpbin. Le paramètre -curl indique l'envoi d'un appel :

$ FORTIO_POD=$(kubectl get pod | grep fortio | awk '{ print $1 }')
$ kubectl exec -it $FORTIO_POD  -c fortio -- /usr/bin/fortio load -curl  http://httpbin:8000/get
HTTP/1.1 200 OK
server: envoy
date: Tue, 16 Jan 2018 23:47:00 GMT
content-type: application/json
access-control-allow-origin: *
access-control-allow-credentials: true
content-length: 445
x-envoy-upstream-service-time: 36

{
    
    
  "args": {
    
    },
  "headers": {
    
    
    "Content-Length": "0",
    "Host": "httpbin:8000",
    "User-Agent": "istio/fortio-0.6.2",
    "X-B3-Sampled": "1",
    "X-B3-Spanid": "824fbd828d809bf4",
    "X-B3-Traceid": "824fbd828d809bf4",
    "X-Ot-Span-Context": "824fbd828d809bf4;824fbd828d809bf4;0000000000000000",
    "X-Request-Id": "1ad2de20-806e-9622-949a-bd1d9735a3f4"
  },
  "origin": "127.0.0.1",
  "url": "http://httpbin:8000/get"
}

Vous pouvez voir que la demande d’appel du service backend a réussi ! Ensuite, vous pouvez tester la fusion.

Déclenchement du disjoncteur
Dans la configuration DestinationRule, maxConnections : 1 et http1MaxPendingRequests : 1 sont définis. Ces règles signifient que s'il existe plusieurs connexions et requêtes simultanées, les requêtes ou connexions suivantes seront bloquées pendant qu'istio-proxy effectue d'autres requêtes et connexions.

发送并发数为 2 的连接(-c 2),请求 20 次(-n 20):
[root@node1 istio-1.6.5]# kubectl exec -it $FORTIO_POD  -c fortio -- /usr/bin/fortio load -c 2 -qps 0 -n 20 -loglevel Warning http://httpbin:8000/get
...
Code 200 : 14 (70.0 %)
Code 503 : 6 (30.0 %)
...

Augmentez le nombre de connexions simultanées à 3 :

[root@node1 istio-1.6.5]# kubectl exec -it $FORTIO_POD  -c fortio -- /usr/bin/fortio load -c 3 -qps 0 -n 30 -loglevel Warning http://httpbin:8000/get
...
Code 200 : 11 (36.7 %)
Code 503 : 19 (63.3 %)
...

Interrogez l'état d'istio-proxy pour en savoir plus sur le disjoncteur :

[root@ceph1 istio-1.11.7]# kubectl exec $FORTIO_POD -c istio-proxy -- pilot-agent request GET stats | grep httpbin | grep pending
cluster.outbound|8000||httpbin.default.svc.cluster.local.circuit_breakers.default.remaining_pending: 1
cluster.outbound|8000||httpbin.default.svc.cluster.local.circuit_breakers.default.rq_pending_open: 0
cluster.outbound|8000||httpbin.default.svc.cluster.local.circuit_breakers.high.rq_pending_open: 0
cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_pending_active: 0
cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_pending_failure_eject: 0
cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_pending_overflow: 89
cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_pending_total: 114

Vous pouvez voir que la valeur d'amont_rq_ending_overflow est de 89, ce qui signifie que 89 appels ont été marqués comme ayant échoué jusqu'à présent.

9. Nettoyer httpbin

#清理规则:
kubectl delete destinationrule httpbin


#下线 httpbin 服务和客户端:
kubectl delete deploy httpbin fortio-deploy
kubectl delete svc httpbin

Blog de référence
https://blog.csdn.net/bxg_kyjgs/article/details/125599452?utm_source=miniapp_weixin

Je suppose que tu aimes

Origine blog.csdn.net/qq_35583325/article/details/132564350
conseillé
Classement