Déploiement de passerelles Istio personnalisées dans une entreprise IstioOperator
Dans les versions 1.23 et antérieures du module complémentaire, créez une ressource personnalisée « IstioOperator » (IOP) qui définit vos propres passerelles d'entrée et de sortie pour le trafic des applications gérées par Istio.
Par défaut, un déploiement istio-ingressgateway est créé dans l'espace de noms istio-system de votre cluster. Ce déploiement est exposé en tant que service d'équilibreur de charge public avec une adresse IP accessible
de l'extérieur. Vous pouvez ensuite définir des ports pour vos applications gérées par Istio dans une ressource Gateway, qui configure l'équilibreur de charge istio-ingressgateway pour qu'il écoute le trafic HTTP/TCP
entrant sur ces ports. De plus, un équilibreur istio-egressgateway est créé par défaut et est exposé en tant que service d'équilibreur de charge pour gérer le trafic sortant provenant de vos applications gérées par Istio.
Cependant, vous pouvez créer des déploiements de passerelles d'entrée ou de sortie supplémentaires au-delà de ces passerelles par défaut. Par exemple, vous pouvez créer des passerelles supplémentaires à exécuter parallèlement aux passerelles par défaut ou à exécuter à la place des passerelles par défaut pour les raisons suivantes :
- Séparer les flux de trafic entre certaines charges de travail ou certains espaces de noms.
- Créer une passerelle d'entrée pour le trafic du réseau privé.
- Modifier une passerelle avec des personnalisations, telles que l'affinité des noeuds de pods de passerelle, les répliques minimales et les équilibreurs de charge spécifiques à une zone.
- Contrôler les mises à jour des versions des passerelles indépendamment des mises à jour automatiques des versions qui sont déployées pour tous les composants du module complémentaire Istio géré.
Considérations
Avant de commencer, passez en revue les considérations suivantes concernant l'utilisation de passerelles personnalisées.
- Le module complémentaire Istio géré ne gère ni ne synchronise les passerelles personnalisées que vous créez. Vous êtes responsable de la création, de la gestion et de la maintenance de ces ressources.
- Après avoir déployé votre passerelle personnalisée, vérifiez que les journaux du pod opérateur Istio ne contiennent pas d'erreurs de syntaxe en exécutant
kubectl logs -n ibm-operators -l name=addon-istio-operator. L'opérateur « Istio » valide et synchronise toutes les modifications que vous apportez aux protocoles d'IstioOperators personnalisés (IOP). - Vérifiez également que l'option
istio-global-proxy-accessLogFiledans la mappe de configuration (configmap)managed-istio-customest définie sur"/dev/stdout". Les proxy Envoy impriment des informations d'accès dans leur sortie standard que vous pouvez afficher en exécutant les commandeskubectl logspour les conteneurs Envoy.
Création d'une passerelle d'entrée personnalisée pour le trafic public
Utilisez un IstioOperator (IOP) pour créer un déploiement de passerelle d'entrée personnalisée et un service d'équilibreur de charge public dans un espace de noms custom-gateways.
-
Créez un espace de noms pour la passerelle d'entrée personnalisée.
kubectl create namespace custom-gateways -
Créez un fichier YAML nommé
custom-ingress-iop.yamlpour une ressourceIstioOperator(IOP). Pour forcer les pods de la passerelle personnalisée à exécuter une version spécifique d'Istio géré, spécifiez la version dans la zonetag. Pour plus d'informations, voir Contrôle des mises à jour et des versions de passerelle personnalisée.apiVersion: install.istio.io/v1alpha1 kind: IstioOperator metadata: namespace: ibm-operators name: custom-ingressgateway-iop spec: profile: empty hub: icr.io/ext/istio # tag: 1.29.5 components: ingressGateways: - name: custom-ingressgateway label: istio: custom-ingressgateway namespace: custom-gateways enabled: true k8s: serviceAnnotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public -
Créez la ressource (IOP)
IstioOperatordans votre cluster. L'opérateur Istio géré dans l'espace de nomsibm-operatorsutilise la ressource IOP pour déployer et exposer la passerelle d'entrée dans l'espace de nomscustom-gatewaysavec un service d'équilibreur de charge public.kubectl apply -f ./custom-ingress-iop.yaml -
Vérifiez que le déploiement et le service de la passerelle d'entrée sont créés dans l'espace de noms
custom-gateways.kubectl get deploy,svc -n custom-gatewaysExemple de sortie
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/custom-ingressgateway 1/1 1 1 4m53s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/custom-ingressgateway LoadBalancer 172.21.98.120 52.117.68.222 15020:32656/TCP,80:30576/TCP,443:32689/TCP,15029:31885/TCP,15030:30198/TCP,15031:32637/TCP,15032:30869/TCP,31400:30310/TCP,15443:31698/TCP 4m53s -
Dans la sortie pour l'équilibreur de charge
service/custom-ingressgateway, notez l'adresse IP (clusters classiques) ou le nom d'hôte (clusters VPC) dans la colonneEXTERNAL-IP.
Vous pouvez maintenant spécifier le nom de cet équilibreur de charge de passerelle d'entrée, custom-ingressgateway, dans une ressource Gateway qui définit le port de votre application gérée par Istio. Ensuite, vous
pouvez spécifier le nom de la passerelle Gateway dans une ressource VirtualService qui définit les chemins d'accès aux microservices dans votre maillage de services. Pour un exemple d'utilisation d'une passerelle
Gateway et d'un service VirtualService avec votre équilibreur de charge de passerelle personnalisée, essayez l'application exemple BookInfo.
Configurer l'exemple BookInfo
Déployez l'application d'exemple « BookInfo » pour « Istio » afin de tester l'accès à votre équilibreur de charge de passerelle d'entrée personnalisée.
- Créez un espace de noms «
bookinfo» et attribuez-lui une étiquette pour permettre l'injection automatique du sidecar.kubectl create namespace bookinfo kubectl label namespace bookinfo istio-injection=enabled - Déployez le modèle d'application BookInfo. Remplacez
<version>par la version major.minor que vos modules complèmentaires Istio gérés exécutent, que vous pouvez trouver en exécutantibmcloud ks cluster addon ls -c <cluster_name_or_ID>.kubectl apply -n bookinfo -f https://raw.githubusercontent.com/istio/istio/release-<version>/samples/bookinfo/platform/kube/bookinfo.yaml - Assurez-vous que les microservices BookInfo et leurs pods correspondants sont déployés.
kubectl get svc -n bookinfoNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE details ClusterIP 172.21.19.104 <none> 9080/TCP 2m kubernetes ClusterIP 172.21.0.1 <none> 443/TCP 1d productpage ClusterIP 172.21.168.196 <none> 9080/TCP 2m ratings ClusterIP 172.21.11.131 <none> 9080/TCP 2m reviews ClusterIP 172.21.117.164 <none> 9080/TCP 2mkubectl get pods -n bookinfoNAME READY STATUS RESTARTS AGE details-v1-6865b9b99d-7v9h8 2/2 Running 0 2m productpage-v1-f8c8fb8-tbsz9 2/2 Running 0 2m ratings-v1-77f657f55d-png6j 2/2 Running 0 2m reviews-v1-6b7f6db5c5-fdmbq 2/2 Running 0 2m reviews-v2-7ff5966b99-zflkv 2/2 Running 0 2m reviews-v3-5df889bcff-nlmjp 2/2 Running 0 2m - Créez le fichier YAML
bookinfo-custom-gateway.yamlpour définir les ressourcesGatewayetVirtualService. Notez que la ressourceGatewayspécifiecustom-ingressgatewaypour le nom de l'équilibreur de charge d'entrée personnalisé que vous avez précédemment créé, et la ressourceVirtualServicespécifiebookinfo-gatewaypour le nom de la ressourceGateway.apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: custom-ingressgateway 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 - Créez les ressources
GatewayetVirtualServicedans votre cluster.kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo - En utilisant l'adresse IP (classique) ou le nom d'hôte (VPC) que vous avez trouvé pour l'équilibreur de charge
service/custom-ingressgatewaydans la section précédente, ouvrez la page produit de l'application BookInfo dans un navigateur.http://<IP_OR_HOSTNAME>/productpage
Votre équilibreur de charge de passerelle d'entrée personnalisée utilise maintenant le port de la ressource Gateway et les chemins de microservice de la ressource VirtualService pour acheminer le trafic vers l'application
BookInfo. Ensuite, vous pouvez éventuellement créer un enregistrement DNS pour l'équilibreur de charge de passerelle personnalisée.
Exposition de l'application BookInfo à l'aide d'un sous-domaine fourni par IBM avec TLS
Créez un sous-domaine fourni par IBM pour enregistrer l'adresse IP (classique) ou le nom d'hôte (VPC) de l'équilibreur de charge de passerelle personnalisée avec un enregistrement DNS. Le certificat TLS qui est généré pour le sous-domaine permet des connexions HTTPS à l'application BookInfo.
-
Enregistrez l'adresse IP ou le nom d'hôte de l'équilibreur de charge de passerelle personnalisée en créant un sous-domaine DNS. Spécifiez l'espace de noms
custom-gatewaypour les secrets TLS.- Clusters classiques
ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> --secret-namespace custom-gateways ``` * Clusters de VPC ```sh {: pre} ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname> --secret-namespace custom-gateways ``` -
Vérifiez que le sous-domaine est créé.
ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>Exemple de sortie pour les clusters classiques
Hostname IP(s) Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["168.1.1.1"] None created <certificate>Exemple de sortie pour les clusters VPC
Subdomain Load Balancer Hostname Health Monitor SSL Cert Status SSL Cert Secret Name mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud ["1234abcd-us-south.lb.appdomain.cloud"] None created <certificate> -
Obtenez le nom du secret de votre sous-domaine.
kubectl get secret -n custom-gatewaysExemple de sortie
mycluster-af23f234rwr3asdfasdf-002 kubernetes.io/tls 2 15m -
Dans le fichier
bookinfo-custom-gateway.yamlque vous avez créé dans la section précédente, modifiez la ressourcebookinfo-gatewayGatewayen ajoutant un port HTTPS 443 et une section TLS qui spécifie le secret de votre sous-domaine.apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: bookinfo-gateway spec: selector: istio: custom-ingressgateway servers: - port: number: 443 name: https protocol: HTTPS tls: mode: SIMPLE credentialName: mycluster-af23f234rwr3asdfasdf-002 # secret name hosts: - "*" --- ... -
Créez la ressource
Gatewaymodifiée dans votre cluster.kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo -
Dans un navigateur Web, ouvrez la page de produit BookInfo. Prenez soin d'utiliser HTTPS pour le sous-domaine que vous avez trouvé à l'étape 2.
https://<subdomain>/productpage
Création d'une passerelle d'entrée personnalisée pour le trafic du réseau privé
Pour créer un déploiement de passerelle d'entrée personnalisée et l'exposer avec un service d'équilibreur de charge privé, appliquez les étapes de la section Création d'une passerelle d'entrée personnalisée pour le trafic public.
Lorsque vous créez l'IOP à l'étape 3, spécifiez l'annotation service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private au lieu de public.
Notez les points suivants :
- Si votre cluster classique est connecté à des réseaux VLAN privés uniquement, ou si seul le noeud final de service de cloud privé est activé sur votre cluster VPC, un équilibreur de charge privé est créé par défaut lorsque vous appliquez l'IOP.
- Pour les clusters classiques uniquement, vous ne pouvez pas utiliser
ibmcloud ks nlb-dns create classicpour créer un enregistrement DNS et le sous-domaine fourni par IBM pour l'adresse IP de l'équilibreur de charge de passerelle personnalisé.
Contrôle des mises à jour et des versions de passerelle personnalisée
Mettez à jour et contrôlez manuellement la version Istio gérée des passerelles d'entrée personnalisées.
IBM Cloud conserve tous vos composants Istio à jour en déployant automatiquement les mises à jour de correctif vers la version la plus récente d'Istio qui est prise en charge par IBM Cloud Kubernetes Service. Par exemple, lorsque la version de correctif 1.29.5 est publiée, tous les pods de passerelle d'entrée sont automatiquement mis à jour vers cette dernière version de correctif. Les versions de correctifs sont complétées à l'aide de la stratégie de mise à jour en continu pour éviter les temps d'indisponibilité de vos applications. Cependant, vous pouvez empêcher les mises à jour automatiques des pods de passerelle personnalisée, par exemple si vous souhaitez tester toute régression potentielle avec la dernière version de correctif.
Pour gérer les mises à jour de vos passerelles d'entrée personnalisées, vous pouvez utiliser la stratégie de déploiement suivante :
- Créez des IOP de passerelle d'entrée personnalisée. Dans la zone
tag, indiquez une version de correctif identique ou antérieure à la version du plan de contrôle. Vous pouvez trouver la version du plan de contrôle en exécutant laistioctl version. - Lorsqu'une nouvelle version du correctif est publiée pour le module complémentaire Istio géré, modifiez le fichier YAML IOP pour une passerelle personnalisée afin d'utiliser la dernière version du correctif, puis réappliquez l'IOP dans votre cluster.
- Une fois les pods de la passerelle personnalisée mis à jour vers le dernier correctif, testez toutes les modifications apportées à la passerelle personnalisée.
- Lorsque vous êtes satisfait des modifications, modifiez les configurations des autres passerelles personnalisées pour les mettre à jour vers le dernier correctif.
Ne définissez pas la balise sur une version ultérieure à celle du plan de contrôle de votre module complémentaire Istio.
Mettez à jour les pods de votre passerelle personnalisée dès que possible après la publication d'une version. Les passerelles personnalisées qui exécutent des versions antérieures peuvent être exposées à des failles de sécurité.
Personnalisations supplémentaires des passerelles
Les passerelles d'entrée personnalisées peuvent être configurées avec des personnalisations supplémentaires, notamment le déploiement de l'équilibreur de charge de passerelle dans une zone spécifique, la spécification du nombre minimum de répliques
de pods de passerelle, la planification des pods de passerelle personnalisés sur les noeuds de périphérie, l'ajout de points d'ancrage de cycle de vie preStop pour les arrêts
en douceur et la spécification de l'anti-affinité et de l'affinité des noeuds worker.
Consultez des exemples de ces personnalisations supplémentaires dans le fichier YAML IOP suivant.
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: ibm-operators
name: custom-ingressgateway-iop
spec:
profile: empty
hub: icr.io/ext/istio
# tag: 1.29.5 # Force the gateway to a specific managed Istio version
components:
ingressGateways:
- name: custom-ingressgateway
label:
istio: custom-ingressgateway
namespace: custom-gateways
enabled: true
k8s:
serviceAnnotations:
service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal12" # Deploy the load balancer to a specific zone in your cluster
hpaSpec: # Specify the minimum number of pod replicas
minReplicas: 2
tolerations: # Schedule the custom gateway pods onto edge nodes
- key: dedicated
value: edge
env:
- name: TERMINATION_DRAIN_DURATION
value: 30s
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- istio-ingressgateway
topologyKey: kubernetes.io/hostname
weight: 100
nodeAffinity: # Example node affinities to control the zone or the edge
preferredDuringSchedulingIgnoredDuringExecution: # Could be requiredDuringSchedulingIgnoredDuringExecution instead
nodeSelectorTerms:
- matchExpressions:
- key: ibm-cloud.kubernetes.io/zone
operator: In
values:
- "dal12" # Deploy the load balancer to a specific zone in your cluster
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: dedicated
operator: In
values:
- edge
weight: 100
Création d'une passerelle de sortie personnalisée
À partir de la version 1.8 du module complémentaire Istio géré, vous pouvez créer des passerelles de sortie personnalisées. Ces passerelles servent de point de sortie pour tout le trafic sortant des applications du maillage de services vers des destinations externes.
Par exemple, pour créer une passerelle de sortie personnalisée, vous pouvez appliquer le fichier YAML suivant pour un IOP de votre cluster.
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: ibm-operators
name: custom-egressgateway-iop
spec:
profile: empty
hub: icr.io/ext/istio
# tag: 1.29.5 # Force the Gateway to a specific version
components:
egressGateways:
- name: custom-egressgateway
label:
istio: custom-egressgateway
namespace: custom-gateways
enabled: true
Pour plus d'informations sur la configuration et l'utilisation des passerelles de sortie personnalisées, consultez la documentation open source de l' Istio.
Désactivation des passerelles par défaut
Si vous n'avez pas besoin des déploiements istio-ingressgateway ou istio-egressgateway par défaut après avoir créé des passerelles personnalisées, vous pouvez éventuellement les désactiver.
Si vous souhaitez que vos applications soient accessibles aux clients, assurez-vous qu'au moins un équilibreur de charge de passerelle est activé et configuré pour acheminer le trafic vers vos applications. Si vous désactivez les équilibreurs de charge de passerelle par défaut dans toutes les zones, votre application n'est plus exposée et n'est plus accessible en externe.
-
Editez la ressource de mappe de configuration
managed-istio-custom.kubectl edit cm managed-istio-custom -n ibm-operators -
Désactivez les passerelles d'entrée par défaut en définissant les zones
istio-ingressgateway-public-1|2|3-enabledsur"false".istio-ingressgateway-public-1-enabled: "false" istio-ingressgateway-public-2-enabled: "false" istio-ingressgateway-public-3-enabled: "false" -
Pour désactiver la passerelle de sortie par défaut, ajoutez la zone
istio-egressgateway-public-1-enabled: "false".istio-egressgateway-public-1-enabled: "false" -
Sauvegardez et fermez le fichier de configuration.
-
Vérifiez que les services de la passerelle par défaut sont supprimés.
kubectl get svc -n istio-system