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:
productpageruft die Microservicesdetailsundreviewsauf, um die Seite mit Daten zu füllen.detailsenthält Buchinformationen.ratingsenthält Informationen zur Bewertung eines Buchs, die eine Buchrezension begleiten.reviewsenthält Buchrezensionen und ruft den Microserviceratingsauf. Der Microservicereviewshat mehrere Versionen:v1ruft den Microserviceratingsnicht auf.v2ruft den Microserviceratingsauf und zeigt eine Bewertung in Form von 1 bis 5 schwarzen Sternen an.v3ruft den Microserviceratingsauf 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
- 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 - - Navigieren Sie zum Istio-Paketverzeichnis.
cd istio-1.29.5 - Versehen Sie den Namensbereich
defaultfür die automatische Sidecar-Injektion mit einer Bezeichnung.kubectl label namespace default istio-injection=enabled - 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 - Stellen Sie sicher, dass die BookInfo-Microservices und die entsprechenden Pods bereitgestellt wurden.
kubectl get svc kubectl get podsNAME 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
- 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}') - 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}') - Erstellen Sie die Umgebungsvariable
GATEWAY_URL, die den Istio-Ingress-Host und -Port verwendet.export GATEWAY_URL=$INGRESS_IP:$INGRESS_PORT - Führen Sie den Befehl 'curl' für die Variable
GATEWAY_URLaus, um zu prüfen, ob die App BookInfo ausgeführt wird. Die Antwort200bedeutet, dass die App 'BookInfo' ordnungsgemäß mit Istio ausgeführt wird.curl -o /dev/null -s -w "%{http_code}\n" 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.
Gateway-URL in VPC-Clustern erstellen
- 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}') - Führen Sie den Befehl 'curl' für die Variable
GATEWAY_URLaus, um zu prüfen, ob die App BookInfo ausgeführt wird. Die Antwort200bedeutet, 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.
- Registrieren Sie die IP-Adresse für die Lastausgleichsfunktion
istio-ingressgatewayin 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> ``` - Ü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.
-
Registrieren Sie die IP-Adresse für die Lastausgleichsfunktion
istio-ingressgatewayin 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> ``` -
Ü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.
- Löschen Sie das vorhandene Gateway
bookinfo-gateway, das nicht für die Handhabung von TLS-Verbindungen konfiguriert wurde.kubectl delete gateway bookinfo-gateway - Erstellen Sie eine neue Konfigurationsdatei für
bookinfo-gateway, die die TLS-Terminierung verwendet. Speichern Sie die folgende YAML-Datei alsbookinfo-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: - "*" - Erstellen Sie das neue Gateway
bookinfo-gatewayin Ihrem Cluster.kubectl apply -f bookinfo-gateway.yaml - Ö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 - Versuchen Sie mehrfach, die Seite zu aktualisieren. Die Anforderungen für
https://<subdomain>/productpagewerden von der Lastausgleichsfunktion des Istio-Gateways empfangen. Die verschiedenen Versionen des Microservicereviewswerden 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 Gateway
bookinfo-gatewaybezeichnet einen Load Balancer, den Dienstistio-ingressgatewayim Namespaceistio-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 VirtualService
bookinfodefiniert die Regeln, die steuern, wie Anfragen innerhalb des Service Mesh weitergeleitet werden, indem es Microservices als … definiertdestinations. In dem virtuellen Servicebookinfowird der URI/productpageeiner Anforderung an den Hostproductpagean Port9080geleitet. Auf diese Weise werden alle Anforderungen an die BookInfo-App zuerst an den Microserviceproductpagegeleitet, 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 DestinationRules
reviewsdie Richtliniendetails``ratings, die auf die Anfrage angewendet werdenproductpage, sobald diese einen Microservice erreicht. Wenn Sie zum Beispiel die Anzeige der BookInfo-Produktseite aktualisieren, sind die Änderungen, die angezeigt werden, das Ergebnis des Microserviceproductpage, der verschiedene Versionen (v1,v2undv3) des Microservicereviewszufällig auswählt. Die Versionen werden zufällig ausgewählt, weil die Zielregelreviewsden 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:
-
Rufen Sie den Namen der Namensbereiche ab, in denen Sie über Istio verwaltete Apps bereitstellen wollen.
kubectl get namespaces -
Versehen Sie den Namensbereich mit der Bezeichnung (Label)
istio-injection=enabled.kubectl label namespace <namespace> istio-injection=enabled -
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> -
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> -
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.
-
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 -
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.
- Laden Sie den
istioctl-Client herunter.curl -L https://istio.io/downloadIstio | sh - - Navigieren Sie zum Istio-Paketverzeichnis.
cd istio-1.29.5
Gehen Sie wie folgt vor, um Sidecars manuell in eine Bereitstellung einzufügen:
-
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 - -
Stellen Sie Ihre App bereit.
kubectl apply <myapp>.yaml -
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.
-
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. -
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.
-
Bearbeiten Sie die Ressource
managed-istio-customfür die Konfigurationszuordnung (configmap).kubectl edit cm managed-istio-custom -n ibm-operators -
Stellen Sie sicher, dass alle Ihre Clusterzonen in den Feldern
istio-ingressgateway-zoneenthalten sind.Beispiel für einen klassischen Mehrzonencluster in Dallas:
istio-ingressgateway-zone-1: "dal10" istio-ingressgateway-zone-2: "dal12" istio-ingressgateway-zone-3: "dal13" -
Aktivieren oder inaktivieren Sie eine Istio-Lastausgleichsfunktion in jeder Zone, indem Sie für die Felder
istio-ingressgateway-public-1|2|3-enabledjeweils 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" -
Speichern und schließen Sie die Konfigurationsdatei.
-
Ü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 Lastausgleichsserviceistio-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-gatewayverwendet die Regeln, die Sie inmy-virtual-servicedefinieren, um Datenverkehr an Ihre App weiterzuleiten. - Eine Unterdomäne für die Lastausgleichsfunktion
istio-ingressgateway. Alle Benutzeranforderungen an die Unterdomäne werden entsprechend Ihrenmy-virtual-service-Routing-Regeln an Ihre App weitergeleitet.
Istio-Ingress-Gateway über DNS ohne TLS-Terminierung zugänglich machen
- Installieren Sie das verwaltete Add-on
istioin einem Cluster. - Installieren Sie die
istioctl-CLI. - 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:
-
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: - "*" -
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> -
Erstellen Sie einen virtuellen Service, der das Gateway
my-gatewayverwendet und die Routing-Regeln für Ihre App-Microservices definiert. Wenn Ihre Microservices an einem anderen Port als80empfangsbereit 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. -
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> -
Rufen Sie die Adresse EXTERNAL-IP (klassische Cluster) oder den Hostnamen (VPC-Cluster) für die öffentliche Lastausgleichsfunktion
istio-ingressgatewayab. 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 -
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> -
Ü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> -
Ü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
- Installieren Sie das verwaltete Add-on
istioin einem Cluster. - Installieren Sie die
istioctl-CLI. - 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:
-
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> ``` -
Ü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> -
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: - "*" -
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> -
Erstellen Sie einen virtuellen Service, der das Gateway
my-gatewayverwendet 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. -
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> -
Rufen Sie die Adresse EXTERNAL-IP (klassische Cluster) oder den Hostnamen (VPC-Cluster) für die öffentliche Lastausgleichsfunktion
istio-ingressgatewayab. 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 -
Ü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.
- 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 - Wenden Sie die Authentifizierungsrichtlinie auf einen Namensbereich an.
kubectl apply -f default.yaml -n NAMESPACE - 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 Platzhalterangabehost: *.localdiese 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 - Wenden Sie die Zielregel an.
kubectl apply -f destination-mtls.yaml -n NAMESPACE - 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.