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.
-
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 -
Istio 's Helm Repo hinzufügen.
helm repo add istio https://istio-release.storage.googleapis.com/charts -
Führen Sie den Befehl
helm repo updateaus.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:
-
Erstellt einen Cluster.
-
Installieren Sie das verwaltete Add-on Istio 1.24 oder höher.
ibmcloud ks cluster addon enable istio -c $CLUSTERID --version 1.24 -
Holen Sie sich die
kubeconfigdes Clusters.ibmcloud ks cluster config -c $CLUSTERID -
Suchen Sie die beiden Istio gateway ConfigMaps, die den Inhalt von
value.yamlfür die Eingangs- und Ausgangsgateways enthalten.kubectl get cm -n ibm-operatorsAusgabe:
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 -
Ausgabe der
values.yamlder 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.yamlAusgabe:
# "_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 -
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.yamlkönnen Sie die Dateienvalue.yamlin 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.
PodDisruptionBudgetService, und werden in im Namensraum genannt.DeploymentHorizontalPodAutoscaleristio-ingressgatewayistio-systemDiese Namen werden über die Feldernamein dervalues.yamlfestgelegt.ServiceAccount,RoleundRolebindingwerden inistio-ingressgateway-service-accountim Namensraumistio-systemgenannt. Diese Namen werden über das FeldserviceAccount.namein dervalues.yamlfestgelegt.
-
Testen Sie die Änderungen, die Sie vornehmen möchten, indem Sie sie zunächst in der gespeicherten
gateway-values.yamlvornehmen. 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.yamlbleibt 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
topologySpreadConstraintsverwenden.
- Wenn Sie erwägen, die Knotenaffinität zu verwenden, um Zonenaffinitäten zu erstellen, können Sie stattdessen auch
a. Überarbeiten Sie den Inhalt von
values.yamlnach 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-ingressgatewayoderistio-egressgatewayabzielen, führen Sie diesen Befehl nur mit der Option--dry-runaus. Führen Sie diesen Befehl nicht ohne die Option--dry-runaus.helm upgrade istio-ingressgateway istio/gateway --version 1.29.0 --install -n istio-system -f gateway-values.yaml --dry-run -
-
Wenn Sie mit den Änderungen zufrieden sind, verwenden Sie
kubectl edit, um dievalues.yamldes Gateways innerhalb der ConfigMap zu bearbeiten, von der es stammt.a. Öffnen Sie
gateway-values.yamlund rücken Sie die Kopie der Dateivalues.yamlum 4 Leerzeichen ein.b. Führen Sie den Befehl
kubectl editaus.kubectl edit cm -n ibm-operators managed-istio-ingressgateway-valuesc. Löschen Sie die Zeilen der vorherigen
values.yaml.d. Beginnen Sie die Taste
values.yamlmit einer mehrzeiligen Zeichenfolge. Beispiel:|e. Kopieren Sie Ihre mit 4 Leerzeichen eingerückte Datei
values.yamlin die Zeilen unter der Tastevalues.yaml.Beispiel:
data: values.yaml: | <Copy values.yaml here.> values.yaml.helm.result: | <Don't remove these previous Helm logs.> -
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/ -
Sehen Sie sich die Konfigurationsoptionen an.
a. Zeigen Sie die Werte an.
helm show values istio/gateway --version 1.29.5b. Ü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.
-
Führen Sie den Befehl
helm show valuesaus.helm show values "istio/gateway" --version "1.29.0" -
Erstellen Sie eine
values.yamlDatei für das Gateway. Das folgende Beispiel ist ein minimalistischesvalues.yamlfür ein Istioingressgatewaybasierend 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-criticalAlternativ können Sie auch die Adresse
values.yamldes Standard-Gateways als Ausgangspunkt verwenden.kubectl get cm -n ibm-operators managed-istio-ingressgateway-values -o json | jq -r .data.\"values.yaml\" -
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-ingressgatewayundistio-egressgateway, da das verwaltete Add-on Istio diese Versionsnamen verwendet. - Vermeiden Sie die Verwendung des Freigabenamens eines anderen der zusätzlichen Gateways.
-
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 -
Wenden Sie diese Ressourcen mit einer der folgenden Methoden an:
- Verwenden Sie den Befehl Helm
upgradeohne 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.
- Verwenden Sie den Befehl Helm
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.
-
Suchen Sie die Gateways. Wenn das Kabelmodem mit Helm installiert wurde, können Sie
helm get all RELEASE_NAME -n NAMESPACEals 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 -
Entfernen Sie die Gateways. Wenn das Kabelmodem mit Helm installiert wurde, können Sie
helm uninstall RELEASE_NAME -n NAMESPACEals Verknüpfung verwenden.Beispiel für das Entfernen von
istio-ingressgateway-public-2im Namensraumistio-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-foundBeispielausgabe:
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