Apps im Servicenetz verwalten und zugänglich machen

Nach der Installation des Istio-Add-ons in Ihrem Cluster können Sie Ihre Apps im Istio-Servicenetz bereitstellen, und zwar durch Einrichten der Envoy-Proxy-Sidecar-Injektion und durch Zugänglichmachen Ihrer Apps mit einer Unterdomäne.

Erläuterungen zur Beispielapp 'BookInfo'

Die Beispielanwendung BookInfo für Istio enthält die grundlegende Demo-Konfiguration und die Standard-Zielregeln, sodass Sie die Funktionen von Istio sofort ausprobieren können.

Bei Istio ab Version 1.4 wird 'BookInfo' nicht als verwaltetes Add-on angeboten; es muss separat installiert werden. Informationen zur Installation von 'BookInfo' finden Sie in Beispielapp 'BookInfo' einrichten.

Die vier BookInfo-Microservices sind folgende:

  • productpage ruft die Microservices details und reviews auf, um die Seite mit Daten zu füllen.
  • details enthält Buchinformationen.
  • ratings enthält Informationen zur Bewertung eines Buchs, die eine Buchrezension begleiten.
  • reviews enthält Buchrezensionen und ruft den Microservice ratings auf. Der Microservice reviews hat mehrere Versionen:
    • v1 ruft den Microservice ratings nicht auf.
    • v2 ruft den Microservice ratings auf und zeigt eine Bewertung in Form von 1 bis 5 schwarzen Sternen an.
    • v3 ruft den Microservice ratings auf und zeigt eine Bewertung in Form von 1 bis 5 roten Sternen an.

Die YAML-Bereitstellungsdateien für jeden dieser Microservices werden so geändert, dass Envoy-Sidecar-Proxys zuvor als Container in die Pods der Microservices eingefügt (Injektion) werden, bevor sie bereitgestellt werden. Weitere Informationen zur manuellen Sidecar-Injektion finden Sie in der Dokumentation zu Istio. Die App 'BookInfo' wurde darüber hinaus bereits über eine öffentliche IP-Adresse durch ein Istio-Gateway zugänglich gemacht. Die App 'BookInfo' kann Ihnen zwar den Einstieg erleichtern, ist jedoch nicht für den Produktionseinsatz vorgesehen.

Beispielapp 'BookInfo' einrichten

  1. Installieren Sie 'BookInfo' in Ihrem Cluster. Laden Sie das aktuelle Istio-Paket für Ihr Betriebssystem herunter; dieses enthält die Konfigurationsdateien für die BookInfo-App.
    curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.29.5 sh -
    
  2. Navigieren Sie zum Istio-Paketverzeichnis.
    cd istio-1.29.5
    
  3. Versehen Sie den Namensbereich default für die automatische Sidecar-Injektion mit einer Bezeichnung.
    kubectl label namespace default istio-injection=enabled
    
  4. Stellen Sie die Anwendung, das Gateway sowie die Zielregeln für 'BookInfo' bereit.
    kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
    
  5. Stellen Sie sicher, dass die BookInfo-Microservices und die entsprechenden Pods bereitgestellt wurden.
    kubectl get svc
    kubectl get pods
    
    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
    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
    

Öffentlich auf BookInfo zugreifen

Rufen Sie die öffentliche Adresse für die Lastausgleichsfunktion istio-ingressgateway ab, von der BookInfo bereitgestellt wird.

Gateway-URL in klassischen Clustern erstellen

  1. Legen Sie den Istio-Ingress-Host fest.
    export INGRESS_IP=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    
  2. Legen Sie den Istio-Ingress-Port fest.
    export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
    
  3. Erstellen Sie die Umgebungsvariable GATEWAY_URL, die den Istio-Ingress-Host und -Port verwendet.
    export GATEWAY_URL=$INGRESS_IP:$INGRESS_PORT
    
  4. Führen Sie den Befehl 'curl' für die Variable GATEWAY_URL aus, um zu prüfen, ob die App BookInfo ausgeführt wird. Die Antwort 200 bedeutet, dass die App 'BookInfo' ordnungsgemäß mit Istio ausgeführt wird.
    curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
    
  5. Versuchen Sie mehrfach, die Seite zu aktualisieren. Verschiedene Versionen des Abschnitts mit den Rezensionen zeigen abwechselnd rote, schwarze oder gar keine Sterne an.

Gateway-URL in VPC-Clustern erstellen

  1. Erstellen Sie eine Umgebungsvariable namens GATEWAY_URL, die den Istio-Ingress-Hostnamen verwendet.
    export GATEWAY_URL=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
    
  2. Führen Sie den Befehl 'curl' für die Variable GATEWAY_URL aus, um zu prüfen, ob die App BookInfo ausgeführt wird. Die Antwort 200 bedeutet, dass die App 'BookInfo' ordnungsgemäß mit Istio ausgeführt wird.
    curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/productpage
    

Webseite für Bookinfo in einem Browser anzeigen

Führen Sie zum Anzeigen der App 'Bookinfo' in Ihrem Browser den für Ihr Betriebssystem geeigneten Befehl aus.

Mac OS oder Linux

open http://$GATEWAY_URL/productpage

Windows

start http://$GATEWAY_URL/productpage

Versuchen Sie mehrfach, die Seite zu aktualisieren. Verschiedene Versionen des Abschnitts mit den Rezensionen zeigen abwechselnd rote, schwarze oder gar keine Sterne an.

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

Wenn Sie das BookInfo-Add-on in Ihrem Cluster aktivieren, wird das Istio-Gateway bookinfo-gateway für Sie erstellt. Das Gateway verwendet den virtuellen Istio-Service und Zielrichtlinien, um eine Lastausgleichsfunktion mit dem Namen istio-ingressgateway zu konfigurieren, die die BookInfo-App öffentlich zugänglich macht. In den folgenden Schritten erstellen Sie eine Unterdomäne für die IP-Adresse in klassischen Clustern oder den Hostnamen in VPC-Clustern der Lastausgleichsfunktion istio-ingressgateway, über die Sie öffentlichen Zugriff auf BookInfo haben.

  1. Registrieren Sie die IP-Adresse für die Lastausgleichsfunktion istio-ingressgateway in klassischen Clustern oder den Hostnamen in VPC-Clustern, indem Sie eine DNS-Unterdomäne erstellen.
    • Klassisch
        ibmcloud ks nlb-dns create classic --ip $INGRESS_IP --cluster <cluster_name_or_id>
        ```
    * VPC:
    ```sh {: pre}
        ibmcloud ks nlb-dns create vpc-gen2 --lb-host $GATEWAY_URL --cluster <cluster_name_or_id>
        ```
    
  2. Überprüfen Sie, dass die Unterdomäne erstellt wurde, und kopieren Sie die Unterdomäne.
    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>

Öffnen Sie die BookInfo-Produktseite in einem Web-Browser. Da TLS nicht konfiguriert ist, müssen Sie sicherstellen, dass Sie HTTP verwenden.

http://<subdomain>/productpage

Versuchen Sie mehrfach, die Seite zu aktualisieren. Die Anforderungen für http://<subdomain>/productpage werden von der Lastausgleichsfunktion des Istio-Gateways empfangen. Die verschiedenen Versionen des Microservice reviews werden weiterhin zufällig zurückgegeben, weil das Istio-Gateway den virtuellen Service und die Ziel-Routing-Regeln für Microservices verwaltet.

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

Wenn Sie das BookInfo-Add-on in Ihrem Cluster aktivieren, wird das Istio-Gateway bookinfo-gateway für Sie erstellt. Das Gateway verwendet den virtuellen Istio-Service und Zielrichtlinien, um eine Lastausgleichsfunktion mit dem Namen istio-ingressgateway zu konfigurieren, die die BookInfo-App öffentlich zugänglich macht. In den folgenden Schritten erstellen Sie eine Unterdomäne für die IP-Adresse in klassischen Clustern oder den Hostnamen in VPC-Clustern der Lastausgleichsfunktion istio-ingressgateway, über die Sie öffentlichen Zugriff auf BookInfo haben. Sie verwenden das SSL-Zertifikat auch, um HTTPS-Verbindungen zur App 'BookInfo' zu aktivieren.

  1. Registrieren Sie die IP-Adresse für die Lastausgleichsfunktion istio-ingressgateway in klassischen Clustern oder den Hostnamen in VPC-Clustern, indem Sie eine DNS-Unterdomäne erstellen.

    • Klassisch
        ibmcloud ks nlb-dns create classic --ip $INGRESS_IP --secret-namespace istio-system --cluster <cluster_name_or_id>
        ```
    * VPC:
    ```sh {: pre}
        ibmcloud ks nlb-dns create vpc-gen2 --lb-host $GATEWAY_URL --secret-namespace istio-system --cluster <cluster_name_or_id>
        ```
    
  2. Überprüfen Sie, ob die Unterdomäne erstellt wurde, und notieren Sie den Namen Ihres geheimen SSL-Schlüssels im Feld SSL Cert Secret Name.

    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>
    

Bookinfo-Gateway für TLS-Terminierung konfigurieren

Führen Sie die folgenden Schritte aus, um TLS-Terminierung für das bookinfo-gateway einzurichten.

  1. Löschen Sie das vorhandene Gateway bookinfo-gateway, das nicht für die Handhabung von TLS-Verbindungen konfiguriert wurde.
    kubectl delete gateway bookinfo-gateway
    
  2. Erstellen Sie eine neue Konfigurationsdatei für bookinfo-gateway, die die TLS-Terminierung verwendet. Speichern Sie die folgende YAML-Datei als bookinfo-gateway.yaml. Ersetzen Sie <secret_name> durch den Namen des zuvor ermittelten geheimen SSL-Schlüssels.
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: bookinfo-gateway
    spec:
      selector:
        istio: ingressgateway
      servers:
      - port:
          number: 443
          name: https
          protocol: HTTPS
        tls:
          mode: SIMPLE
          credentialName: <secret_name>
        hosts:
        - "*"
    
  3. Erstellen Sie das neue Gateway bookinfo-gateway in Ihrem Cluster.
    kubectl apply -f bookinfo-gateway.yaml
    
  4. Ö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
    
  5. Versuchen Sie mehrfach, die Seite zu aktualisieren. Die Anforderungen für https://<subdomain>/productpage werden von der Lastausgleichsfunktion des Istio-Gateways empfangen. Die verschiedenen Versionen des Microservice reviews werden weiterhin zufällig zurückgegeben, weil das Istio-Gateway den virtuellen Service und die Ziel-Routing-Regeln für Microservices verwaltet.

Erläuterungen zu den Vorgängen

Das Beispiel 'BookInfo' demonstriert, wie drei der Datenverkehrsmanagementkomponenten von Istio zusammenarbeiten, um Ingress-Datenverkehr an die App zu leiten.

Gateway
Das Gatewaybookinfo-gateway bezeichnet einen Load Balancer, den Dienst istio-ingressgateway im Namespace istio-system, der als Einstiegspunkt für eingehenden Datenverkehr unter HTTP / TCP für BookInfo dient. Istio konfiguriert die Lastausgleichsfunktion so, dass sie für eingehende Anforderungen an über Istio verwaltete Apps über die Ports empfangsbereit ist, die in der Gateway-Konfigurationsdatei definiert sind. Führen Sie den folgenden Befehl aus, um die Konfigurationsdatei für das BookInfo-Gateway anzuzeigen.
kubectl get gateway bookinfo-gateway -o yaml
VirtualService
Das VirtualServicebookinfo definiert die Regeln, die steuern, wie Anfragen innerhalb des Service Mesh weitergeleitet werden, indem es Microservices als … definiert destinations. In dem virtuellen Service bookinfo wird der URI /productpage einer Anforderung an den Host productpage an Port 9080 geleitet. Auf diese Weise werden alle Anforderungen an die BookInfo-App zuerst an den Microservice productpage geleitet, der wiederum die anderen Microservices von BookInfo aufruft. Führen Sie den folgenden Befehl aus, um die Regel des virtuellen Service anzuzeigen.
kubectl get virtualservice bookinfo -o yaml
DestinationRule
Nachdem das Gateway die Anfrage gemäß der Regel für den virtuellen Dienst weitergeleitet hat, definieren die DestinationRulesreviews die Richtlinien details``ratings, die auf die Anfrage angewendet werden productpage, sobald diese einen Microservice erreicht. Wenn Sie zum Beispiel die Anzeige der BookInfo-Produktseite aktualisieren, sind die Änderungen, die angezeigt werden, das Ergebnis des Microservice productpage, der verschiedene Versionen (v1, v2 und v3) des Microservice reviews zufällig auswählt. Die Versionen werden zufällig ausgewählt, weil die Zielregel reviews den Untergruppen (subsets) oder den benannten Versionen des Microservice gleiche Gewichtung zuordnet. Diese Untergruppen werden von den Regeln des virtuellen Service verwendet, wenn Datenverkehr an bestimmte Versionen des Service weitergeleitet wird. Führen Sie den folgenden Befehl aus, um die Zielregeln anzuzeigen, die auf BookInfo angewendet werden.
kubectl describe destinationrules

Apps durch Einrichten einer Sidecar-Injektion in das Istio-Servicenetz einschließen

Sind Sie bereit, Ihre eigenen Apps mit Istio zu verwalten? Bevor Sie Ihre App bereitstellen, müssen Sie zunächst entscheiden, wie Sie die Envoy-Proxy-Sidecars in Ihre App-Pods einfügen wollen (Injektion).

In jedem App-Pod muss ein Envoy-Proxy-Sidecar ausgeführt werden, damit die Mikroservices zum Servicenetz gehören. Sie können sicherstellen, dass Sidecars in jeden App-Pod automatisch oder manuell eingefügt werden. Weitere Informationen zur Sidecar-Injektion finden Sie in der Dokumentation zu Istio.

Automatische Sidecar-Injektion aktivieren

Wenn die automatische Sidecar-Injektion aktiviert ist, ist ein Namensbereich für alle neuen Bereitstellungen empfangsbereit und ändert automatisch die Pod-Vorlagenspezifikation, sodass App-Pods mit Envoy-Proxy-Sidecar-Containern erstellt werden. Aktivieren Sie die automatische Sidecar-Injektion für einen Namensbereich, wenn Sie planen, mehrere Apps bereitzustellen, die Sie mit Istio in diesen Namensbereich integrieren wollen. Die automatische Sidecar-Injektion ist standardmäßig für keinen der Namensbereiche in dem verwalteten Istio-Add-on aktiviert.

Aktivieren Sie die automatische Sidecar-Injektion nicht für die Namensbereiche kube-system, ibm-system, oder ibm-operators.

Gehen Sie wie folgt vor, um die automatische Sidecar-Injektion für einen Namensbereich zu aktivieren:

  1. Rufen Sie den Namen der Namensbereiche ab, in denen Sie über Istio verwaltete Apps bereitstellen wollen.

    kubectl get namespaces
    
  2. Versehen Sie den Namensbereich mit der Bezeichnung (Label) istio-injection=enabled.

    kubectl label namespace <namespace> istio-injection=enabled
    
  3. Stellen Sie Apps in dem Namensbereich mit der Bezeichnung bereit oder stellen Sie Apps, die sich bereits in dem Namensbereich befinden, erneut bereit.

    kubectl apply <myapp>.yaml --namespace <namespace>
    
  4. Optional Löschen Sie zum erneuten Bereitstellen einer App in diesem Namensbereich den App-Pod, damit die Bereitstellung in Verbindung mit der Sidecar-Injektion erneut erfolgt.

    kubectl delete pod -l app=<myapp>
    
  5. Wenn Sie keinen Service erstellt haben, um Ihre App zugänglich zu machen, erstellen Sie einen Kubernetes-Service. Ihre App muss durch einen Kubernetes Service zugänglich gemacht werden, damit er als Microservice in das Istio-Servicenetz eingeschlossen werden kann. Stellen Sie sicher, dass Sie die Anforderungen der Istio für Pods und Dienste einhalten.

  6. Definieren Sie einen Service für die App.

    apiVersion: v1
    kind: Service
    metadata:
      name: myappservice
    spec:
      selector:
        <selector_key>: <selector_value> # Enter the label key `selector_key` and value `selector_value` pair that you want to use to target the pods where your app runs.
      ports:
      - protocol: TCP
        port: 8080 # The port that the service listens on
    
  7. Erstellen Sie den Service in Ihrem Cluster. Stellen Sie sicher, dass der Service in demselben Namensbereich wie die App bereitgestellt wird.

    kubectl apply -f myappservice.yaml -n <namespace>
    

Die App-Pods sind jetzt in Ihr Istio-Servicenetz integriert, da der Istio-Sidecar-Container parallel zu Ihrem App-Container ausgeführt wird.

Sidecars manuell einfügen

Wenn die automatische Sidecar-Injektion für einen Namensbereich nicht aktiviert werden soll, können Sie das Sidecar manuell in eine YAML-Bereitstellungsdatei einfügen. Fügen Sie Sidecars manuell ein, wenn Apps in Namensbereichen neben anderen Bereitstellungen ausgeführt werden, in die Sidecars nicht automatisch eingefügt werden sollen.

Aktivieren Sie die automatische Sidecar-Injektion nicht für die Namensbereiche kube-system, ibm-system, oder ibm-operators.

  1. Laden Sie den istioctl-Client herunter.
    curl -L https://istio.io/downloadIstio | sh -
    
  2. Navigieren Sie zum Istio-Paketverzeichnis.
    cd istio-1.29.5
    

Gehen Sie wie folgt vor, um Sidecars manuell in eine Bereitstellung einzufügen:

  1. Fügen Sie den Envoy-Sidecar durch Injektion in die YAML-Definition Ihrer App-Bereitstellung ein.

    istioctl kube-inject -f <myapp>.yaml | kubectl apply -f -
    
  2. Stellen Sie Ihre App bereit.

    kubectl apply <myapp>.yaml
    
  3. Wenn Sie keinen Service erstellt haben, um Ihre App zugänglich zu machen, erstellen Sie einen Kubernetes-Service. Ihre App muss durch einen Kubernetes Service zugänglich gemacht werden, damit er als Microservice in das Istio-Servicenetz eingeschlossen werden kann. Stellen Sie sicher, dass Sie die Anforderungen der Istio für Pods und Dienste einhalten.

  4. Definieren Sie einen Service für die App.

    apiVersion: v1
    kind: Service
    metadata:
      name: myappservice
    spec:
      selector:
        <selector_key>: <selector_value> # Enter the label key `selector_key` and value `selector_value` pair that you want to use to target the pods where your app runs.
      ports:
      - protocol: TCP
        port: 8080 # The port that the service listens on.
    
  5. Erstellen Sie den Service in Ihrem Cluster. Stellen Sie sicher, dass der Service in demselben Namensbereich wie die App bereitgestellt wird.

    kubectl apply -f myappservice.yaml -n <namespace>
    

Die App-Pods sind jetzt in Ihr Istio-Servicenetz integriert, da der Istio-Sidecar-Container parallel zu Ihrem App-Container ausgeführt wird.

Aktivieren oder Deaktivieren von öffentlichen Istio Load Balancern in addon-istio 1.23

Standardmäßig ist in Ihrem Cluster eine öffentliche Istio-Lastausgleichsfunktion - istio-ingressgateway - aktiviert, um eingehende Anforderungen aus dem Internet an Ihre von Istio verwalteten Apps zu laden. Sie können eine höhere Verfügbarkeit erreichen, indem Sie eine Istio-Lastausgleichsfunktion in jeder Zone Ihres Clusters aktivieren.

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

    kubectl edit cm managed-istio-custom -n ibm-operators
    
  2. Stellen Sie sicher, dass alle Ihre Clusterzonen in den Feldern istio-ingressgateway-zone enthalten sind.

    Beispiel für einen klassischen Mehrzonencluster in Dallas:

    istio-ingressgateway-zone-1: "dal10"
    istio-ingressgateway-zone-2: "dal12"
    istio-ingressgateway-zone-3: "dal13"
    
  3. Aktivieren oder inaktivieren Sie eine Istio-Lastausgleichsfunktion in jeder Zone, indem Sie für die Felder istio-ingressgateway-public-1|2|3-enabled jeweils den Wert "true" oder"false" festlegen.

    Wenn Sie wünschen, dass Ihre App für Clients zugänglich ist, stellen Sie sicher, dass mindestens eine Lastausgleichsfunktion aktiviert ist, oder erstellen Sie Lastausgleichsfunktionen für ein angepasstes Gateway. Wenn Sie alle Lastausgleichsfunktionen in allen Zonen inaktivieren, ist Ihre App nicht mehr zugänglich und kann nicht extern aufgerufen werden.

    Beispiel der Aktivierung eines öffentlichen Gateways in jeder Zone:

    istio-ingressgateway-public-1-enabled: "true"
    istio-ingressgateway-public-2-enabled: "true"
    istio-ingressgateway-public-3-enabled: "true"
    
  4. Speichern und schließen Sie die Konfigurationsdatei.

  5. Überprüfen Sie, ob die neuen istio-ingressgateway-Lastausgleichsservices erstellt werden.

    kubectl get svc -n istio-system
    

Wenn Sie von Istio verwaltete Apps unter Verwendung der istio-ingressgateway-Lastausgleichsservices verfügbar machen möchten, geben Sie den Selektor istio: ingressgateway in Ihrer Gateway-Ressource an. Weitere Informationen enthält der Abschnitt Über Istio verwaltete Apps zugänglich machen.

Istio-Ingress-Gateway über DNS zugänglich machen

Sie können Ihre über Istio verwalteten Apps öffentlich zugänglich machen, indem Sie einen DNS-Eintrag für die Lastausgleichsfunktion istio-ingressgateway erstellen und die Lastausgleichsfunktion so konfigurieren, dass der Datenverkehr an Ihre App weitergeleitet wird.

In den folgenden Schritten können Sie eine Unterdomäne einrichten, über die Ihre Benutzer auf Ihre App zugreifen können, indem Sie die folgenden Ressourcen erstellen:

  • Ein Gateway mit dem Namen my-gateway. Dieses Gateway fungiert als öffentlicher Einstiegspunkt für Ihre Apps und verwendet den vorhandenen Lastausgleichsservice istio-ingressgateway, um Ihre App zugänglich zu machen. Das Gateway kann optional für die TLS-Terminierung konfiguriert werden.
  • Einen virtuellen Service mit dem Namen my-virtual-service. my-gateway verwendet die Regeln, die Sie in my-virtual-service definieren, um Datenverkehr an Ihre App weiterzuleiten.
  • Eine Unterdomäne für die Lastausgleichsfunktion istio-ingressgateway. Alle Benutzeranforderungen an die Unterdomäne werden entsprechend Ihren my-virtual-service-Routing-Regeln an Ihre App weitergeleitet.

Istio-Ingress-Gateway über DNS ohne TLS-Terminierung zugänglich machen

  1. Installieren Sie das verwaltete Add-on istio in einem Cluster.
  2. Installieren Sie die istioctl-CLI.
  3. Richten Sie die Sidecar-Injektion für Ihre App-Mikroservices ein, stellen Sie die App-Mikroservices in einem Namensbereich bereit und erstellen Sie Kubernetes-Services für die App-Mikroservices so, dass sie in das Istio-Servicenetz eingebunden sind.

Gehen Sie wie folgt vor, um Apps öffentlich zugänglich zu machen:

  1. Erstellen Sie ein Gateway, das den öffentlichen istio-ingressgateway-Lastausgleichsservice verwendet, um Port 80 für HTTP zugänglich zu machen. Ersetzen Sie <namespace> durch den Namensbereich, in dem Ihre von Istio verwalteten Mikroservices bereitgestellt sind. Weitere Informationen zu den YAML-Komponenten des Gateways finden Sie in der Referenzdokumentation zu Istio.

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: my-gateway
    spec:
      selector:
        app: ingressgateway
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
    
  2. Wenden Sie das Gateway in dem Namensbereich an, in dem Ihre über Istio verwalteten Microservices bereitgestellt wurden.

    kubectl apply -f my-gateway.yaml -n <namespace>
    
  3. Erstellen Sie einen virtuellen Service, der das Gateway my-gateway verwendet und die Routing-Regeln für Ihre App-Microservices definiert. Wenn Ihre Microservices an einem anderen Port als 80 empfangsbereit sind, fügen Sie diesen Port hinzu. Weitere Informationen zu den YAML-Komponenten für virtuelle Dienste finden Sie in der Referenzdokumentation Istio.

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: my-virtual-service
      namespace: <namespace> # The namespace where your Istio-managed microservices are deployed.
    spec:
      gateways:
      - my-gateway # `my-gateway` is specified so that the gateway can apply these virtual service routing rules to the `istio-ingressgateway` load balancer.
      hosts:
      - '*'
      http:
      - match:
        - uri:
            exact: /<service_path> # Replace `service_path` with the path that your entrypoint microservice listens on. For example, in the BookInfo app, the path is defined as `/productpage`.
        route:
        - destination:
            host: <service_name> # Replace `service_name` with the name of your entrypoint microservice. For example, in the BookInfo app, `productpage` served as the entrypoint microservice that called the other app microservices.
            port:
              number: 80 # If your microservice listens on a different port, replace `80` with the port.
    
  4. Wenden Sie die Regeln des virtuellen Service in dem Namensbereich an, in dem Ihr über Istio verwalteter Microservice bereitgestellt wurde.

    kubectl apply -f my-virtual-service.yaml -n <namespace>
    
  5. Rufen Sie die Adresse EXTERNAL-IP (klassische Cluster) oder den Hostnamen (VPC-Cluster) für die öffentliche Lastausgleichsfunktion istio-ingressgateway ab. Wenn Sie eine Istio-Lastausgleichsfunktion in jeder Zone Ihres Clusters aktiviert haben, rufen Sie die IP-Adresse oder den Hostnamen des Lastausgleichsservice in jeder Zone ab.

    kubectl get svc -n istio-system
    
    # Example output for classic clusters
    istio-ingressgateway     LoadBalancer   172.21.XXX.XXX   169.1.1.1       80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP  22m
    
    # Example output for VPC clusters:
    istio-ingressgateway     LoadBalancer   172.21.XXX.XXX   1234abcd-us-south.lb.appdomain.cloud       80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP  22m
    
  6. Registrieren Sie die IP-Adresse oder den Hostnamen der Lastausgleichsfunktion, indem Sie eine DNS-Unterdomäne erstellen. Weitere Informationen zur Registrierung von DNS-Subdomains in IBM Cloud Kubernetes Service finden Sie unter Classic: Registrierung einer NLB-Subdomain oder Informationen zur Registrierung eines VPC-Loadbalancer-Hostnamens mit einer DNS-Subdomain für einen VPC ALB oder VPC NLB.

    ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> [--ip <LB_zone2_IP> ...]
    

    Beispielbefehl für VPC-Cluster.

    ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname>
    
  7. Überprüfen Sie, ob die Unterdomäne erstellt wurde. Kopieren Sie in der Ausgabe den Namen Ihres geheimen SSL-Schlüssel im Feld SSL Cert Secret Name.

    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>
    
  8. Überprüfen Sie, dass der Datenverkehr an Ihre über Istio verwalteten Microservices weitergeleitet wird, indem Sie die URL des App-Microservice eingeben.

    http://<host_name>/<service_path>
    

Suchen Sie nach einer differenzierteren Kontrolle über das Routing? Um Regeln zu erstellen, die angewendet werden, nachdem der Load Balancer den Datenverkehr an die einzelnen Microservices weitergeleitet hat – beispielsweise Regeln für die Weiterleitung des Datenverkehrs an verschiedene Versionen eines Microservices –, können Sie diese erstellen und anwenden DestinationRules.

Sie müssen ein Debugging für Ingress- oder Egress-Konfigurationen durchführen? Stellen Sie 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. Wenn Sie feststellen, dass der Pod ibm-cloud-provider-ip für ein Gateway im Zustand pending blockiert ist, lesen Sie die Informationen in diesem Fehlerbehebungsthema.

Istio-Ingress-Gateway über DNS mit TLS-Terminierung zugänglich machen

  1. Installieren Sie das verwaltete Add-on istio in einem Cluster.
  2. Installieren Sie die istioctl-CLI.
  3. Richten Sie die Sidecar-Injektion für Ihre App-Mikroservices ein, stellen Sie die App-Mikroservices in einem Namensbereich bereit und erstellen Sie Kubernetes-Services für die App-Mikroservices so, dass sie in das Istio-Servicenetz eingebunden sind.

Gehen Sie wie folgt vor, um Apps öffentlich zugänglich zu machen:

  1. Registrieren Sie die IP-Adresse oder den Hostnamen der Lastausgleichsfunktion, indem Sie eine DNS-Unterdomäne erstellen. Weitere Informationen zur Registrierung von DNS-Unterdomänen in IBM Cloud Kubernetes Service finden Sie in Klassisch: NLB-Unterdomäne registrieren oder Hostnamen einer VPC-Lastausgleichsfunktion mit einer DNS-Unterdomäne registrieren.

    • Klassische Cluster:
        ibmcloud ks nlb-dns create classic --cluster <cluster_name_or_id> --ip <LB_IP> [--ip <LB_zone2_IP> ...]
        ```
    * VPC-Cluster:
    ```sh {: pre}
        ibmcloud ks nlb-dns create vpc-gen2 -c <cluster_name_or_ID> --lb-host <LB_hostname>
        ```
    
  2. Überprüfen Sie, ob die Unterdomäne erstellt wurde. Kopieren Sie in der Ausgabe den Namen Ihres geheimen SSL-Schlüssel im Feld SSL Cert Secret Name.

    ibmcloud ks nlb-dns ls --cluster <cluster_name_or_id>
    
    # Example output for classic clusters:
    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>
    
    # Example output for VPC clusters:
    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. Erstellen Sie ein Gateway, das den öffentlichen istio-ingressgateway-Lastausgleichsservice verwendet, um Port 80 für HTTP zugänglich zu machen. Ersetzen Sie <namespace> durch den Namensbereich, in dem Ihre von Istio verwalteten Mikroservices bereitgestellt sind. Weitere Informationen zu den YAML-Komponenten des Gateways finden Sie in der Referenzdokumentation zu Istio.

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: my-gateway
      namespace: <namespace>
    spec:
      selector:
        istio: ingressgateway
      servers:
        - port:
            name: https
            protocol: HTTPS
            number: 443
        tls:
          mode: SIMPLE
          serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
          privateKey: /etc/istio/ingressgateway-certs/tls.key
        hosts:
        - "*"
    
  4. Wenden Sie das Gateway in dem Namensbereich an, in dem Ihre über Istio verwalteten Microservices bereitgestellt wurden.

    kubectl apply -f my-gateway.yaml -n <namespace>
    
  5. Erstellen Sie einen virtuellen Service, der das Gateway my-gateway verwendet und die Routing-Regeln für Ihre App-Microservices definiert. Weitere Informationen zu YAML-Komponenten für virtuelle Dienste finden Sie in der Referenzdokumentation zu Istio.

    apiVersion: networking.istio.io/v1beta1
    kind: VirtualService
    metadata:
      name: my-virtual-service
      namespace: <namespace> # The namespace where your Istio-managed microservices are deployed.
    spec:
      gateways:
      - my-gateway # `my-gateway` is specified so that the gateway can apply these virtual service routing rules to the `istio-ingressgateway` load balancer.
      hosts:
      - '*'
      http:
      - match:
        - uri:
            exact: /<service_path> # Replace `service_path` with the path that your entrypoint microservice listens on. For example, in the BookInfo app, the path is defined as `/productpage`.
        route:
        - destination:
            host: <service_name> # The name of your entrypoint microservice. For example, in the BookInfo app, `productpage` served as the entrypoint microservice that called the other app microservices.
            port:
              number: 443 # If your microservice listens on a different port, replace 443 with the port.
    
  6. Wenden Sie die Regeln des virtuellen Service in dem Namensbereich an, in dem Ihr über Istio verwalteter Microservice bereitgestellt wurde.

    kubectl apply -f my-virtual-service.yaml -n <namespace>
    
  7. Rufen Sie die Adresse EXTERNAL-IP (klassische Cluster) oder den Hostnamen (VPC-Cluster) für die öffentliche Lastausgleichsfunktion istio-ingressgateway ab. Wenn Sie eine Istio-Lastausgleichsfunktion in jeder Zone Ihres Clusters aktiviert haben, rufen Sie die IP-Adresse oder den Hostnamen des Lastausgleichsservice in jeder Zone ab.

    kubectl get svc -n istio-system
    
    # Example output for classic clusters:
    istio-ingressgateway     LoadBalancer   172.21.XXX.XXX   169.1.1.1       80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP  22m
    
    # Example output for VPC clusters:
    istio-ingressgateway     LoadBalancer   172.21.XXX.XXX   1234abcd-us-south.lb.appdomain.cloud       80:31380/TCP,443:31390/TCP,31400:31400/TCP,5011:31323/TCP,8060:32483/TCP,853:32628/TCP,15030:31601/TCP,15031:31915/TCP  22m
    
  8. Überprüfen Sie, dass der Datenverkehr an Ihre über Istio verwalteten Microservices weitergeleitet wird, indem Sie die URL des App-Microservice eingeben.

    https://<host_name>/<service_path>
    

Die Zertifikate für den geheimen NLB-DNS-Hostschlüssel laufen alle 90 Tage ab. Der geheime Schlüssel im Standardnamensbereich wird von IBM Cloud Kubernetes Service automatisch 37 Tage vor Ablauf verlängert, jedoch müssen Sie den geheimen Schlüssel nach jeder Verlängerung manuell in den Namensbereich istio-system kopieren. Verwenden Sie Scripts, um diesen Prozess zu automatisieren.

Suchen Sie nach einer differenzierteren Kontrolle über das Routing? Um Regeln zu erstellen, die angewendet werden, nachdem der Load Balancer den Datenverkehr an die einzelnen Microservices weitergeleitet hat – beispielsweise Regeln für die Weiterleitung des Datenverkehrs an verschiedene Versionen eines Microservices –, können Sie diese erstellen und anwenden DestinationRules.

Sie müssen ein Debugging für Ingress- oder Egress-Konfigurationen durchführen? Stellen Sie 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. Wenn Sie feststellen, dass der Pod ibm-cloud-provider-ip für ein Gateway im Zustand pending blockiert ist, lesen Sie die Informationen in diesem Fehlerbehebungsthema.

Datenverkehr im Cluster durch Aktivieren von mTLS schützen

Aktivieren Sie die Verschlüsselung für Workloads in einem Namensbereich, um eine gegenseitige TLS-Funktionalität (mTLS) innerhalb des Clusters einzurichten. Datenverkehr, der von Envoy zwischen Pods im Cluster weitergeleitet wird, wird mit TLS verschlüsselt. Das Zertifikatsmanagement für mTLS wird von Istio übernommen. Weitere Informationen finden Sie in der Dokumentation Istio mutual TLS.

  1. Erstellen Sie eine Authentifizierungsrichtliniendatei namens default.yaml. Diese Richtlinie ist namensbereichsorientiert und konfiguriert Workloads im Servicenetz so, dass sie nur verschlüsselte Anforderungen mit TLS akzeptieren. Beachten Sie, dass keine Spezifikationen für Ziele (targets) eingeschlossen werden, weil die Richtlinie für alle Services im Netz in diesem Namensbereich gilt.
    apiVersion: "security.istio.io/v1beta1"
    kind: "PeerAuthentication"
    metadata:
      name: "default"
    spec:
      mtls:
        mode: STRICT
    
  2. Wenden Sie die Authentifizierungsrichtlinie auf einen Namensbereich an.
    kubectl apply -f default.yaml -n NAMESPACE
    
  3. Erstellen Sie eine Zielregeldatei mit dem Namen destination-mtls.yaml. Diese Richtlinie konfiguriert Servicenetzworkloads in einem Namensbereich, um Datenverkehr unter Verwendung von TLS zu senden. Beachten Sie, dass die Platzhalterangabe host: *.local diese Zielregel auf alle Services im Servicenetz anwendet.
    apiVersion: "networking.istio.io/v1beta1"
    kind: "DestinationRule"
    metadata:
      name: "destination-mtls"
    spec:
      host: "*.local"
      trafficPolicy:
        tls:
          mode: ISTIO_MUTUAL
    
  4. Wenden Sie die Zielregel an.
    kubectl apply -f destination-mtls.yaml -n NAMESPACE
    
  5. Wenn Sie mTLS für Service-Mesh-Workloads in anderen Namespaces aktivieren möchten, wiederholen Sie diese Schritte in jedem Namespace.

Zielregeln werden auch für andere als Authentifizierungszwecke verwendet, wie zum Beispiel zur Weiterleitung von Datenverkehr an verschiedene Versionen eines Service. Jede Zielregel, die Sie für einen Service erstellen, muss außerdem denselben TLS-Block enthalten, der auf mode: ISTIO_MUTUAL gesetzt ist. Dieser Block verhindert, dass die Regel die netzweiten mTLS-Einstellungen überschreibt, die Sie in diesem Abschnitt konfiguriert haben.