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.

  1. 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
    
  2. Ajouter Istio 's Helm repo.

    helm repo add istio https://istio-release.storage.googleapis.com/charts
    
  3. 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:

  1. Créez un cluster.

  2. 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
    
  3. Obtenir le site kubeconfig de la grappe.

    ibmcloud ks cluster config -c $CLUSTERID
    
  4. Localisez les deux passerelles Istio ConfigMaps qui contiennent le contenu value.yaml pour les passerelles d'entrée et de sortie.

    kubectl get cm -n ibm-operators
    

    Sortie :

    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
    
  5. Affiche le site values.yaml des 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.yaml
    

    Sortie :

    # "_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
    
  6. 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 fichiers value.yaml dans 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, et HorizontalPodAutoscaler sont nommés dans istio-ingressgateway dans l'espace de noms istio-system. Ces noms sont définis par les champs de name dans values.yaml.
    • ServiceAccount, Role, et Rolebinding sont nommés dans istio-ingressgateway-service-account dans l'espace de noms istio-system. Ces noms sont définis par le champ serviceAccount.name du site values.yaml.
  7. 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.yaml reste 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.

    a. Réviser le contenu du site values.yaml si 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-run pour 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-ingressgateway ou istio-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
    
  8. Si vous êtes satisfait des modifications, utilisez kubectl edit pour modifier le site values.yaml de la passerelle à l'intérieur du site ConfigMap d'où il provient.

    a. Ouvrez gateway-values.yaml et mettez la copie du fichier values.yaml en retrait de 4 espaces.

    b. Exécutez la commande kubectl edit.

    kubectl edit cm -n ibm-operators managed-istio-ingressgateway-values
    

    c. Supprimer les lignes de l'adresse précédente values.yaml.

    d. Commencez la touche values.yaml par une chaîne de plusieurs lignes. Exemple : |

    e. Copiez votre fichier values.yaml indenté de 4 espaces dans les lignes situées sous la touche values.yaml.

    Exemple :

    data:
      values.yaml: |
        <Copy values.yaml here.>
      values.yaml.helm.result: |
        <Don't remove these previous Helm logs.>
    
  9. Après environ 10 minutes, vérifiez si le journal Helm a été mis à jour dans le champ values.yaml.helm.result de 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/
    
  10. Visualiser les options de configuration.

    a. Afficher les valeurs.

    helm show values istio/gateway --version 1.29.5
    

    b. 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.

  1. Exécutez la commande helm show values.

    helm show values "istio/gateway" --version "1.29.0"
    
  2. Créez un fichier values.yaml pour la passerelle. L'exemple suivant est un values.yaml minimaliste pour un Istio ingressgateway basé 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-critical
    

    Vous pouvez également utiliser le site values.yaml de 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\"
    
  3. 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, et istio-egressgateway car 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.
  4. 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
    
  5. Appliquer ces ressources à l'aide de l'une des méthodes suivantes :

    • Utilisez la commande Helm upgrade sans 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.

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.

  1. Localisez les passerelles. Si la passerelle a été installée avec Helm, vous pouvez utiliser helm get all RELEASE_NAME -n NAMESPACE comme 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
    
  2. Retirer les passerelles. Si la passerelle a été installée avec Helm, vous pouvez utiliser helm uninstall RELEASE_NAME -n NAMESPACE comme raccourci.

    Exemple de suppression de istio-ingressgateway-public-2 dans l'espace de noms istio-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-found
    

    Exemple 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