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.
-
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 -
Añadir Istio 's Helm repo.
helm repo add istio https://istio-release.storage.googleapis.com/charts -
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:
-
Cree un clúster.
-
Instale el complemento Istio gestionado 1.24 o posterior.
ibmcloud ks cluster addon enable istio -c $CLUSTERID --version 1.24 -
Obtenga la dirección
kubeconfigdel clúster.ibmcloud ks cluster config -c $CLUSTERID -
Localice las dos pasarelas Istio ConfigMaps que contienen el contenido
value.yamlpara las pasarelas de entrada y salida.kubectl get cm -n ibm-operatorsSalida:
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 -
Envía la dirección
values.yamlde 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.yamlSalida:
# "_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 -
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.yamldel plano de control, puede editar los archivosvalue.yamlen 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, yHorizontalPodAutoscalerse nombran enistio-ingressgatewayen el espacio de nombresistio-system. Estos nombres se establecen en los camposnamedevalues.yaml.ServiceAccount,Role, yRolebindingse nombran enistio-ingressgateway-service-accounten el espacio de nombresistio-system. Estos nombres se establecen en el camposerviceAccount.namedevalues.yaml.
-
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.yamlno 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
topologySpreadConstraintsen su lugar.
- Si está pensando en utilizar la afinidad de nodo para crear afinidades de zona, también podría utilizar
a. Revise el contenido de
values.yamlsi 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-runpara 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-ingressgatewayoistio-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 -
-
Si está satisfecho con los cambios, utilice
kubectl editpara editar elvalues.yamlde la pasarela dentro del ConfigMap del que procede.a. Abra
gateway-values.yamly añada 4 espacios a la copia del archivovalues.yaml.b. Ejecute el mandato
kubectl edit.kubectl edit cm -n ibm-operators managed-istio-ingressgateway-valuesc. Borre las líneas de la anterior
values.yaml.d. Inicie la tecla
values.yamlcon una cadena de varias líneas. Ejemplo:|e. Copie su archivo
values.yamlsangrado 4 espacios en las líneas por debajo de la teclavalues.yaml.Ejemplo:
data: values.yaml: | <Copy values.yaml here.> values.yaml.helm.result: | <Don't remove these previous Helm logs.> -
Después de unos 10 minutos, compruebe si hay un registro Helm actualizado en el campo
values.yaml.helm.resultde 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/ -
Ver las opciones de configuración.
a. Muestra los valores.
helm show values istio/gateway --version 1.29.5b. 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.
-
Ejecute el mandato
helm show values.helm show values "istio/gateway" --version "1.29.0" -
Cree un archivo
values.yamlpara la pasarela. El siguiente ejemplo es unvalues.yamlminimalista para un Istioingressgatewaybasado 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-criticalTambién puede utilizar la dirección
values.yamlde 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\" -
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, yistio-egressgatewayporque el complemento gestionado Istio utiliza esos nombres de versión. - Evite utilizar el nombre de lanzamiento de otra de las pasarelas adicionales.
-
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 -
Aplique esos recursos con uno de los métodos siguientes:
- Utilice el comando Helm
upgradesin 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.
- Utilice el comando Helm
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.
-
Localiza las pasarelas. Si la pasarela se instaló con Helm, puede utilizar
helm get all RELEASE_NAME -n NAMESPACEcomo 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 -
Retire las pasarelas. Si la pasarela se instaló con Helm, puede utilizar
helm uninstall RELEASE_NAME -n NAMESPACEcomo acceso directo.Ejemplo de eliminación de
istio-ingressgateway-public-2en el espacio de nombresistio-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-foundSalida 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