Instalación de pasarelas personalizadas Istio en Helm

Personalice las pasarelas editando el recurso que define las pasarelas de entrada y salida para el tráfico de aplicaciones gestionado por Istio.

Con el cambio a Helm para el complemento Istio versión 1.24 y posteriores, el recurso personalizado IstioOperator ya no se utiliza.

Configuración de Helm

Antes de empezar a desplegar y gestionar pasarelas personalizadas, configure Helm 3.18.4 o anterior.

  1. Instale Helm 3.18.4 o anterior.

    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. Añadir Istio 's Helm repo.

    helm repo add istio https://istio-release.storage.googleapis.com/charts
    
  3. Ejecute el mandato helm repo update.

    helm repo update
    

Modificación de las pasarelas por defecto existentes

El complemento despliega un istio-ingressgateway y un istio-egressgateway personalizables. Para personalizar la pasarela ConfigMaps para los gráficos Helm, en lugar de añadir un par clave-valor como se hace para el plano de control, edite la cadena multilínea de la clave value.yaml.

Estos archivos value.yaml se encuentran como cadenas multilínea en el espacio de nombres managed-istio-ingressgateway-values y managed-istio-egressgateway-values ConfigMaps en el espacio de nombres 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

Para editar el contenido de istio-ingressgateway y istio-egressgateway value.yaml:

  1. Cree un clúster.

  2. Instale el complemento Istio gestionado 1.24 o posterior.

    ibmcloud ks cluster addon enable istio -c $CLUSTERID --version 1.24
    
  3. Obtenga la dirección kubeconfig del clúster.

    ibmcloud ks cluster config -c $CLUSTERID
    
  4. Localice las dos pasarelas Istio ConfigMaps que contienen el contenido value.yaml para las pasarelas de entrada y salida.

    kubectl get cm -n ibm-operators
    

    Salida:

    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. Envía la dirección values.yaml de las pasarelas a un archivo.

    kubectl get cm -n ibm-operators  managed-istio-ingressgateway-values -o json | jq -r .data.\"values.yaml\" > gateway-values.yaml; open gateway-values.yaml
    

    Salida:

    # "_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. Puede gestionar el plano de datos, incluidas estas pasarelas. Comience con la configuración predeterminada, que incluye actualizaciones automáticas de parches, una antiafinidad de pods preferida y, tolerancia y preferencia por los nodos de borde. Usted es responsable de las personalizaciones que realice. A diferencia de los archivos value.yaml del plano de control, puede editar los archivos value.yaml en estos ConfigMaps.

    Estos son los recursos creados por el gráfico istio/gateway utilizando la configuración Ingress por defecto. Las mismas convenciones de nomenclatura son válidas para la salida.

    • PodDisruptionBudget, Service, Deployment, y HorizontalPodAutoscaler se nombran en istio-ingressgateway en el espacio de nombres istio-system. Estos nombres se establecen en los campos name de values.yaml.
    • ServiceAccount, Role, y Rolebinding se nombran en istio-ingressgateway-service-account en el espacio de nombres istio-system. Estos nombres se establecen en el campo serviceAccount.name de values.yaml.
  7. Pruebe los cambios que desea realizar haciéndolos primero en la página guardada gateway-values.yaml. A continuación, utilice un simulacro de Helm para ver los cambios manifiestos.

    Ejemplo:

    A continuación se muestran algunos ejemplos de cambios. Sólo se muestran los cambios; el resto del contenido de values.yaml no se modifica. Estos cambios son algunos ejemplos:

    • Cambiar los nombres de los recursos

    • Ajustar las solicitudes/límites de recursos

    • Aumentar la autoescalabilidad

    • Añadir una afinidad de nodo

      • Si está pensando en utilizar la afinidad de nodo para crear afinidades de zona, también podría utilizar topologySpreadConstraints en su lugar.

    a. Revise el contenido de values.yaml si es necesario.

    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. Utilice Helm con la opción --dry-run para obtener un manifiesto que le permita confirmar la sintaxis y que la configuración se ajusta a su intención.

    Cuando se dirija a una de las pasarelas predeterminadas, que son istio-ingressgateway o istio-egressgateway, ejecute este comando sólo con la opción --dry-run. No ejecute este comando sin la opción --dry-run.

    helm upgrade istio-ingressgateway istio/gateway --version 1.29.0 --install -n istio-system -f gateway-values.yaml --dry-run
    
  8. Si está satisfecho con los cambios, utilice kubectl edit para editar el values.yaml de la pasarela dentro del ConfigMap del que procede.

    a. Abra gateway-values.yaml y añada 4 espacios a la copia del archivo values.yaml.

    b. Ejecute el mandato kubectl edit.

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

    c. Borre las líneas de la anterior values.yaml.

    d. Inicie la tecla values.yaml con una cadena de varias líneas. Ejemplo: |

    e. Copie su archivo values.yaml sangrado 4 espacios en las líneas por debajo de la tecla values.yaml.

    Ejemplo:

    data:
      values.yaml: |
        <Copy values.yaml here.>
      values.yaml.helm.result: |
        <Don't remove these previous Helm logs.>
    
  9. Después de unos 10 minutos, compruebe si hay un registro Helm actualizado en el campo values.yaml.helm.result de ese ConfigMap y depure si es necesario.

    kubectl get cm -n ibm-operators managed-istio-ingressgateway-values -o json | jq -r .data.\"values.yaml.helm.result\"
    

    Salida de ejemplo:

    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. Ver las opciones de configuración.

    a. Muestra los valores.

    helm show values istio/gateway --version 1.29.5
    

    b. Revise las posibles claves que podrían aparecer.

        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
    

Creación de pasarelas adicionales

Después de personalizar la puerta de enlace predeterminada que tiene un despliegue de puertas de enlace, es posible que desee configurar puertas de enlace adicionales. Genere el manifiesto de recursos con Helm y, a continuación, aplíquelo con Helm o con una canalización CI/CD para recursos YAML.

  1. Ejecute el mandato helm show values.

    helm show values "istio/gateway" --version "1.29.0"
    
  2. Cree un archivo values.yaml para la pasarela. El siguiente ejemplo es un values.yaml minimalista para un Istio ingressgateway basado en las opciones disponibles en 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
    

    También puede utilizar la dirección values.yaml de la pasarela por defecto como punto de partida.

    kubectl get cm -n ibm-operators  managed-istio-ingressgateway-values -o json | jq -r .data.\"values.yaml\"
    
  3. A la hora de elegir un nombre y un espacio de nombres para la versión Helm, tenga en cuenta las siguientes condiciones.

    • El nombre y el espacio de nombres de la versión Helm deben coincidir con el nombre y el espacio de nombres de la implantación de la pasarela.
    • Evite istio-base, istiod, istio-ingressgateway, y istio-egressgateway porque el complemento gestionado Istio utiliza esos nombres de versión.
    • Evite utilizar el nombre de lanzamiento de otra de las pasarelas adicionales.
  4. Haga una prueba para ver el manifiesto de los recursos YAML para la pasarela. Para Istio 1.25.4 y anteriores, debe utilizar Helm v3.18.4.

    helm upgrade --dry-run RELEASE_NAME istio/gateway --version ISTIO_VERSION --install -n NAMESPACE -f values.yaml
    
  5. Aplique esos recursos con uno de los métodos siguientes:

    • Utilice el comando Helm upgrade sin la opción --dry-run.
    • Tome el manifiesto de los recursos YAML y aplíquelo como haría con otros YAML de plano de datos de Istio, en función del caso de uso CI/CD de su clúster.

Ejemplos de personalización

Pasarela de salida

Las pasarelas de salida deben tener un tipo de servicio de ClusterIP ya que no necesitan una IP de LoadBalancer.

service:
  type: ClusterIP

Solicitudes y límites de recursos

Si no se especifica un campo, se utilizan los valores por defecto de Istio.

resources:
  requests:
    cpu: 100m
    memory: 128Mi
  limits:
    cpu: 2000m
    memory: 1024Mi

Escalado automático

Si se establece autoscaling.enabled=true, puede establecer las réplicas mínima y máxima para el autoescalador de pod horizontal.

autoscaling:
  enabled: true
  minReplicas: 2
  maxReplicas: 5

Finalización gradual

La terminación graceful da a la pasarela tiempo extra para gestionar las conexiones existentes mientras está terminando. Esta función sustituye a la especificación de la variable de entorno TERMINATION_DRAIN_DURATION. Si es necesario, puede aumentar el valor de este ajuste.

# Sets the per-pod terminationGracePeriodSeconds setting.
terminationGracePeriodSeconds: 30

Afinidad de zona

Las restricciones de dispersión topológica pueden establecerse con el campo topologySpreadConstraints. Dependiendo del caso de uso, esta solución puede ser una alternativa mejor que la anterior solución de afinidad de zonas.

topologySpreadConstraints: []

Las afinidades de zona pueden especificarse añadiendo una anotación de servicio y una afinidad de nodo.

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"

Puedes especificar el loadBalancerIP.

Service.spec.loadBalancerIP Fue descartado por Kubernetes en la versión 1.24. Esta opción deja de funcionar cuando Kubernetes termina de eliminar el campo. Si especifica una IP que ya está en uso en otra parte del clúster, el servicio tendrá su IP externa pendiente.

service:
  type: LoadBalancer
  loadBalancerIP: ""

Fijar la versión Istio

Las pasarelas Istio tienen image: auto para que recojan la imagen sidecar proxyv2 esperada en la creación del pod. Esta configuración puede anularse mediante una anotación de pod. Si utiliza esta anulación para fijar la etiqueta de imagen, será responsable de actualizar dicha fijación en cada parche y actualización menor de Istio.

podAnnotations:
  "sidecar.istio.io/proxyImage": "icr.io/ext/istio/proxyv2:1.24.0"

Desactivar la pasarela

Puede desactivar el servicio cambiando su tipo a None. También puede reducir el despliegue de la pasarela. En Istio 1.24 y 1.25, hay un problema en el que replicaCount tiene un mínimo de 1. En Istio 1.26.0 y posteriores, puede establecer el replicaCount a 0. Cuando el tipo de servicio para ingressgateway se cambia de LoadBalancer a None, su IP LoadBalancer es finalmente cedida. Si el tipo de servicio se ha vuelto a cambiar a LoadBalancer, se asigna una nueva IP.

replicaCount: 0
service:
  type: None
autoscaling:
  enabled: false

Eliminación de las implantaciones de pasarelas

Si ha habilitado istio-ingressgateway-public-2, istio-ingressgateway-public-3, o tiene alguna otra pasarela personalizada que desee eliminar, localice y elimine estos recursos.

  1. Localiza las pasarelas. Si la pasarela se instaló con Helm, puede utilizar helm get all RELEASE_NAME -n NAMESPACE como acceso directo.

    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. Retire las pasarelas. Si la pasarela se instaló con Helm, puede utilizar helm uninstall RELEASE_NAME -n NAMESPACE como acceso directo.

    Ejemplo de eliminación de istio-ingressgateway-public-2 en el espacio de nombres 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
    

    Salida de ejemplo:

    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