IBM Cloud Docs
Angepasste Istio-Gateways bereitstellen

Angepasste Istio-Gateways bereitstellen

Sie können eine angepasste Ressource IstioOperator (IOP) erstellen, die Ihre eigenen Ingress- und Egress-Gateways für über Istio verwalteten App-Datenverkehr definiert.

Standardmäßig wird eine Bereitstellung istio-ingressgateway im Namensbereich istio-system Ihres Clusters erstellt. Diese Bereitstellung wird als öffentlicher Lastausgleichsservice mit einer extern zugänglichen IP-Adresse verfügbar gemacht. Anschließend können Sie Ports für Ihre über Istio verwalteten Apps in einer Ressource vom Typ Gateway definieren, durch die die Lastausgleichsfunktion istio-ingressgateway für den Empfang von eingehendem HTTP/TCP-Datenverkehr über diese Ports konfiguriert wird. Darüber hinaus wird standardmäßig eine Bereitstellung istio-egressgateway erstellt und als Lastausgleichsservice zur Verwaltung des abgehenden Datenverkehrs aus Ihren über Istio verwalteten Apps verfügbar gemacht.

Allerdings können Sie über diese Standardgateways hinaus zusätzliche Ingress- und Egress-Gateway-Bereitstellungen erstellen. Sie könnten zum Beispiel aus den folgenden Gründen weitere Gateways erstellen, die neben den Standardgateways oder anstelle der Standardgateways ausgeführt werden:

  • Zum Trennen von Datenflüssen zwischen bestimmten Workloads oder Namensbereichen
  • Zum Erstellen eines Ingress-Gateways für privaten Netzverkehr
  • Zum Anpassen eines Gateways zum Beispiel im Hinblick auf die Podknotenaffinität des Gateways, die Mindestanzahl von Replikaten und zonenspezifische Lastausgleichsfunktionen
  • Zum Steuern von Aktualisierungen der Gateway-Version unabhängig von den automatischen Versionsaktualisierungen, die für alle Komponenten des verwalteten Istio-Add-ons implementiert werden

Hinweise

Machen Sie sich vor Beginn mit den folgenden Hinweisen zur Verwendung von angepassten Gateways vertraut.

  • Über das verwaltete Istio-Add-on können keine angepassten Gateways, die Sie erstellen, verwaltet oder abgleichen werden. Sie sind für das Erstellen, Verwalten und Pflegen dieser Ressourcen verantwortlich.
  • Nachdem Sie Ihr angepasstes Gateway bereitgestellt haben, überprüfen Sie die Protokolle des Istio-Operator-Pods auf Syntaxfehler, indem Sie kubectl logs -n ibm-operators -l name=addon-istio-operator ausführen. Der Istio-Betreiber validiert und gleicht alle Änderungen an benutzerdefinierten IstioOperator (IOP) ab, die Sie vornehmen. Wenn Sie eine Abstimmungsschleife bemerken, die durch die info installer Reconciling IstioOperator Wiederholung in den Protokollen angezeigt wird, führen Sie die Schritte aus, um die Zeile in der Konfiguration zu finden, die den Schleifenfehler verursacht.
  • Stellen Sie zudem sicher, dass die Option istio-global-proxy-accessLogFile in der Konfigurationszuordnung managed-istio-custom auf "/dev/stdout" gesetzt ist. Envoy-Proxys geben Zugriffsinformationen in ihrer Standardausgabe aus, die Sie anzeigen können, indem Sie kubectl logs-Befehle für die Envoy-Container ausführen.

Angepasstes Ingress-Gateway für öffentlichen Datenverkehr erstellen

Verwenden Sie eine Ressource IstioOperator (IOP), um eine angepasste Ingress-Gateway-Bereitstellung und einen öffentlichen Lastausgleichsservice in einem Namensbereich custom-gateways zu erstellen.

  1. Installieren Sie das Istio-Add-on.

  2. Erstellen Sie einen Namensbereich für das angepasste Ingress-Gateway.

    kubectl create namespace custom-gateways
    
  3. Erstellen Sie eine YAML-Datei mit dem Namen custom-ingress-iop.yaml für eine Ressource IstioOperator (IOP). Um die angepassten Gateway-Pods zur Ausführung einer bestimmten Version von verwaltetem Istio zu zwingen, geben Sie die Version im Feld tag an. Weitere Informationen finden Sie unter Aktualisierungen und Versionen angepasster Gateways steuern.

    apiVersion: install.istio.io/v1alpha1
    kind: IstioOperator
    metadata:
      namespace: ibm-operators
      name: custom-ingressgateway-iop
    spec:
      profile: empty
      hub: icr.io/ext/istio
      # tag: 1.23.5
      components:
        ingressGateways:
          - name: custom-ingressgateway
            label:
              istio: custom-ingressgateway
            namespace: custom-gateways
            enabled: true
            k8s:
              serviceAnnotations:
                service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
    
  4. Erstellen Sie die IstioOperator (IOP)-Ressource in Ihrem Cluster. Der verwaltete Istio-Operator im Namensbereich ibm-operators verwendet die IOP-Ressource, um das Ingress-Gateway im Namensbereich custom-gateways mit einem öffentlichen Lastausgleichsservice bereitzustellen und zugänglich zu machen.

    kubectl apply -f ./custom-ingress-iop.yaml
    
  5. Überprüfen Sie, ob die Ingress-Gateway-Bereitstellung und der Service im Namensbereich custom-gateways erstellt wurden.

    kubectl get deploy,svc -n custom-gateways
    

    Beispielausgabe

    NAME                                    READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/custom-ingressgateway   1/1     1            1           4m53s
    
    NAME                            TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                                                                                                                                      AGE
    service/custom-ingressgateway   LoadBalancer   172.21.98.120   52.117.68.222   15020:32656/TCP,80:30576/TCP,443:32689/TCP,15029:31885/TCP,15030:30198/TCP,15031:32637/TCP,15032:30869/TCP,31400:30310/TCP,15443:31698/TCP   4m53s
    
  6. Notieren Sie in der Ausgabe für die Lastausgleichsfunktion service/custom-ingressgateway die IP-Adresse (für klassische Cluster) oder den Hostnamen in der Spalte EXTERNAL-IP.

Sie können jetzt den Namen dieser Lastausgleichsfunktion für das Ingress-Gateway (custom-ingressgateway) in einer Ressource vom Typ Gateway angeben, die den Port für Ihre über Istio verwaltete App definiert. Anschließend können Sie den Namen des Gateways (Gateway) in einer Ressource VirtualService angeben, die die Pfade für die Microservices in Ihrem Servicenetz definiert. Ein Beispiel für die Verwendung von Gateway und VirtualService in der Lastausgleichsfunktion Ihres angepassten Gateways finden Sie in der Beispielapp 'BookInfo'.

Beispiel 'BookInfo' einrichten

Verwenden Sie die BookInfo-Beispielanwendung für Istio, um den Zugriff auf Ihren benutzerdefinierten Ingress-Gateway-Lastenausgleich zu testen.

  1. Erstellen Sie einen bookinfo-Namespace und kennzeichnen Sie den Namespace für die automatische Seitenwageninjektion.
    kubectl create namespace bookinfo
    kubectl label namespace bookinfo istio-injection=enabled
    
  2. Stellen Sie die Beispielapp 'BookInfo' bereit. Ersetzen Sie <version> durch die Version (Hauptversion.Nebenversion), die von Ihrem verwalteten Istio-Add-on ausgeführt wird. Zum ermitteln der Version können Sie ibmcloud ks cluster addon ls -c <cluster_name_or_ID> ausführen.
    kubectl apply -n bookinfo -f https://raw.githubusercontent.com/istio/istio/release-<version>/samples/bookinfo/platform/kube/bookinfo.yaml
    
  3. Stellen Sie sicher, dass die BookInfo-Microservices und die entsprechenden Pods bereitgestellt wurden.
    kubectl get svc -n bookinfo
    
    NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP    PORT(S)          AGE
    details                   ClusterIP      172.21.19.104    <none>         9080/TCP         2m
    kubernetes                ClusterIP      172.21.0.1       <none>         443/TCP          1d
    productpage               ClusterIP      172.21.168.196   <none>         9080/TCP         2m
    ratings                   ClusterIP      172.21.11.131    <none>         9080/TCP         2m
    reviews                   ClusterIP      172.21.117.164   <none>         9080/TCP         2m
    
    kubectl get pods -n bookinfo
    
    NAME                                     READY     STATUS      RESTARTS   AGE
    details-v1-6865b9b99d-7v9h8              2/2       Running     0          2m
    productpage-v1-f8c8fb8-tbsz9             2/2       Running     0          2m
    ratings-v1-77f657f55d-png6j              2/2       Running     0          2m
    reviews-v1-6b7f6db5c5-fdmbq              2/2       Running     0          2m
    reviews-v2-7ff5966b99-zflkv              2/2       Running     0          2m
    reviews-v3-5df889bcff-nlmjp              2/2       Running     0          2m
    
  4. Erstellen Sie eine YAML-Datei mit dem Namen bookinfo-custom-gateway.yaml, um Gateway- und VirtualService-Ressourcen zu definieren. Beachten Sie, dass die Ressource vom Typ Gateway den Wert custom-ingressgateway für den Namen der Lastausgleichsfunktion des angepassten Ingress-Gateways angibt, die Sie zuvor erstellt haben, und dass die Ressource vom Typ VirtualService den Wert bookinfo-gateway für den Namen der Ressource vom Typ Gateway angibt.
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        istio: custom-ingressgateway
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: bookinfo
    spec:
      hosts:
      - "*"
      gateways:
      - bookinfo-gateway
      http:
      - match:
        - uri:
            exact: /productpage
        - uri:
            prefix: /static
        - uri:
            exact: /login
        - uri:
            exact: /logout
        - uri:
            prefix: /api/v1/products
        route:
        - destination:
            host: productpage
            port:
              number: 9080
    
  5. Erstellen Sie die Ressourcen der Typen Gateway und VirtualService in Ihrem Cluster.
    kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo
    
  6. Verwenden Sie die IP-Adresse (klassisch) oder den Hostnamen (VPC), die bzw. den Sie für die Lastausgleichsfunktion service/custom-ingressgateway im vorherigen Abschnitt gefunden haben, um die Produktseite für die App 'BookInfo' in einem Browser zu öffnen.
    http://<IP_OR_HOSTNAME>/productpage
    

Die Lastausgleichsfunktion Ihres angepassten Ingress-Gateways verwendet jetzt den Port in der Ressource vom Typ Gateway und die Microservicepfade in der Ressource vom Typ VirtualService, um Datenverkehr an die App 'BookInfo' weiterzuleiten. Als Nächstes können Sie optional einen DNS-Datensatz für die Lastausgleichsfunktion des angepassten Gateways erstellen.

BookInfo über die von IBM bereitgestellte Unterdomäne mit TLS zugänglich machen

Erstellen Sie eine von IBM bereitgestellte Unterdomäne, um die IP-Adresse (klassisch) oder den Hostnamen (VPC) der Lastausgleichsfunktion des angepassten Gateways mithilfe eines DNS-Datensatzes zu registrieren. Das TLS-Zertifikat, das für die Unterdomäne generiert wird, ermöglicht HTTPS-Verbindungen zur App 'BookInfo'.

  1. Registrieren Sie die IP-Adresse bzw. den Hostnamen der Lastausgleichsfunktion des angepassten Gateways, indem Sie eine DNS-Unterdomäne erstellen. Geben Sie den Namensbereich custom-gateway für die geheimen TLS-Schlüssel an.

    • Klassische Cluster
      ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> --secret-namespace custom-gateways
      
    • VPC-Cluster
      ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname> --secret-namespace custom-gateways
      
  2. Überprüfen Sie, ob die Unterdomäne erstellt wurde.

    ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
    

    Beispielausgabe für klassische Cluster

    Hostname                                                                                IP(s)              Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["168.1.1.1"]      None             created                   <certificate>
    

    Beispielausgabe für VPC-Cluster

    Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
    mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   <certificate>
    
  3. Rufen Sie den Namen des geheimen Schlüssels für Ihre Unterdomäne ab.

    kubectl get secret -n custom-gateways
    

    Beispielausgabe

    mycluster-af23f234rwr3asdfasdf-002   kubernetes.io/tls                     2      15m
    
  4. Ändern Sie in der Datei bookinfo-custom-gateway.yaml, die Sie im vorherigen Abschnitt erstellt haben, die Ressource bookinfo-gateway vom Typ Gateway, indem Sie einen HTTPS-Port 443 sowie einen TLS-Abschnitt hinzufügen, der den geheimen Schlüssel Ihrer Unterdomäne angibt.

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        istio: custom-ingressgateway
      servers:
      - port:
          number: 443
          name: https
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: mycluster-af23f234rwr3asdfasdf-002 # secret name
        hosts:
        - "*"
    ---
    ...
    
  5. Erstellen Sie die geänderte Ressource vom Typ Gateway in Ihrem Cluster.

    kubectl apply -f bookinfo-custom-gateway.yaml -n bookinfo
    
  6. Öffnen Sie die BookInfo-Produktseite in einem Web-Browser. Stellen Sie sicher, dass Sie für die in Schritt 2 gefundene Unterdomäne HTTPS verwenden.

    https://<subdomain>/productpage
    

Angepasstes Ingress-Gateway für privaten Datenverkehr erstellen

Wenn Sie eine angepasste Ingress-Gateway-Bereitstellung erstellen und mit einem privaten Lastausgleichsservice zugänglich machen wollen, führen Sie die Schritte unter Angepasstes Ingress-Gateway für öffentlichen Datenverkehr erstellen aus. Wenn Sie den IOP in Schritt 3 erstellen, geben Sie die Annotation service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: private anstelle von public an.

Beachten Sie die folgenden Hinweise:

  • Wenn Ihr klassischer Cluster nur mit privaten VLANs verbunden wird oder wenn für Ihren VPC-Cluster nur der private Cloud-Service-Endpunkt aktiviert ist, wird standardmäßig eine private Lastausgleichsfunktion erstellt, wenn Sie den IOP anwenden.
  • Nur für klassische Cluster: ibmcloud ks nlb-dns create classic kann nicht zum Erstellen eines DNS-Datensatzes und einer von IBM bereitgestellten Unterdomäne für die IP-Adresse der Lastausgleichsfunktion des angepassten Gateways verwendet werden.

Aktualisierungen und Versionen angepasster Gateways steuern

Sie können die verwaltete Istio-Version angepasster Ingress-Gateways manuell aktualisieren und steuern.

IBM Cloud hält alle Ihre Istio-Komponenten auf dem aktuellen Stand, indem Patchaktualisierungen auf die neueste Version von Istio, die von IBM Cloud Kubernetes Service unterstützt wird, durch automatische Rollouts zur Verfügung gestellt werden. Wenn beispielsweise die Patch-Version 1.23.5 veröffentlicht wird, werden alle Eingangs-Gateway-Pods automatisch auf diese neueste Patch-Version aktualisiert. Aktualisierungen auf Patchversionen werden durch die Strategie der rollierenden Aktualisierungen durchgeführt, um Ausfallzeiten für Ihre Apps zu vermeiden. Allerdings können Sie automatische Aktualisierungen von angepassten Gateway-Pods auch unterbinden, wenn Sie zum Beispiel auf potenzielle Regressionen mit der neuesten Patchversion testen wollen.

Zur Verwaltung von Aktualisierungen für Ihre Ingress-Gateways könnten Sie die folgende Rollout-Strategie verwenden:

  1. Erstellen Sie einen IOP für angepasstes Ingress-Gateway. Geben Sie im Feld tag eine Patchversion an, die mit der Steuerebenenversion übereinstimmt oder eine frühere Version ist. Sie können die Steuerebenenversion mithilfe des Befehls istioctl version ermitteln.
  2. Wenn eine neue Patchversion für das verwaltete Istio-Add-on freigegeben wird, bearbeiten Sie die YAML-Datei des IOP nur für ein einziges angepasstes Gateway, um die neueste Patchversion zu verwenden. Wenden Sie den IOP anschließend in Ihrem Cluster erneut an.
  3. Testen Sie nach der Aktualisierung der Pods des angepassten Gateways auf die neueste Patchversion alle Änderungen an dem angepassten Gateway.
  4. Wenn Sie mit den Änderungen zufrieden sind, ändern Sie die Konfigurationen für die übrigen angepassten Gateways, um diese auf die neueste Patchversion zu aktualisieren.

Setzen Sie den Tag nicht auf eine Version, die höher als die Steuerebenenversion Ihres Istio-Add-ons ist.

Aktualisieren Sie die Pods Ihrer angepassten Gateways möglich bald nach der Freigabe einer Version. Angepasste Gateways, die mit früheren Versionen ausgeführt werden, können Sicherheitslücken ausgesetzt sein.

Zusätzliche Gateway-Anpassungen

Angepasste Ingress-Gateways können mit zusätzlichen Anpassungen konfiguriert werden. Dazu gehören zum Beispiel die Bereitstellung der Lastausgleichsfunktion eines Gateways in einer bestimmten Zone, die Angabe der Mindestanzahl von Gateway-Podreplikaten, das Planen von angepassten Gateway-Pods auf Edge-Knoten, das Hinzufügen von Lebenszyklushooks preStop für ordnungsgemäße Beendigungen und die Angabe von Anti-Affinität und Workerknotenaffinität.

Schauen Sie sich Beispiele für diese zusätzlichen Anpassungen in der folgenden YAML-Datei für einen Istio-Operator (IOP) an.

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: ibm-operators
  name: custom-ingressgateway-iop
spec:
  profile: empty
  hub: icr.io/ext/istio
  # tag: 1.23.5 # Force the gateway to a specific managed Istio version
  components:
    ingressGateways:
      - name: custom-ingressgateway
        label:
          istio: custom-ingressgateway
        namespace: custom-gateways
        enabled: true
        k8s:
          serviceAnnotations:
            service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: public
            service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal12" # Deploy the load balancer to a specific zone in your cluster
          hpaSpec: # Specify the minimum number of pod replicas
            minReplicas: 2
          tolerations: # Schedule the custom gateway pods onto edge nodes
          - key: dedicated
            value: edge
          env:
          - name: TERMINATION_DRAIN_DURATION
            value: 30s
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
              - podAffinityTerm:
                  labelSelector:
                    matchExpressions:
                    - key: app
                      operator: In
                      values:
                      - istio-ingressgateway
                  topologyKey: kubernetes.io/hostname
                weight: 100
            nodeAffinity: # Example node affinities to control the zone or the edge
              preferredDuringSchedulingIgnoredDuringExecution: # Could be requiredDuringSchedulingIgnoredDuringExecution instead
                nodeSelectorTerms:
                - matchExpressions:
                  - key: ibm-cloud.kubernetes.io/zone
                    operator: In
                    values:
                    - "dal12" # Deploy the load balancer to a specific zone in your cluster
              preferredDuringSchedulingIgnoredDuringExecution:
              - preference:
                  matchExpressions:
                  - key: dedicated
                    operator: In
                    values:
                    - edge
                weight: 100

Angepasstes Egress-Gateway erstellen

In Version 1.8 und höher des verwalteten Istio-Add-ons können Sie angepasste Egress-Gateways erstellen. Egress-Gateways fungieren als Exitpunkt für den gesamten abgehenden Datenverkehr von Apps im Servicenetz an externe Ziele.

Sie können z. B. die folgende YAML-Datei für einen IOP in Ihrem Cluster anwenden, um ein angepasstes Egress-Gateway zu erstellen.

apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  namespace: ibm-operators
  name: custom-egressgateway-iop
spec:
  profile: empty
  hub: icr.io/ext/istio
  # tag: 1.23.5 # Force the Gateway to a specific version
  components:
    egressGateways:
      - name: custom-egressgateway
        label:
          istio: custom-egressgateway
        namespace: custom-gateways
        enabled: true

Weitere Informationen zur Konfiguration und Verwendung benutzerdefinierter Egress-Gateways finden Sie in der Istio-Open-Source-Dokumentation.

Standardgateways inaktivieren

Wenn Sie die istio-ingressgateway- oder istio-egressgateway-Standardbereitstellungen nach der Erstellung angepasster Gateways nicht benötigen, können Sie sie bei Bedarf inaktivieren.

Wenn Sie wünschen, dass Ihre Apps für Clients zugänglich sind, stellen Sie sicher, dass mindestens eine Gateway-Lastausgleichsfunktion aktiviert und zur Weiterleitung von Datenverkehr an Ihre Apps konfiguriert ist. Wenn Sie die standardmäßigen Gateway-Lastausgleichsfunktionen in allen Zonen inaktivieren, ist Ihre App nicht mehr zugänglich und kann nicht extern aufgerufen werden.

  1. Bearbeiten Sie die Ressource managed-istio-custom für die Konfigurationszuordnung (configmap).

    kubectl edit cm managed-istio-custom -n ibm-operators
    
  2. Inaktivieren Sie die Standard-Ingress-Gateways, indem Sie die Felder istio-ingressgateway-public-1|2|3-enabled auf "false" setzen.

    istio-ingressgateway-public-1-enabled: "false"
    istio-ingressgateway-public-2-enabled: "false"
    istio-ingressgateway-public-3-enabled: "false"
    
  3. Zum Inaktivieren des Standard-Egress-Gateways fügen Sie das Feld istio-egressgateway-public-1-enabled: "false" hinzu.

    istio-egressgateway-public-1-enabled: "false"
    
  4. Speichern und schließen Sie die Konfigurationsdatei.

  5. Überprüfen Sie, ob die Standard-Gateway-Services entfernt wurden.

    kubectl get svc -n istio-system