Istio mit Google Compute Engine verwenden

Istio ist ein Open-Source-Framework zum Verbinden, Überwachen und Absichern von Mikrodiensten. Damit können Sie ohne Änderungen am Code ein Netzwerk bzw. Mesh-Netzwerk aus bereitgestellten Diensten erstellen – einschließlich Lastenausgleich, Dienst-zu-Dienst-Authentifizierung, Monitoring und mehr. Wenn Sie Diensten Unterstützung für Istio hinzufügen möchten, stellen Sie für jeden Pod einer Anwendung einen speziellen Envoy-Sidecar-Proxy bereit. Der Envoy-Proxy fängt die gesamte Netzwerkkommunikation zwischen Mikrodiensten ab und wird über die Funktionen der Steuerungsebene von Istio konfiguriert und verwaltet.

Derzeit kann die Steuerungsebene von Istio nur in Kubernetes-Implementierungen installiert werden, z. B. Google Kubernetes Engine. Mithilfe der Erweiterungsfunktion für Mesh-Netzwerke können Sie dem Mesh-Netzwerk jedoch auch Dienste hinzufügen, die auf anderen Plattformen (einschließlich Compute Engine-VMs) ausgeführt werden. Auf diese Weise können Sie die Kubernetes- und VM-Dienste über ein einziges Mesh-Netzwerk verwalten. In dieser Anleitung erfahren Sie, wie Sie Istio so konfigurieren, dass das Framework die Mesh-Erweiterungsfunktion verwendet. Außerdem erfahren Sie, wie Sie Compute Engine-VMs so konfigurieren, dass sie einem Istio-Mesh-Netzwerk hinzugefügt werden können. Dabei wird davon ausgegangen, dass Sie Istio bereits in Kubernetes Engine installiert haben.

Weitere Informationen zu Istio und seiner Funktionsweise erhalten Sie auf der Website unter istio.io. Im Abschnitt Funktionsweise erfahren Sie, wie die Konfiguration der Mesh-Netzwerkerweiterung in dieser Anleitung durchgeführt wird. Dies ist allerdings für das Durcharbeiten dieser Anleitung nicht erforderlich.

Zielsetzungen

  • Vorhandene Istio-Installation in Kubernetes Engine aktualisieren, um die Erweiterungsfunktion für Mesh-Netzwerke nutzen zu können
  • Compute Engine-VMs so konfigurieren, dass sie einem Istio-Mesh-Netzwerk beitreten können
  • Dienst eines Istio-Mesh-Netzwerks auf einer Compute Engine-VM ausführen

Kosten

In dieser Anleitung werden kostenpflichtige Komponenten der Cloud Platform verwendet, einschließlich Google Compute Engine.

Neuen Nutzern der Cloud Platform steht möglicherweise eine kostenlose Testversion zur Verfügung.

Vorbereitung

  • Istio muss bereits in Kubernetes Engine installiert sein. Weitere Informationen zur Installation, zur Einrichtung und zu den Anforderungen finden Sie im Artikel zum Thema Istio in Google Kubernetes Engine installieren.
  • Die Beispielanwendung "BookInfo" muss installiert sein und ausgeführt werden, wie im Artikel zum Thema Istio in Google Kubernetes Engine installieren beschrieben. Außerdem muss istioctl in PATH enthalten sein.
  • Ihr Kontingent für IP-Adressen und Back-End-Dienste muss zum Ausführen von vier internen Lastenausgleichsmodulen (jeweils eine IP-Adresse pro Lastenausgleichsmodul) ausreichen. Außerdem muss es zum Ausführen des BookInfo-Dienstes für eingehende Verbindungen (ein Lastenausgleichsmodul und eine IP-Adresse) ausreichen, den Sie bereits aus der vorherigen Anleitung kennen.
  • Prüfen Sie, ob Ihr kubectl-Kontext auf das Istio-Cluster eingestellt ist.

    kubectl config current-context              # Display the current-context
    kubectl config use-context [CLUSTER_NAME]   # set the default context to [CLUSTER_NAME]
    

Standards für das gcloud-Befehlszeilentool festlegen

Wenn Sie die Projekt-ID und die Optionen für die Compute Engine-Zone nicht immer wieder neu in das gcloud-Befehlszeilentool eingeben möchten, können Sie Standardwerte festlegen:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone [COMPUTE_ENGINE_ZONE]

Mesh-Netzwerk auf Erweiterung vorbereiten

Wenn Sie Dienste Kubernetes-fremder Plattformen zu einem Istio-Mesh-Netzwerk hinzufügen möchten, müssen Sie zuerst Ihre Istio-Installation konfigurieren und Konfigurationsdateien generieren, die von Compute Engine-VMs verwendet werden können. Der Istio-Download enthält zu diesem Zweck bereits ein Skript, das sich unter /install/tools/setupMeshEx.sh befindet. Führen Sie diese Schritte auf der Maschine aus, auf der sich auch das Istio-Installationsverzeichnis und Ihre Clusteranmeldedaten befinden: Dies ist die sogenannte Cluster-Administratormaschine.

  1. Verwenden Sie die vorhandene Bereitstellung mesh-expansion, um interne Load-Balancer für Pilot, Mixer, die Zertifizierungsstelle von Istio und den Kubernetes-DNS-Server einzurichten. Dadurch wird sichergestellt, dass die VMs auf diese Dienste zugreifen können.

    kubectl apply -f install/kubernetes/mesh-expansion.yaml
    
  2. Prüfen Sie, ob die Dienste ausgeführt werden und alle internen Lastenausgleichsmodule EXTERNAL-IP-Werte aufweisen, bevor Sie mit dem nächsten Schritt fortfahren. Möglicherweise müssen Sie eine Minute warten, bevor Sie das überprüfen können.

    $ kubectl -n istio-system get services
    NAME              TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                                                  AGE
    istio-ca-ilb      LoadBalancer   10.47.245.69    10.150.0.9       8060:32174/TCP                                           3m
    istio-egress      ClusterIP      10.47.252.251   <none>           80/TCP                                                   7m
    istio-ingress     LoadBalancer   10.47.254.41    35.197.249.113   80:31822/TCP,443:30637/TCP                               7m
    istio-mixer       ClusterIP      10.47.244.179   <none>           9091/TCP,9093/TCP,9094/TCP,9102/TCP,9125/UDP,42422/TCP   8m
    istio-pilot       ClusterIP      10.47.241.19    <none>           8080/TCP,443/TCP                                         7m
    istio-pilot-ilb   LoadBalancer   10.47.243.136   10.150.0.6       8080:30064/TCP                                           3m
    mixer-ilb         LoadBalancer   10.47.242.213   10.150.0.8       9091:31278/TCP                                           3m
  3. Generieren Sie mithilfe des Hilfsskripts aus dem Istio-Installationsverzeichnis die Istio-Konfigurationsdatei cluster.env, die in den VMs bereitgestellt werden soll. Geben Sie dabei den Namen Ihres Clusters an. Diese Datei enthält die abzufangenden Cluster-IP-Adressbereiche.

    install/tools/setupMeshEx.sh generateClusterEnv [CLUSTER_NAME]
    

    Dadurch wird eine Datei erzeugt, die nur eine einzige Zeile enthält, z. B.:

    $ cat cluster.env
    ISTIO_SERVICE_CIDR=10.63.240.0/20
  4. Verwenden Sie jetzt dasselbe Skript, um die DNS-Konfigurationsdatei zu generieren, die in den VMs verwendet werden soll. Dadurch können auf der Compute Engine-VM ausgeführte Anwendungen die Namen von Clusterdiensten mithilfe von dnsmasq auflösen. Diese werden dann vom Sidecar-Proxy abgefangen und weitergeleitet.

    install/tools/setupMeshEx.sh generateDnsmasq
    

    Die generierte Datei sieht in etwa so aus:

    $ cat kubedns
    server=/svc.cluster.local/10.150.0.7
    address=/istio-mixer/10.150.0.8
    address=/istio-pilot/10.150.0.6
    address=/istio-ca/10.150.0.9
    address=/istio-mixer.istio-system/10.150.0.8
    address=/istio-pilot.istio-system/10.150.0.6
    address=/istio-ca.istio-system/10.150.0.9

VM für Mesh-Netzwerkerweiterung vorbereiten

Nachdem Sie das Mesh-Netzwerk eingerichtet und die erforderlichen Konfigurationsdateien generiert haben, konfigurieren Sie die Compute Engine-VMs so, dass diese dem Netzwerk beitreten können. Dafür ist es notwendig, dass Sie die generierten Dateien in die VMs kopieren. Im Rahmen dieser Anleitung können Sie das bereitgestellte Skript setupMeshEx.sh noch einmal verwenden, um die Dateien zu kopieren und die VMs zu konfigurieren. Wenn Sie jedoch Ihre eigenen VMs einer echten Anwendung in einem Mesh-Netzwerk hinzufügen möchten, sollten Sie die Schritte manuell befolgen, um die VMs in Ihre Workflows und Ihren Bereitstellungsprozess zu integrieren. Die einzelnen Schritte werden im Istio-Leitfaden zum Thema Erweiterung des Mesh-Netzwerks beschrieben. Das Skript, das setupMeshEx.sh auf jeder VM ausführt, finden Sie unter /install/tools/setupIstioVM.sh.

  1. Sorgen Sie zuerst dafür, dass Sie eine Compute Engine-VM, die Sie zum Erweitern des Mesh-Netzwerks verwenden können, im selben Projekt und im selben Netzwerk wie Ihre Istio-Installation haben. Bei Bedarf können Sie eine VM erstellen:

    gcloud compute instances create istio-vm
    
  2. Istio kann Dienste über mehrere Kubernetes-Namespaces hinweg verwalten: Obwohl der VM-Dienst nicht auf Kubernetes ausgeführt wird, fügen Sie ihn in diesem Beispiel dem vm-Namespace hinzu, da dort die durch BookInfo bereitgestellten Weiterleitungsregeln nach dem Dienst suchen. Durch die Verwendung verschiedener Namespaces können Sie Ihre VM-Dienste von Ihren normalen Kubernetes-Diensten trennen. Wenn Sie für eine zur Mesh-Netzwerkerweiterung verwendete VM einen benutzerdefinierten Namespace verwenden möchten, müssen Sie dies angeben, bevor Sie die Einrichtungsskripts ausführen. Legen Sie im Istio-Installationsverzeichnis auf der Cluster-Administratormaschine zuerst die Variable SERVICE_NAMESPACE fest:

    export SERVICE_NAMESPACE=vm
    

    Erstellen Sie dann den Namespace:

    kubectl create namespace $SERVICE_NAMESPACE
    
  3. Führen Sie auf der Cluster-Administratormaschine jetzt den folgenden Befehl mithilfe des Setupskripts setupMeshEx.sh aus. Dieser Befehl bewirkt Folgendes:

    • Die generierten Dateien und das VM-Setupskript werden auf die VM kopiert.
    • DNS-Einstellungen werden konfiguriert und überprüft, damit die VM eine Verbindung zu Istio-Komponenten herstellen kann.
    • Istio-Authentifizierungsgeheimnisse werden auf die VM kopiert.
    • Istio-Debian-Dateien werden auf der VM installiert, einschließlich des Istio-Sidecar-Proxys.
    install/tools/setupMeshEx.sh machineSetup istio-vm
  4. Stellen Sie eine SSH-Verbindung zur Compute Engine-VM her. Verwenden Sie dazu gcloud oder eine Option auf der Seite VM-Instanzdetails der GCP Console. Den Link zu dieser Seite finden Sie auf der Seite VM-Instanzen.

    gcloud compute ssh istio-vm
    
  5. Überprüfen Sie auf der Compute Engine-VM, ob die konfigurierte VM auf Dienste zugreifen kann, die im Kubernetes Engine-Cluster ausgeführt werden. Wenn Sie beispielsweise im Kubernetes Engine-Cluster die Beispielanwendung "BookInfo" ausführen (siehe Istio in Google Kubernetes Engine installieren), müssen Sie wie im folgenden Beispiel mithilfe von productpage über die VM auf den Dienst curl zugreifen können:

    $ curl -v -w "\n" http://productpage.default.svc.cluster.local:9080/api/v1/products/0/ratings
    *   Trying 10.63.251.156...
    * Connected to productpage.default.svc.cluster.local (10.63.251.156) port 9080 (#0)
    > GET /api/v1/products/0/ratings HTTP/1.1
    > Host: productpage.default.svc.cluster.local:9080
    > User-Agent: curl/7.47.0
    > Accept: /
    >
    < HTTP/1.1 200 OK
    < content-type: application/json
    < content-length: 54
    < server: envoy
    < date: Sun, 15 Oct 2017 00:04:49 GMT
    < x-envoy-upstream-service-time: 17
    <

    • Connection #0 to host productpage.default.svc.cluster.local left intact {"ratings": {"Reviewer2": 4, "Reviewer1": 5}, "id": 0}
  6. Beachten Sie, dass in diesem Fall für die URL der Produktseite default verwendet wurde, da das BookInfo-Beispiel im Rahmen der vorherigen Anleitung im Standard-Namespace erstellt wurde. Ersetzen Sie "default" entsprechend, wenn Sie einen anderen Namespace verwenden möchten.

  7. Überprüfen Sie auf der VM, ob dort Istio-Prozesse ausgeführt werden:

    $ sudo systemctl status istio-auth-node-agent
    istio-auth-node-agent.service - istio-auth-node-agent: The Istio auth node agent
      Loaded: loaded (/lib/systemd/system/istio-auth-node-agent.service; disabled; vendor preset: enabled)
      Active: active (running) since Fri 2017-10-13 21:32:29 UTC; 9s ago
      Docs: http://istio.io/
    Main PID: 6941 (node_agent)
      Tasks: 5
      Memory: 5.9M
      CPU: 92ms
      CGroup: /system.slice/istio-auth-node-agent.service
              └─6941 /usr/local/istio/bin/node_agent --logtostderr
    
    Oct 13 21:32:29 demo-vm-1 systemd[1]: Started istio-auth-node-agent: The Istio auth node agent.
    Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.469314    6941 main.go:66] Starting Node Agent
    Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.469365    6941 nodeagent.go:96] Node Agent starts successfully.
    Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.483324    6941 nodeagent.go:112] Sending CSR (retrial #0) ...
    Oct 13 21:32:29 demo-vm-1 node_agent[6941]: I1013 21:32:29.862575    6941 nodeagent.go:128] CSR is approved successfully. Will renew cert in 29m59.137732603s

Dienst auf einer VM der Mesh-Netzwerkerweiterung ausführen

Sehen wir uns jetzt an, wie Sie einen Dienst auf einer VM der Mesh-Netzwerkerweiterung ausführen können. Im Rahmen dieser Anleitung erweitern Sie das BookInfo-Beispiel aus dem Artikel zum Thema Istio in Google Kubernetes Engine installieren mithilfe der im vorherigen Abschnitt konfigurierten VM um eine MySQL-Bewertungsdatenbank, die auf einer Compute Engine-VM ausgeführt wird.

  1. Prüfen Sie, ob istio-vm als VM der Mesh-Netzwerkerweiterung für den Cluster konfiguriert wurde, in dem BookInfo ausgeführt wird. Dies wurde weiter oben bereits beschrieben.

  2. Installieren Sie auf der Compute Engine-VM einen MySQL-Server:

    sudo apt-get update && sudo apt-get install --no-install-recommends -y mariadb-server
    
  3. Konfigurieren Sie für die Zwecke dieser Anleitung den MySQL-Server so, dass der Nutzer "root" das Passwort "password" hat. Tun Sie das keinesfalls in der Praxis.

    sudo mysql -e "grant all privileges on *.* to 'root'@'localhost' identified by 'password'; flush privileges"
    
  4. Verwenden Sie dann das bereitgestellte Schema mysqldb-init.sql, um die Bewertungsdatenbank für BookInfo einzurichten.

    curl https://raw.githubusercontent.com/istio/istio/master/samples/bookinfo/src/mysql/mysqldb-init.sql| mysql -u root --password=password -h 127.0.0.1
    
  5. Registrieren Sie im nächsten Schritt den neuen Dienst mithilfe von istioctl bei Ihrer Istio-Installation. Rufen Sie zuerst die primäre interne IP-Adresse der VM ab. Sie befindet sich auf der Seite VM-Instanzdetails der GCP Console. Alternativ können Sie die IP-Adresse mit hostname --ip-address abrufen. Führen Sie dann auf der Cluster-Administratormaschine folgenden Befehl aus. Ersetzen Sie dabei die entsprechende IP-Adresse:

    $ istioctl register -n vm mysqldb 10.150.0.5 3306
    I1014 22:54:12.176972   18162 register.go:44] Registering for service 'mysqldb' ip '10.150.0.5', ports list [{3306 mysql}]
  6. Aktualisieren Sie auf der Cluster-Administratormaschine die BookInfo-Bereitstellung mit einer Version des Bewertungsdienstes, der auf die MySQL-Datenbank zugreift, sowie das Routing, damit Traffic an sie gesendet werden kann.

    $ kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/kube/bookinfo-ratings-v2-mysql-vm.yaml)
    deployment "ratings-v2-mysql-vm" created
    $ kubectl get pods -lapp=ratings
    NAME                                   READY     STATUS    RESTARTS   AGE
    ratings-v1-3016823457-mqbfx            2/2       Running   0          24m
    ratings-v2-mysql-vm-1319199664-9jxkp   2/2       Running   0          19s
    $ istioctl create -f samples/bookinfo/kube/route-rule-ratings-mysql-vm.yaml
    Created config route-rule/default/ratings-test-v2-mysql-vm at revision 4398
    Created config route-rule/default/reviews-test-ratings-v2-vm at revision 4399
  7. Konfigurieren Sie abschließend auf der Compute Engine-VM den Istio-Sidecar-Proxy von istio-vm, um auf dem entsprechenden Port Traffic abzufangen. In unserem Beispiel ist es der Port 3306, der bei der Registrierung des Dienstes angegeben wurde. Dies können Sie in der Datei /var/lib/istio/envoy/sidecar.env konfigurieren, indem Sie die folgenden drei Zeilen zur Datei hinzufügen.

    $ sudo vi /var/lib/istio/envoy/sidecar.env
    ...
    ISTIO_INBOUND_PORTS=3306
    ISTIO_SERVICE=mysqldb
    ISTIO_NAMESPACE=vm
    

    Nachdem Sie die Konfiguration geändert haben, müssen Sie den Sidecar-Proxy neu starten.

    sudo systemctl restart istio
    
  8. Wenn Sie die aufgeführten Schritte alle durchgeführt haben, sollte der Bewertungsdienst der BookInfo-Anwendung die neue Datenbank der Mesh-Netzwerkerweiterung verwenden. Ändern Sie auf der VM versuchsweise die Werte in der Bewertungsdatenbank und sehen Sie, wie diese auf den Produktseiten der BookInfo-Anwendung angezeigt werden.

    $ mysql -u root -h 127.0.0.1 --password=password test -e "select * from ratings"
    +----------+--------+
    | ReviewID | Rating |
    +----------+--------+
    |        1 |      5 |
    |        2 |      4 |
    +----------+--------+
    # Change to 1 star:
    $ mysql -u root --password=password test -e "update ratings set rating=1 where reviewid=1"
    

    Aktualisierte Bewertungen in der UI

Funktionsweise

Wenn die Anwendung auf der VM eine Anfrage an einen anderen Dienst im Mesh-Netzwerk stellen möchte, muss sie dessen Namen mithilfe von DNS auflösen, um die jeweilige Dienst-IP-Adresse (bzw. Cluster-IP-Adresse, die dem Dienst zugewiesene VIP) zurückzuerhalten. Aufgrund von Istios besonderer VM-Konfiguration der Mesh-Netzwerkerweiterung löst die VM-Anwendung den Namen mithilfe von dnsmasq auf. Dadurch werden alle .cluster.local-Adressen an Kubernetes umgeleitet. Während der Einrichtung von dnsmasq wird außerdem die IP-Adresse 127.0.0.1 zu der Konfigurationsdatei resolv.conf hinzugefügt und DHCP gegebenenfalls so konfiguriert, dass diese IP-Adresse nach jeder DHCP-Auflösung eingefügt wird.

Wenn dann die Anwendung die Anfrage stellt, verwendet die Istio-VM-Einrichtung ipnames, um die Anfrage über den Envoy-Proxy umzuleiten. Der Proxy stellt dann eine Verbindung zum Dienst Istio-Pilot her, um die Liste der Endpunkte abzurufen, und leitet die Anfrage an den entsprechenden Endpunkt des Mesh-Netzwerks weiter, nachdem die Weiterleitungsregeln angewendet wurden.

Bereinigen

So vermeiden Sie, dass Ihrem Google Cloud Platform-Konto die in dieser Anleitung verwendeten Ressourcen in Rechnung gestellt werden:

Wenn Sie die BookInfo-Anwendung im Abschnitt Weitere Informationen nicht weiter erkunden möchten, führen Sie die folgenden Schritte durch:

  1. Löschen Sie die verschiedenen internen Lastenausgleichsmodule, die in der Anleitung verwendet wurden:

    kubectl -n istio-system delete service --all
    kubectl -n kube-system delete service dns-ilb
    
  2. Warten Sie, bis alle Lastenausgleichsmodule gelöscht wurden. Beobachten Sie dazu die Ausgabe des folgenden Befehls:

    gcloud compute forwarding-rules list
    
  3. Löschen Sie den Containercluster:

    gcloud container clusters delete [CLUSTER_NAME]
    
  4. Löschen Sie die Datenbank-VM:

    gcloud compute instances delete istio-vm
    

Weitere Informationen

Auf der Istio-Website finden Sie weitere Anleitungen sowie komplett funktionsfähige Anwendungsbeispiele für Istio, die Sie testen können. Dazu gehören:

  • Intelligent Routing: In diesem Beispiel wird gezeigt, wie Sie die verschiedene Funktionen von Istio zum Verwalten von Traffic zusammen mit BookInfo verwenden können, einschließlich der Weiterleitungsregeln, die im letzten Abschnitt dieser Anleitung verwendet wurden.

  • In-Depth Telemetry: In diesem Beispiel wird gezeigt, wie Sie mithilfe von Istio Mixer und mit dem Sidecar-Proxy von Istio einheitliche Messwerte, Logs und Traces aus den BookInfo-Diensten abrufen können.

Hat Ihnen diese Seite weitergeholfen? Teilen Sie uns Ihr Feedback mit:

Feedback geben zu...

Compute Engine-Dokumentation