Bereitstellung von benutzerdefinierten Istio Gateways in Helm

Passen Sie die Gateways an, indem Sie die Ressource bearbeiten, die die Eingangs- und Ausgangsgateways für den von Istio verwalteten App-Verkehr definiert.

Mit der Umstellung auf Helm für die Add-on-Version Istio 1.24 und später wird die benutzerdefinierte Ressource IstioOperator nicht mehr verwendet.

Helm einrichten

Bevor Sie mit der Bereitstellung und Verwaltung von benutzerdefinierten Gateways beginnen, sollten Sie Helm 3.18.4 oder früher einrichten.

  1. Installieren Sie Helm 3.18.4 oder früher.

    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. Istio 's Helm Repo hinzufügen.

    helm repo add istio https://istio-release.storage.googleapis.com/charts
    
  3. Führen Sie den Befehl helm repo update aus.

    helm repo update
    

Ändern vorhandener Standard-Gateways

Das Add-on stellt eine anpassbare istio-ingressgateway und eine anpassbare istio-egressgateway zur Verfügung. Um das Gateway ConfigMaps für die Helm Diagramme anzupassen, fügen Sie kein Schlüssel-Wert-Paar wie für die Steuerungsebene hinzu, sondern bearbeiten Sie die mehrzeilige Zeichenfolge im Schlüssel value.yaml.

Diese value.yaml Dateien befinden sich als mehrzeilige Strings im managed-istio-ingressgateway-values und managed-istio-egressgateway-values ConfigMaps im ibm-operators Namensraum.

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

So bearbeiten Sie den Inhalt von istio-ingressgateway und istio-egressgateway value.yaml:

  1. Erstellt einen Cluster.

  2. Installieren Sie das verwaltete Add-on Istio 1.24 oder höher.

    ibmcloud ks cluster addon enable istio -c $CLUSTERID --version 1.24
    
  3. Holen Sie sich die kubeconfig des Clusters.

    ibmcloud ks cluster config -c $CLUSTERID
    
  4. Suchen Sie die beiden Istio gateway ConfigMaps, die den Inhalt von value.yaml für die Eingangs- und Ausgangsgateways enthalten.

    kubectl get cm -n ibm-operators
    

    Ausgabe:

    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. Ausgabe der values.yaml der Gateways in eine Datei.

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

    Ausgabe:

    # "_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. Sie können die Datenebene, einschließlich dieser Gateways, verwalten. Beginnen Sie mit der Standardkonfiguration, die automatische Patch-Updates, eine bevorzugte Pod-Anti-Affinität und die Tolerierung und Bevorzugung von Edge-Nodes umfasst. Sie sind für die von Ihnen vorgenommenen Anpassungen verantwortlich. Im Gegensatz zu den Dateien der Steuerungsebene value.yaml können Sie die Dateien value.yaml in diesen ConfigMaps bearbeiten.

    Dies sind die Ressourcen, die vom istio/gateway-Diagramm unter Verwendung der Standard-Ingress-Konfiguration erstellt wurden. Die gleichen Namenskonventionen gelten auch für die Ausgänge.

    • PodDisruptionBudget Service, und werden in im Namensraum genannt. Deployment HorizontalPodAutoscaler istio-ingressgateway istio-system Diese Namen werden über die Felder name in der values.yaml festgelegt.
    • ServiceAccount, Role und Rolebinding werden in istio-ingressgateway-service-account im Namensraum istio-system genannt. Diese Namen werden über das Feld serviceAccount.name in der values.yaml festgelegt.
  7. Testen Sie die Änderungen, die Sie vornehmen möchten, indem Sie sie zunächst in der gespeicherten gateway-values.yaml vornehmen. Führen Sie dann einen Probelauf von Helm durch, um die Änderungen im Manifest zu sehen.

    Beispiel:

    Nachfolgend sind beispielhafte Änderungen dargestellt. Es werden nur die Änderungen angezeigt; der Rest des Inhalts von values.yaml bleibt unverändert. Zu diesen Beispielen gehören Änderungen:

    • Ändern der Namen der Ressourcen

    • Anpassung der Ressourcenanforderungen/-begrenzungen

    • Erhöhung der Autoskalierung

    • Hinzufügen einer Knotenaffinität

      • Wenn Sie erwägen, die Knotenaffinität zu verwenden, um Zonenaffinitäten zu erstellen, können Sie stattdessen auch topologySpreadConstraints verwenden.

    a. Überarbeiten Sie den Inhalt von values.yaml nach Bedarf.

    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. Verwenden Sie Helm mit der Option --dry-run, um ein Manifest auszugeben, damit Sie die Syntax überprüfen können und sicher sein können, dass die Konfiguration Ihrer Absicht entspricht.

    Wenn Sie auf eines der Standard-Gateways istio-ingressgateway oder istio-egressgateway abzielen, führen Sie diesen Befehl nur mit der Option --dry-run aus. Führen Sie diesen Befehl nicht ohne die Option --dry-run aus.

    helm upgrade istio-ingressgateway istio/gateway --version 1.29.0 --install -n istio-system -f gateway-values.yaml --dry-run
    
  8. Wenn Sie mit den Änderungen zufrieden sind, verwenden Sie kubectl edit, um die values.yaml des Gateways innerhalb der ConfigMap zu bearbeiten, von der es stammt.

    a. Öffnen Sie gateway-values.yaml und rücken Sie die Kopie der Datei values.yaml um 4 Leerzeichen ein.

    b. Führen Sie den Befehl kubectl edit aus.

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

    c. Löschen Sie die Zeilen der vorherigen values.yaml.

    d. Beginnen Sie die Taste values.yaml mit einer mehrzeiligen Zeichenfolge. Beispiel: |

    e. Kopieren Sie Ihre mit 4 Leerzeichen eingerückte Datei values.yaml in die Zeilen unter der Taste values.yaml.

    Beispiel:

    data:
      values.yaml: |
        <Copy values.yaml here.>
      values.yaml.helm.result: |
        <Don't remove these previous Helm logs.>
    
  9. Prüfen Sie nach etwa 10 Minuten, ob ein aktualisiertes Helm-Protokoll im values.yaml.helm.result-Feld von ConfigMap vorhanden ist, und beheben Sie es bei Bedarf.

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

    Beispielausgabe:

    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. Sehen Sie sich die Konfigurationsoptionen an.

    a. Zeigen Sie die Werte an.

    helm show values istio/gateway --version 1.29.5
    

    b. Überprüfen Sie die möglichen Schlüssel, die angezeigt werden können.

        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
    

Schaffung zusätzlicher Gateways

Nach der Anpassung des Standard-Gateways, das über eine Gateway-Bereitstellung verfügt, möchten Sie möglicherweise weitere Gateways konfigurieren. Generieren Sie das Ressourcenmanifest mit Helm und wenden Sie es dann entweder mit Helm oder mit einer CI/CD-Pipeline für YAML-Ressourcen an.

  1. Führen Sie den Befehl helm show values aus.

    helm show values "istio/gateway" --version "1.29.0"
    
  2. Erstellen Sie eine values.yaml Datei für das Gateway. Das folgende Beispiel ist ein minimalistisches values.yaml für ein Istio ingressgateway basierend auf den Optionen, die in Istio 1.24.6 verfügbar sind.

    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
    

    Alternativ können Sie auch die Adresse values.yaml des Standard-Gateways als Ausgangspunkt verwenden.

    kubectl get cm -n ibm-operators  managed-istio-ingressgateway-values -o json | jq -r .data.\"values.yaml\"
    
  3. Bei der Wahl eines Helm Freigabenamens und eines Namensraums sind die folgenden Bedingungen zu beachten.

    • Der Helm Versionsname und der Namespace sollten mit dem Bereitstellungsnamen und dem Namespace des Gateways übereinstimmen.
    • Vermeiden Sie istio-base, istiod, istio-ingressgateway und istio-egressgateway, da das verwaltete Add-on Istio diese Versionsnamen verwendet.
    • Vermeiden Sie die Verwendung des Freigabenamens eines anderen der zusätzlichen Gateways.
  4. Führen Sie einen Trockenlauf durch, um das Manifest der YAML-Ressourcen für das Gateway zu sehen. Für Istio 1.25.4 und früher müssen Sie Helm v3.18.4 verwenden.

    helm upgrade --dry-run RELEASE_NAME istio/gateway --version ISTIO_VERSION --install -n NAMESPACE -f values.yaml
    
  5. Wenden Sie diese Ressourcen mit einer der folgenden Methoden an:

    • Verwenden Sie den Befehl Helm upgrade ohne die Option --dry-run.
    • Nehmen Sie das Manifest der YAML-Ressourcen und wenden Sie es wie andere Istio data plane YAML an, je nach CI/CD-Anwendungsfall Ihres Clusters.

Beispielhafte Anpassungen

Egress-Gateway

Egress-Gateways müssen einen Diensttyp ClusterIP haben, da sie keine LoadBalancer IP benötigen.

service:
  type: ClusterIP

Ressourcenanforderungen und -grenzwerte

Wenn ein Feld nicht angegeben wird, werden die Standardwerte von Istio verwendet.

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

Automatische Skalierung

Wenn autoscaling.enabled=true eingestellt ist, können Sie die minimalen und maximalen Replikate für den horizontalen Pod-Auto-Scaler festlegen.

autoscaling:
  enabled: true
  minReplicas: 2
  maxReplicas: 5

Ordnungsgemäße Beendigung

Die reguläre Beendigung gibt dem Gateway zusätzliche Zeit, um bestehende Verbindungen zu bearbeiten, während es beendet wird. Diese Funktion ersetzt die Angabe der Umgebungsvariablen TERMINATION_DRAIN_DURATION. Sie können den Wert für diese Einstellung bei Bedarf erhöhen.

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

Zonenaffinität

Topologieausbreitungsbeschränkungen können über das Feld topologySpreadConstraints festgelegt werden. Je nach Anwendungsfall kann diese Lösung eine bessere Alternative zur bisherigen Zonenaffinitätslösung sein.

topologySpreadConstraints: []

Zonenaffinitäten können durch Hinzufügen einer Dienstanmerkung und einer Knotenaffinität angegeben werden.

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"

Sie können die loadBalancerIP angeben.

Service.spec.loadBalancerIP wurde durch „ Kubernetes “ in Version „ 1.24 “ als veraltet markiert. Diese Option funktioniert nicht mehr, wenn „ Kubernetes “ das Feld entfernt hat. Wenn Sie eine IP angeben, die bereits an einer anderen Stelle des Clusters verwendet wird, bleibt die externe IP des Dienstes in der Schwebe.

service:
  type: LoadBalancer
  loadBalancerIP: ""

Anheften der Version Istio

Die Istio Gateways haben image: auto, so dass sie das erwartete Sidecar-Image proxyv2 bei der Pod-Erstellung abholen werden. Diese Einstellung kann durch eine Pod-Anmerkung außer Kraft gesetzt werden. Wenn Sie diese Überschreibung verwenden, um das Bild-Tag anzuheften, sind Sie dafür verantwortlich, diese Anheftung bei jedem Istio Patch und jedem kleineren Update zu aktualisieren.

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

Deaktivieren des Gateways

Sie können den Dienst deaktivieren, indem Sie seinen Typ in None ändern. Sie können die Bereitstellung des Gateways auch verkleinern. In Istio 1.24 und 1.25 gibt es ein Problem, bei dem replicaCount ein Minimum von 1 hat. In Istio 1.26.0 und später können Sie replicaCount auf 0 einstellen. Wenn die Dienstart für ingressgateway von LoadBalancer auf None geändert wird, wird die IP von LoadBalancer schließlich aufgegeben. Wenn der Diensttyp wieder auf LoadBalancer geändert wurde, wird eine neue IP zugewiesen.

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

Entfernen von Gateway-Bereitstellungen

Wenn Sie istio-ingressgateway-public-2, istio-ingressgateway-public-3 aktiviert haben oder ein anderes benutzerdefiniertes Gateway haben, das Sie entfernen möchten, suchen Sie diese Ressourcen und löschen Sie sie.

  1. Suchen Sie die Gateways. Wenn das Kabelmodem mit Helm installiert wurde, können Sie helm get all RELEASE_NAME -n NAMESPACE als Verknüpfung verwenden.

    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. Entfernen Sie die Gateways. Wenn das Kabelmodem mit Helm installiert wurde, können Sie helm uninstall RELEASE_NAME -n NAMESPACE als Verknüpfung verwenden.

    Beispiel für das Entfernen von istio-ingressgateway-public-2 im Namensraum 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
    

    Beispielausgabe:

    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