Sie betrachten die Dokumentation für eine frühere Version von GKE On-Prem. Sehen Sie sich die aktuelle Dokumentation an.

Istio installieren

Auf dieser Seite wird gezeigt, wie Sie Istio in Ihrem lokalen GKE-Cluster installieren.

Überblick

Istio ist ein Open-Source-Framework zum Verbinden, Beobachten und Sichern von Mikrodiensten, einschließlich Diensten, die auf GKE On-Prem ausgeführt werden. Sie können damit ein Netzwerk aus bereitgestellten Diensten mit Load-Balancing, Dienst-zu-Dienst-Authentifizierung, Monitoring und weiteren Funktionen erstellen, ohne Änderungen am Dienstcode vorzunehmen. 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.

In dieser Anleitung erfahren Sie, wie Sie Istio auf GKE On-Prem installieren und konfigurieren und eine Istio-fähige Demoanwendung mit mehreren Diensten bereitstellen.

Hinweise

Stellen Sie sicher, dass Cloud SDK installiert ist.

Helm installieren

Für die Installation von Istio empfehlen wir die Verwendung von Helm mit einem der konfigurierbaren Profile von Istio.

Wenn Sie Helm nicht bereits installiert haben, folgen Sie der Anleitung in der Helm-README-Datei, um die Binärdatei helm auf dem Computer zu installieren, auf dem Sie Ihre Cluster-Anmeldedaten haben.

.

Berechtigungen und Anmeldedaten

  1. Sie benötigen kubectl-Anmeldedaten für den lokalen GKE On-Prem-Nutzercluster, auf dem Sie Istio installieren möchten. Beachten Sie, dass Istio nur auf einem GKE On-Prem-Nutzercluster und nicht auf einem Administratorcluster installiert werden kann.

  2. Gewähren Sie dem aktuellen Nutzer Cluster-Administratorberechtigungen. Sie benötigen diese Berechtigungen, um die erforderlichen Regeln für die rollenbasierte Zugriffssteuerung (Role Based Access Control, RBAC) für Istio zu erstellen:

    kubectl create clusterrolebinding cluster-admin-binding \
      --clusterrole=cluster-admin \
      --user="$(gcloud config get-value core/account)"
    

    Sie können die Demo-App zwar ausführen, ohne die Berechtigungen für den Clusteradministrator zu erteilen. Die Berechtigungen sind jedoch erforderlich, wenn Sie auf Telemetriedaten und andere Istio-Funktionen zugreifen möchten.

Laden Sie Istio herunter

Für GKE On-Prem empfehlen wir die Verwendung der Istio-Version 1.1.13.

Befolgen Sie diese Schritte auf demselben Computer, auf dem Sie Ihre Cluster-Anmeldedaten haben: dies ist Ihr Cluster-Administratorcomputer.

  1. Laden Sie das Istio-Paket 1.1.13 mit folgendem Befehl in Ihr aktuelles Verzeichnis herunter:

    curl -L https://github.com/istio/istio/releases/download/1.1.13/istio-1.1.13-linux.tar.gz | tar xz
    

    Das Installationsverzeichnis enthält Folgendes:

    • .yaml-Installationsdateien für Kubernetes in install/
    • Beispielanwendungen in samples/
    • istioctl-Client-Binärdatei im Verzeichnis bin/. istioctl wird verwendet, wenn Envoy manuell als Sidecar-Proxy und zum Erstellen von Weiterleitungsregeln und -richtlinien hinzugefügt wird.
    • istio.VERSION-Konfigurationsdatei
  2. Wechseln Sie in das Installationsstammverzeichnis und fügen Sie istioctl zu PATH hinzu:

    cd  istio-1.1.13
    export PATH=$PATH:${PWD}/bin
    

Namespace und Zertifikat einrichten

Führen Sie auf dem Cluster-Administratorcomputer die folgenden Schritte aus, um den Namespace istio-system für die Komponenten der Steuerungsebene einzurichten:

kubectl create namespace istio-system

Kopieren Sie dann das erforderliche Root-Zertifikat in istio-system für Citadel. Dies ist für GKE On-Prem-Cluster erforderlich:

kubectl get secret istio-ca-secret --namespace=kube-system --export -o yaml | kubectl apply --validate=false --namespace=istio-system -f -

Installieren Sie Istio

Jetzt können Sie Istio installieren. Istio wird im soeben erstellten Namespace istio-system installiert und kann Mikrodienste aus allen anderen Namespaces verwalten. Die Installation umfasst Kernkomponenten, Tools und Beispielanwendungen.

  1. Achten Sie darauf, dass Sie sich im Stammverzeichnis der Istio-Installation befinden.

  2. Installieren Sie die benutzerdefinierten Ressourcendefinitionen (CRDs) von Istio:

    helm template install/kubernetes/helm/istio-init \
      --name istio-init --namespace istio-system | kubectl apply -f -
    
  3. Warten Sie einige Sekunden, bis die CRDs in den Kubernetes API-Server übertragen wurden.

  4. Installieren Sie Istio mit dem standardmäßigen Profil. Obwohl Sie ein anderes Profil auswählen können, empfehlen wir für Produktionsbereitstellungen das Standardprofil.

    helm template install/kubernetes/helm/istio \
      --name istio --namespace istio-system | kubectl apply -f -
    

    Hierdurch werden die Kernkomponenten von Istio bereitgestellt:

    • Istio-Pilot: Zuständig für die Diensterkennung und die Konfiguration der Envoy-Sidecar-Proxys in einem Istio-Dienst-Mesh.
    • Mixer-Komponenten "Istio-Policy" und "Istio-Telemetry": Setzen Nutzungsrichtlinien durch und erfassen Telemetriedaten im ganzen Dienst-Mesh.
    • Istio-Ingressgateway: Stellt einen Eingangspunkt für Traffic von außerhalb des Clusters bereit.
    • Istio-Citadel: Automatisiert die Schlüssel- und Zertifikatsverwaltung für Istio.

Prüfen Sie die Istio-Installation

  1. Stellen Sie sicher, dass die folgenden Kubernetes-Dienste bereitgestellt sind: istio-citadel, istio-pilot, istio-ingressgateway, istio-policy und istio-telemetry. Sie sehen auch die anderen bereitgestellten Dienste:

    kubectl get service -n istio-system
    
    Ausgabe:
    NAME                       TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                               AGE
    ...
    istio-citadel              ClusterIP      10.19.253.95            8060/TCP,9093/TCP                                                     37s
    istio-galley               ClusterIP      10.19.245.2             443/TCP,15014/TCP,9901/TCP                                            37s
    istio-ingressgateway       LoadBalancer   10.19.247.233        80:31380/TCP,443:31390/TCP,31400:31400/TCP                            40s
    istio-pilot                ClusterIP      10.19.243.14            15003/TCP,15005/TCP,15007/TCP,15010/TCP,15011/TCP,8080/TCP,9093/TCP   38s
    istio-policy               ClusterIP      10.19.254.117           9091/TCP,15004/TCP,9093/TCP                                           39s
    istio-sidecar-injector     ClusterIP      10.19.248.228           443/TCP                                                               37s
    istio-statsd-prom-bridge   ClusterIP      10.19.252.35            9102/TCP,9125/UDP                                                     39s
    istio-telemetry            ClusterIP      10.19.250.11            9091/TCP,15004/TCP,9093/TCP,42422/TCP                                 39s
    ...
  2. Stellen Sie sicher, dass die entsprechenden Kubernetes-Pods bereitgestellt sind und alle Container aktiv sind: istio-pilot-*, istio-policy-*, istio-telemetry-*, istio-ingressgateway-* und istio-citadel-*.

    kubectl get pods -n istio-system
    
    Ausgabe:
    NAME                                        READY     STATUS      RESTARTS   AGE
    istio-citadel-54f4678f86-4549b              1/1       Running     0          12m
    istio-cleanup-secrets-5pl77                 0/1       Completed   0          12m
    istio-galley-7bd8b5f88f-nhwlc               1/1       Running     0          12m
    istio-ingressgateway-665699c874-l62rg       1/1       Running     0          12m
    istio-pilot-68cbbcd65d-l5298                2/2       Running     0          12m
    istio-policy-7c5b5bb744-k6vm9               2/2       Running     0          12m
    istio-security-post-install-g9l9p           0/1       Completed   3          12m
    istio-sidecar-injector-85ccf84984-2hpfm     1/1       Running     0          12m
    istio-telemetry-5b6c57fffc-9j4dc            2/2       Running     0          12m
    istio-tracing-77f9f94b98-jv8vh              1/1       Running     0          12m
    prometheus-7456f56c96-7hrk5                 1/1       Running     0          12m
    ...

Konfigurieren Sie eine externe IP-Adresse

Bei der standardmäßigen Istio-Installation wird davon ausgegangen, dass eine externe IP-Adresse automatisch für LoadBalancer Dienste zugewiesen wird. Dies gilt nicht für GKE On-Prem-Cluster. Aus diesem Grund müssen Sie der Istio Ingress Gateway-Ressource manuell eine IP-Adresse zuweisen.

Folgen Sie je nach Load-Balancing-Modus des Clusters einem der folgenden Abschnitte, um eine externe IP-Adresse zu konfigurieren:

Integrierter Load-Balancing-Modus

  1. Öffnen Sie die Konfiguration des istio-ingressgateway-Dienstes:

    kubectl edit svc -n istio-system istio-ingressgateway
    

    Die Konfiguration für den Dienst istio-ingressgateway wird im Standardtexteditor der Shell geöffnet.

  2. Fügen Sie in der Datei die folgende Zeile unter dem Anzeigenblock (spec) hinzu:

    loadBalancerIP: <your static external IP address>
    

    Beispiel:

    spec:
     loadBalancerIP: 203.0.113.1
    
  3. Speichern Sie die Datei.

Manueller Load-Balancing-Modus

Um einen Dienst vom Typ NodePort mit einer VIP auf dem ausgewählten Load-Balancer verfügbar zu machen, müssen Sie zuerst die nodePort-Werte ermitteln:

  1. Rufen Sie die Konfiguration des Dienstes istio-ingressgateway in Ihrer Shell auf:

    kubectl get svc -n istio-system istio-ingressgateway -o yaml
    

    Jeder Port für die Istio-Gateways wird angezeigt. Die Befehlsausgabe könnte so aussehen:

     ...
     ports:

    • name: status-port nodePort: 30391 port: 15020 protocol: TCP targetPort: 15020
    • name: http2 nodePort: 31380 port: 80 protocol: TCP targetPort: 80
    • name: https nodePort: 31390 port: 443 protocol: TCP targetPort: 443
    • name: tcp nodePort: 31400 port: 31400 protocol: TCP targetPort: 31400
    • name: https-kiali nodePort: 31073 port: 15029 protocol: TCP targetPort: 15029
    • name: https-prometheus nodePort: 30253 port: 15030 protocol: TCP targetPort: 15030
    • name: https-grafana nodePort: 30050 port: 15031 protocol: TCP targetPort: 15031
    • name: https-tracing nodePort: 31204 port: 15032 protocol: TCP targetPort: 15032
    • name: tls nodePort: 30158 port: 15443 protocol: TCP targetPort: 15443 ...
  2. Machen Sie diese Ports über Ihren Load-Balancer verfügbar.

    Der Dienstport http2 hat beispielsweise port 80 und nodePort 31380. Angenommen, die Knotenadressen für Ihren Nutzercluster lauten 192.168.0.10, 192.168.0.11 und 192.168.0.12 und die VIP Ihres Load-Balancers ist 203.0.113.1.

    Konfigurieren Sie Ihren Load-Balancer so, dass der an 203.0.113.1:80 gesendete Traffic an 192.168.0.10:31380, 192.168.0.11:31380 oder 192.168.0.12:31380 weitergeleitet wird. Sie können die Dienst-Ports auswählen, die Sie für diesen VIP freigeben möchten.

Beispielanwendung bereitstellen

Wenn Istio installiert ist und alle zugehörigen Komponenten ausgeführt werden, können Sie eine der Beispielanwendungen bereitstellen, die bei der Installation enthalten sind. In dieser Anleitung installieren wir BookInfo. Hierbei handelt es sich um eine einfache Nachbildung einer Buchhandlung, die aus vier Diensten besteht, die eine Webproduktseite, Buchdetails, Rezensionen mit mehreren Versionen des Überprüfungsdienstes sowie Bewertungen bieten. Alle werden mit Istio verwaltet. Den Quellcode und alle anderen Dateien, die in diesem Beispiel genutzt werden, finden Sie im Istio-Installationsverzeichnis samples/bookinfo.

Wenn Sie diese Schritte ausführen, werden die Dienste der BookInfo-Anwendung in einer Istio-fähigen Umgebung bereitgestellt. Dabei werden für jeden Dienst Envoy-Sidecar-Proxys eingefügt, um Istio-Funktionalität zu bieten.

  1. Achten Sie darauf, dass Sie sich noch im Stammverzeichnis der Istio-Installation auf dem Cluster-Administratorcomputer befinden.

  2. Stellen Sie die Anwendung mit kubectl apply und istioctl kube-inject bereit. Mit dem Befehl kube-inject wird die Bereitstellung von BookInfo aktualisiert, sodass in jedem Anwendungs-Pod zusammen mit dem Dienst ein Sidecar bereitgestellt wird.

    kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
    
  3. Führen Sie die folgenden Befehle aus, um zu bestätigen, dass die Anwendung fehlerfrei bereitgestellt wurde:

    kubectl get services
    Ausgabe:
    NAME                       CLUSTER-IP   EXTERNAL-IP   PORT(S)              AGE
    details                    10.0.0.31    <none>        9080/TCP             6m
    kubernetes                 10.0.0.1     <none>        443/TCP              7d
    productpage                10.0.0.120   <none>        9080/TCP             6m
    ratings                    10.0.0.15    <none>        9080/TCP             6m
    reviews                    10.0.0.170   <none>        9080/TCP             6m

    und

    kubectl get pods
    Ausgabe:
    NAME                                        READY     STATUS    RESTARTS   AGE
    details-v1-1520924117-48z17                 2/2       Running   0          6m
    productpage-v1-560495357-jk1lz              2/2       Running   0          6m
    ratings-v1-734492171-rnr5l                  2/2       Running   0          6m
    reviews-v1-874083890-f0qf0                  2/2       Running   0          6m
    reviews-v2-1343845940-b34q5                 2/2       Running   0          6m
    reviews-v3-1813607990-8ch52                 2/2       Running   0          6m
  4. Definieren Sie abschließend das Ingress-Gateway-Routing für die Anwendung:

    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    

Validieren Sie die Anwendungsbereitstellung

Jetzt möchten wir die bereitgestellte BookInfo-Anwendung testen. Sie kennen die externe IP-Adresse für das Eingangsgateway bereits, als Sie es zuvor konfiguriert haben. Wenn Sie beispielsweise 203.0.113.1 für Ihre externe IP-Adresse verwendet haben:

export GATEWAY_URL=203.0.113.1

Anwendung testen

  1. Prüfen Sie, ob die BookInfo-App mit curl ausgeführt wird:

    curl -I http://${GATEWAY_URL}/productpage
    

    Wenn in der Antwort 200 angezeigt wird, bedeutet dies, dass die Anwendung fehlerfrei mit Istio funktioniert.

  2. Zeigen Sie nun mit Ihrem Browser auf http://$GATEWAY_URL/productpage, um die BookInfo-Webseite anzuzeigen. Wenn Sie die Seite mehrmals aktualisieren, sollten auf der Produktseite verschiedene Versionen von Rezensionen in zufälliger Reihenfolge angezeigt werden (rote Sterne, schwarze Sterne, keine Sterne), da wir die Versionssteuerung noch nicht mit Istio festgelegt haben.

Eigene Anwendungen bereitstellen

Wenn Sie versuchen möchten, eine eigene Anwendung bereitzustellen, nutzen Sie einfach dasselbe Verfahren mit Ihrer eigenen YAML-Bereitstellung: Istio erfordert keine Änderungen an der Anwendung selbst. Beachten Sie, dass die Anwendung das HTTP/1.1- oder HTTP/2.0-Protokoll für den gesamten HTTP-Traffic nutzen muss, da der Envoy-Proxy kein HTTP/1.0 unterstützt: er benötigt Header zur Weiterleitung, die in HTTP/1.0 nicht vorhanden sind.

Sie können entweder kube-inject verwenden, um die Sidecars beim Bereitstellen der Anwendung hinzuzufügen, wie in unserem Beispiel, oder die automatische Sidecar-Einfügung von Istio für den Namespace aktivieren, in dem Ihre Anwendung ausgeführt wird.

Deinstallation

  1. Verwenden Sie den folgenden Befehl, um die Istio-Komponenten zu deinstallieren:

    helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl delete -f -
    
  2. Löschen Sie anschließend den Namespace istio-system:

    kubectl delete namespace istio-system
    

Nächste Schritte

Weitere Informationen zu Istio finden Sie auf der Istio-Website und in der Istio-Dokumentation der Google Cloud Platform.