Istio installieren

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

Überblick

[Istio](https://istio.io) ist ein Open-Source-Framework zum Verbinden, Überwachen und Sichern von Mikrodiensten, einschließlich der Dienste, die in GKE On-Prem ausgeführt werden. Sie können damit ein Netzwerk aus bereitgestellten Diensten mit Lastenausgleich, Dienst-zu-Dienst-Authentifizierung, Monitoring und weiteren Funktionen erstellen, ohne Änderungen am Dienstcode vorzunehmen. Wenn Sie Diensten Istio-Unterstützung hinzufügen möchten, stellen Sie für jeden Pod einer Anwendung einen speziellen Sidecar-Proxy von [Envoy](https://www.envoyproxy.io) 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 sowie konfigurieren und wie Sie eine Istio-fähige Demoanwendung mit mehreren Diensten bereitstellen.

Vorbereitung

Prüfen Sie, ob das 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 helm-Binärdatei auf dem Computer zu installieren, auf dem sich Ihre Clusteranmeldedaten befinden.

.

Berechtigungen und Anmeldedaten

  1. Sie benötigen kubectl-Anmeldedaten für den GKE On-Prem-Nutzercluster, in 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.
1. Gewähren Sie dem aktuellen Nutzer Cluster-Administratorberechtigungen. Sie benötigen diese Berechtigungen, um die erforderlichen Regeln der [rollenbasierten Zugriffssteuerung (Role based access control, RBAC)](/kubernetes-engine/docs/role-based-access-control) 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 Demoanwendung zwar ausführen, aber keine Berechtigungen für den Clusteradministrator erteilen. Die Berechtigungen sind aber erforderlich, wenn Sie auf Telemetriedaten und andere Istio-Funktionen zugreifen möchten.

Istio herunterladen

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

Folgen Sie diesen Schritten auf dem Computer, auf dem sich Ihre Clusteranmeldedaten befinden. Dies ist der Clusteradministratorcomputer.

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

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

    Im Installationsverzeichnis ist Folgendes enthalten:

    • .yaml-Installationsdateien für Kubernetes in install/
    • Beispielanwendungen in samples/
    • Clientbinärdatei istioctl im Verzeichnis bin/; istioctl wird verwendet, wenn Envoy manuell als Sidecar-Proxy und zum Erstellen von Weiterleitungsregeln und -richtlinien hinzugefügt wird
    • Konfigurationsdatei istio.VERSION
  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 Clusteradministratorcomputer 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 nach 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 -

Istio installieren

Hinweis: Prüfen Sie, ob helm v2.*x* installiert ist. Derzeit wird die Version 3 von Helm nicht unterstützt. Für die Ermittlung der Helm-Versionsnummer geben Sie "helm version" ein. Danach können Sie Istio installieren. Istio wird in dem 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. 1. Installieren Sie die benutzerdefinierten Ressourcendefinitionen (Custom Resource Definitions, CRDs) von Istio:
    helm template install/kubernetes/helm/istio-init \
      --name istio-init --namespace istio-system | kubectl apply -f -
    
1. Warten Sie einige Sekunden, bis die CRDs zum Kubernetes API-Server übertragen wurden. 1. Installieren Sie Istio mit dem standardmäßigen [Profil](https://istio.io/docs/setup/kubernetes/additional-setup/config-profiles/). Sie können auch ein anderes Profil auswählen, wir empfehlen aber für Produktions-Deployments das Standardprofil.
    helm template install/kubernetes/helm/istio \
      --name istio --namespace istio-system | kubectl apply -f -
    
Damit werden die Kernkomponenten von Istio bereitgestellt: * [Istio-Pilot](https://istio.io/docs/concepts/what-is-istio/#pilot){:.external}, der für die Service Discovery und die Konfiguration der Envoy-Sidecar-Proxys in einem Istio-Service-Mesh zuständig ist. * Die [Mixer](https://istio.io/docs/concepts/what-is-istio/#mixer){:.external}-Komponenten der Istio-Richtlinie und Istio-Telemetrie, die Nutzungsrichtlinien erzwingen und Telemetriedaten für das Service Mesh erfassen. * [Istio-Eingangsgateway](https://istio.io/docs/tasks/traffic-management/ingress.html) {:.external}, das einen Eingangspunkt für Traffic von außerhalb des Clusters bietet. * [Istio-Citadel](https://istio.io/docs/concepts/what-is-istio/#citadel){:.external} zur Automatisierung der Schlüssel- und Zertifikatsverwaltung für Istio.

Istio-Installation prüfen

1. Prüfen Sie, ob die Kubernetes-Dienste istio-citadel, istio-pilot, istio-ingressgateway, istio-policy und istio-telemetry bereitgestellt wurden. In der Ausgabe werden auch die anderen bereitgestellten Dienste angezeigt:
    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. Prüfen Sie, ob die entsprechenden Kubernetes-Pods bereitgestellt wurden und alle Container ausgeführt werden: 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
    ...

Externe IP-Adresse konfigurieren

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

Folgen Sie zum Konfigurieren einer externen IP-Adresse einem der folgenden Abschnitte je nach Load-Balancing-Modus des Clusters:

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 aufgerufen.

  2. Fügen Sie der Datei die folgende Zeile unter dem Spezifikationsblock (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
    

    Es wird jeder Port für die Istio-Gateways angezeigt. Die Befehlsausgabe sieht in etwa so aus:

     ...
     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 dann 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 Dienstports auswählen, die Sie für diese 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](https://istio.io/docs/guides/bookinfo.html). Dies ist eine einfache Simulation einer Anwendung für den Buchhandel, die aus vier Diensten besteht. Diese bieten eine Webproduktseite, Buchdetails, Rezensionen mit mehreren Versionen des Überprüfungsdienstes sowie Bewertungen. Die Dienste werden alle mit Istio verwaltet. Den Quellcode und alle anderen Dateien, die in diesem Beispiel verwendet werden, finden Sie im Verzeichnis der Istio-Installation unter [samples/bookinfo](https://github.com/istio/istio/tree/master/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 Clusteradministratorcomputer befinden. 1. Stellen Sie die Anwendung mit "kubectl apply" und "istioctl kube-inject" bereit. Der Befehl "kube-inject" aktualisiert das BookInfo-Deployment, sodass mit dem Dienst in jedem Anwendungs-Pod ein Sidecar bereitgestellt wird.
    kubectl apply -f <(istioctl kube-inject -f samples/bookinfo/platform/kube/bookinfo.yaml)
    
1. 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
1. Definieren Sie abschließend das Ingress-Gateway-Routing für die Anwendung:
    kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
    

Anwendungs-Deployment validieren

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

export GATEWAY_URL=203.0.113.1
### Anwendung testen 1. Prüfen Sie, ob die BookInfo-Anwendung 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. 1. Rufen Sie in Ihrem Browser die Adresse "http://$GATEWAY_URL/productpage" auf, um die Bookinfo-Webseite zu öffnen. 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 noch keine Versionsverwaltung mit Istio festgelegt haben. ## Eigene Anwendung bereitstellen Wenn Sie eine eigene Anwendung bereitstellen möchten, gehen Sie genauso vor wie bei Ihrem YAML-Deployment. 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 mit "kube-inject"` die Sidecars beim Bereitstellen der Anwendung wie in unserem Beispiel hinzufügen, oder die [automatische Istio-Sidecar-Einfügung](/istio/docs/istio-on-gke/installing#enabling_sidecar_injection) 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
    

Weitere Informationen

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