Site officiel : https://istio.io/v1.11/zh/docs/concepts/what-is-istio/
architecture istio
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.
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.
- 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.
- 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 .
- 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
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.
- 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