Déploiement de passerelles Istio personnalisées dans Helm
Personnalisez les passerelles en modifiant la ressource qui définit les passerelles d'entrée et de sortie pour le trafic de l'application gérée par Istio.
Avec le passage à Helm pour la version complémentaire Istio 1.24 et suivantes, la ressource personnalisée IstioOperator n'est plus utilisée.
Configuration de Helm
Avant de commencer à déployer et à gérer des passerelles personnalisées, configurez Helm 3.18.4 ou une version antérieure.
-
Installez Helm 3.18.4 ou une version antérieure.
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 chmod 700 get_helm.sh helm_version_pin="v3.18.4" DESIRED_VERSION="${helm_version_pin}" ./get_helm.sh which helm helm version rm get_helm.sh -
Ajouter Istio 's Helm repo.
helm repo add istio https://istio-release.storage.googleapis.com/charts -
Exécutez la commande
helm repo update.helm repo update
Modification des passerelles par défaut existantes
Le module complémentaire déploie une version personnalisable de istio-ingressgateway et une version personnalisable de istio-egressgateway. Pour personnaliser la passerelle ConfigMaps pour les cartes Helm, au lieu d'ajouter
une paire clé-valeur comme vous le faites pour le plan de contrôle, modifiez la chaîne multiligne dans la clé value.yaml.
Ces fichiers value.yaml se présentent sous la forme de chaînes multilignes dans l'espace de noms managed-istio-ingressgateway-values et managed-istio-egressgateway-values ConfigMaps dans l'espace de noms
ibm-operators.
apiVersion: v1
kind: ConfigMap
metadata:
labels:
addonmanager.kubernetes.io/mode: EnsureExists
name: managed-istio-egressgateway-values
namespace: ibm-operators
data:
values.yaml: |
...
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 2000m
memory: 1024Mi
Pour modifier le contenu de istio-ingressgateway et istio-egressgateway value.yaml:
-
Créez un cluster.
-
Installez le module complémentaire Istio géré 1.24 ou une version ultérieure.
ibmcloud ks cluster addon enable istio -c $CLUSTERID --version 1.24 -
Obtenir le site
kubeconfigde la grappe.ibmcloud ks cluster config -c $CLUSTERID -
Localisez les deux passerelles Istio ConfigMaps qui contiennent le contenu
value.yamlpour les passerelles d'entrée et de sortie.kubectl get cm -n ibm-operatorsSortie :
NAME DATA AGE istio-ca-root-cert 1 12m kube-root-ca.crt 1 24h managed-istio-base-control-plane-values 2 13m managed-istio-custom 1 13m managed-istio-egressgateway-values 2 13m managed-istio-ingressgateway-values 2 13m managed-istio-istiod-control-plane-values 2 13m -
Affiche le site
values.yamldes passerelles dans un fichier.kubectl get cm -n ibm-operators managed-istio-ingressgateway-values -o json | jq -r .data.\"values.yaml\" > gateway-values.yaml; open gateway-values.yamlSortie :
# "_internal_defaults_do_not_set" is a workaround for Helm limitations. Users should NOT set "._internal_defaults_do_not_set" explicitly, but rather directly set the fields internally. # For instance, instead of `--set _internal_defaults_do_not_set.foo=bar``, just set `--set foo=bar`. _internal_defaults_do_not_set: # Name allows overriding the release name. Generally this should not be set name: "" serviceAccount: # If set, a service account will be created. Otherwise, the default is used create: true # Annotations to add to the service account annotations: {} # The name of the service account to use. # If not set, the release name is used name: "istio-ingressgateway-service-account" podAnnotations: prometheus.io/port: "15020" prometheus.io/scrape: "true" prometheus.io/path: "/stats/prometheus" inject.istio.io/templates: "gateway" sidecar.istio.io/inject: "true" service: # Egress gateways do not need an external LoadBalancer IP so they set "service.type: ClusterIP". # Type of service. Set to "None" to disable the service entirely type: LoadBalancer ports: - name: http2 port: 80 protocol: TCP targetPort: 8080 - name: https port: 443 protocol: TCP targetPort: 8443 loadBalancerIP: "" loadBalancerSourceRanges: [] externalTrafficPolicy: "" externalIPs: [] ipFamilyPolicy: "" ipFamilies: [] ## Whether to automatically allocate NodePorts (only for LoadBalancers). # allocateLoadBalancerNodePorts: false resources: requests: cpu: 100m memory: 128Mi limits: cpu: 2000m memory: 1024Mi autoscaling: enabled: true minReplicas: 2 maxReplicas: 5 targetCPUUtilizationPercentage: 80 targetMemoryUtilizationPercentage: {} autoscaleBehavior: {} tolerations: - key: dedicated value: edge topologySpreadConstraints: [] affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - istio-ingressgateway topologyKey: kubernetes.io/hostname weight: 100 nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - preference: matchExpressions: - key: dedicated operator: In values: - edge weight: 100 -
Vous pouvez gérer le plan de données, y compris ces passerelles. Commencez par la configuration par défaut, qui inclut les mises à jour automatiques des correctifs, une anti-affinité pour les pods préférés, ainsi qu'une tolérance et une préférence pour les nœuds périphériques. Vous êtes responsable des personnalisations que vous effectuez. Contrairement aux fichiers du plan de contrôle
value.yaml, vous pouvez modifier les fichiersvalue.yamldans ces ConfigMaps.Il s'agit des ressources créées par le diagramme istio/gateway en utilisant la configuration d'entrée par défaut. Les mêmes conventions de dénomination s'appliquent aux sorties.
PodDisruptionBudget,Service,Deployment, etHorizontalPodAutoscalersont nommés dansistio-ingressgatewaydans l'espace de nomsistio-system. Ces noms sont définis par les champs denamedansvalues.yaml.ServiceAccount,Role, etRolebindingsont nommés dansistio-ingressgateway-service-accountdans l'espace de nomsistio-system. Ces noms sont définis par le champserviceAccount.namedu sitevalues.yaml.
-
Testez les modifications que vous souhaitez apporter en les effectuant d'abord dans la version sauvegardée de
gateway-values.yaml. Ensuite, utilisez une simulation de Helm pour voir les changements dans le manifeste.Exemple :
Vous trouverez ci-dessous des exemples de modifications. Seules les modifications sont affichées; le reste du contenu de
values.yamlreste inchangé. Ces exemples de changements sont les suivants :-
Modifier les noms des ressources
-
Ajustement des demandes/limites de ressources
-
Augmenter l'autoscaling
-
Ajout d'une affinité de nœud
- Si vous envisagez d'utiliser l'affinité de nœud pour créer des affinités de zone, vous pouvez également utiliser
topologySpreadConstraintsà la place.
- Si vous envisagez d'utiliser l'affinité de nœud pour créer des affinités de zone, vous pouvez également utiliser
a. Réviser le contenu du site
values.yamlsi nécessaire.name: "custom-gateway" serviceAccount: name: "custom-ingressgateway-service-account" resources: requests: cpu: 100m memory: 128Mi limits: cpu: 2500m memory: 1024Mi autoscaling: enabled: true minReplicas: 3 maxReplicas: 7 targetCPUUtilizationPercentage: 80 targetMemoryUtilizationPercentage: {} autoscaleBehavior: {} affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: ibm-cloud.kubernetes.io/zone operator: In values: - "dal10"b. Utilisez Helm avec l'option
--dry-runpour obtenir un manifeste qui vous permettra de confirmer la syntaxe et de vous assurer que la configuration correspond à votre intention.Lorsque vous ciblez l'une des passerelles par défaut, qui sont
istio-ingressgatewayouistio-egressgateway, n'exécutez cette commande qu'avec l'option--dry-run. Ne pas exécuter cette commande sans l'option--dry-run.helm upgrade istio-ingressgateway istio/gateway --version 1.29.0 --install -n istio-system -f gateway-values.yaml --dry-run -
-
Si vous êtes satisfait des modifications, utilisez
kubectl editpour modifier le sitevalues.yamlde la passerelle à l'intérieur du site ConfigMap d'où il provient.a. Ouvrez
gateway-values.yamlet mettez la copie du fichiervalues.yamlen retrait de 4 espaces.b. Exécutez la commande
kubectl edit.kubectl edit cm -n ibm-operators managed-istio-ingressgateway-valuesc. Supprimer les lignes de l'adresse précédente
values.yaml.d. Commencez la touche
values.yamlpar une chaîne de plusieurs lignes. Exemple :|e. Copiez votre fichier
values.yamlindenté de 4 espaces dans les lignes situées sous la touchevalues.yaml.Exemple :
data: values.yaml: | <Copy values.yaml here.> values.yaml.helm.result: | <Don't remove these previous Helm logs.> -
Après environ 10 minutes, vérifiez si le journal Helm a été mis à jour dans le champ
values.yaml.helm.resultde ConfigMap et déboguez si nécessaire.kubectl get cm -n ibm-operators managed-istio-ingressgateway-values -o json | jq -r .data.\"values.yaml.helm.result\"Exemple de sortie :
GMT HELM_SUCCESS: Release "istio-ingressgateway" does not exist. Installing it now. NAME: istio-ingressgateway LAST DEPLOYED: Fri Sep 5 16:46:30 2025 NAMESPACE: istio-system STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: "istio-ingressgateway" successfully installed! To learn more about the release, try: $ helm status istio-ingressgateway -n istio-system $ helm get all istio-ingressgateway -n istio-system Next steps: * Deploy an HTTP Gateway: https://istio.io/latest/docs/tasks/traffic-management/ingress/ingress-control/ * Deploy an HTTPS Gateway: https://istio.io/latest/docs/tasks/traffic-management/ingress/secure-ingress/ -
Visualiser les options de configuration.
a. Afficher les valeurs.
helm show values istio/gateway --version 1.29.5b. Passez en revue les touches susceptibles de s'afficher.
name: # The gateway deployment's and service's name serviceAccount: name: # The service account, role, and rolebinding name resources: # Resource requests and limits autoscaling: # Min and Max gateway pods tolerations: # Tolerate your taints topologySpreadConstraints: # An alternative to node affinities affinity: # Where you can specify node affinities
Création de passerelles supplémentaires
Après avoir personnalisé la passerelle par défaut qui dispose d'un déploiement de passerelle, il se peut que vous souhaitiez configurer des passerelles supplémentaires. Générer le manifeste de ressources avec Helm, puis l'appliquer avec Helm ou avec un pipeline CI/CD pour les ressources YAML.
-
Exécutez la commande
helm show values.helm show values "istio/gateway" --version "1.29.0" -
Créez un fichier
values.yamlpour la passerelle. L'exemple suivant est unvalues.yamlminimaliste pour un Istioingressgatewaybasé sur les options disponibles dans Istio 1.24.6.rbac: # If enabled, roles will be created to enable accessing certificates from Gateways. This is not needed # when using http://gateway-api.org/. enabled: true serviceAccount: # If set, a service account will be created. Otherwise, the default is used create: true # Define the security context for the pod. # If unset, this will be automatically set to the minimum privileges required to bind to port 80 and 443. # On Kubernetes 1.22+, this only requires the `net.ipv4.ip_unprivileged_port_start` sysctl. securityContext: runAsGroup: 1337 runAsNonRoot: true runAsUser: 1337 seccompProfile: type: RuntimeDefault service: # Egress gateways do not need an external LoadBalancer IP so they set "service.type: ClusterIP". # Type of service. Set to "None" to disable the service entirely type: LoadBalancer ports: - name: http2 port: 80 protocol: TCP targetPort: 8080 - name: https port: 443 protocol: TCP targetPort: 8443 autoscaling: enabled: true minReplicas: 2 maxReplicas: 5 # Deployment Update strategy strategy: rollingUpdate: maxSurge: 100% maxUnavailable: 25% tolerations: - key: dedicated value: edge affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - istio-ingressgateway topologyKey: kubernetes.io/hostname weight: 100 nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - preference: matchExpressions: - key: dedicated operator: In values: - edge weight: 100 podDisruptionBudget: minAvailable: 1 # Sets the per-pod terminationGracePeriodSeconds setting. terminationGracePeriodSeconds: 30 # Configure this to a higher priority class in order to make sure that your Istio gateway pods # will not be killed because of low priority class. # Refer to https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/#priorityclass # for more detail. priorityClassName: ibm-app-cluster-criticalVous pouvez également utiliser le site
values.yamlde la passerelle par défaut comme point de départ.kubectl get cm -n ibm-operators managed-istio-ingressgateway-values -o json | jq -r .data.\"values.yaml\" -
Lors du choix d'un nom et d'un espace de noms pour la version Helm, il convient de tenir compte des conditions suivantes.
- Le nom et l'espace de noms de la version Helm doivent correspondre au nom et à l'espace de noms du déploiement de la passerelle.
- Évitez
istio-base,istiod,istio-ingressgateway, etistio-egressgatewaycar le module complémentaire géré Istio utilise ces noms de version. - Évitez d'utiliser le nom de version d'une autre des passerelles supplémentaires.
-
Faites un essai pour voir le manifeste des ressources YAML pour la passerelle. Pour Istio 1.25.4 et les versions antérieures, vous devez utiliser Helm v3.18.4.
helm upgrade --dry-run RELEASE_NAME istio/gateway --version ISTIO_VERSION --install -n NAMESPACE -f values.yaml -
Appliquer ces ressources à l'aide de l'une des méthodes suivantes :
- Utilisez la commande Helm
upgradesans l'option--dry-run. - Prenez le manifeste des ressources YAML et appliquez-le comme vous le feriez pour d'autres ressources YAML du plan de données Istio, en fonction du cas d'utilisation CI/CD de votre cluster.
- Utilisez la commande Helm
Exemples de personnalisation
Passerelle de sortie
Les passerelles de sortie doivent avoir un type de service de ClusterIP puisqu'elles n'ont pas besoin d'une IP LoadBalancer.
service:
type: ClusterIP
Demandes et limites de ressources
Si un champ n'est pas spécifié, les valeurs par défaut de Istio sont utilisées.
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 2000m
memory: 1024Mi
Mise à l'échelle automatique
Si autoscaling.enabled=true est défini, vous pouvez définir les répliques minimales et maximales pour l'autoscaler de pods horizontaux.
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 5
Fin gracieuse
La terminaison gracieuse donne à la passerelle plus de temps pour gérer les connexions existantes pendant qu'elle se termine. Cette fonction remplace la spécification de la variable d'environnement TERMINATION_DRAIN_DURATION.
Vous pouvez augmenter la valeur de ce paramètre, si nécessaire.
# Sets the per-pod terminationGracePeriodSeconds setting.
terminationGracePeriodSeconds: 30
Affinité de zone
Les contraintes de diffusion de la topologie peuvent être définies dans le champ topologySpreadConstraints. En fonction du cas
d'utilisation, cette solution peut être une meilleure alternative à la solution précédente d'affinité de zone.
topologySpreadConstraints: []
Les affinités de zone peuvent être spécifiées en ajoutant une annotation de service et une affinité de nœud.
service:
annotations:
service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal10"
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: ibm-cloud.kubernetes.io/zone
operator: In
values:
- "dal10"
Vous pouvez indiquer l' loadBalancerIP.
Service.spec.loadBalancerIP a été déprécié par Kubernetes dans la version 1.24. Cette option cesse de fonctionner lorsque Kubernetes a fini de supprimer le champ. Si vous spécifiez une IP qui est déjà utilisée ailleurs sur le cluster, l'IP externe du service restera en attente.
service:
type: LoadBalancer
loadBalancerIP: ""
Épingler la version Istio
Les passerelles Istio disposent de image: auto afin de récupérer l'image sidecar proxyv2 attendue lors de la création d'un pod. Ce paramètre peut être remplacé par une annotation de pod. Si vous utilisez cette option
pour épingler la balise image, vous êtes responsable de la mise à jour de cette balise à chaque correctif et mise à jour mineure de Istio.
podAnnotations:
"sidecar.istio.io/proxyImage": "icr.io/ext/istio/proxyv2:1.24.0"
Désactivation de la passerelle
Vous pouvez désactiver le service en changeant son type en None. Vous pouvez également réduire le déploiement de la passerelle. Dans Istio 1.24 et 1.25, il y a un problème où replicaCount a un minimum de 1.
Dans Istio 1.26.0 et les versions ultérieures, vous pouvez configurer replicaCount en 0. Lorsque le type de service de ingressgateway passe de LoadBalancer à None, l'IP de
LoadBalancer est finalement abandonnée. Si le type de service a été ramené à LoadBalancer, une nouvelle IP est attribuée.
replicaCount: 0
service:
type: None
autoscaling:
enabled: false
Suppression des déploiements de passerelles
Si vous avez activé istio-ingressgateway-public-2, istio-ingressgateway-public-3, ou si vous souhaitez supprimer toute autre passerelle personnalisée, localisez et supprimez ces ressources.
-
Localisez les passerelles. Si la passerelle a été installée avec Helm, vous pouvez utiliser
helm get all RELEASE_NAME -n NAMESPACEcomme raccourci.kubectl get PodDisruptionBudget -n NAMESPACE GATEWAY_NAME --ignore-not-found kubectl get Service -n NAMESPACE GATEWAY_NAME --ignore-not-found kubectl get Deployment -n NAMESPACE GATEWAY_NAME --ignore-not-found kubectl get HorizontalPodAutoscaler -n NAMESPACE GATEWAY_NAME --ignore-not-found kubectl get ServiceAccount -n NAMESPACE --ignore-not-found | grep GATEWAY_NAME kubectl get Role -n NAMESPACE --ignore-not-found | grep GATEWAY_NAME kubectl get RoleBinding -n NAMESPACE --ignore-not-found | grep GATEWAY_NAME -
Retirer les passerelles. Si la passerelle a été installée avec Helm, vous pouvez utiliser
helm uninstall RELEASE_NAME -n NAMESPACEcomme raccourci.Exemple de suppression de
istio-ingressgateway-public-2dans l'espace de nomsistio-system:kubectl delete PodDisruptionBudget -n istio-system istio-ingressgateway-public-2 --ignore-not-found kubectl delete Service -n istio-system istio-ingressgateway-public-2 --ignore-not-found kubectl delete Deployment -n istio-system istio-ingressgateway-public-2 --ignore-not-found kubectl delete HorizontalPodAutoscaler -n istio-system istio-ingressgateway-public-2 --ignore-not-found kubectl delete ServiceAccount -n istio-system istio-ingressgateway-public-2-service-account --ignore-not-found kubectl delete Role -n istio-system istio-ingressgateway-public-2-sds --ignore-not-found kubectl delete RoleBinding -n istio-system istio-ingressgateway-public-2-sds --ignore-not-foundExemple de sortie :
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE istio-ingressgateway-public-2 N/A N/A 0 2m33s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway-public-2 LoadBalancer 172.21.227.3 169.46.62.156 80:32705/TCP,443:31154/TCP 2m32s NAME READY UP-TO-DATE AVAILABLE AGE istio-ingressgateway-public-2 2/2 2 2 2m33s NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE istio-ingressgateway-public-2 Deployment/istio-ingressgateway-public-2 cpu: <unknown>/80% 2 5 2 2m34s istio-ingressgateway-public-2-service-account 0 2m34s istio-ingressgateway-public-2-sds 2025-09-09T17:20:46Z istio-ingressgateway-public-2-sds Role/istio-ingressgateway-public-2-sds 2m34s