Google Kubernetes Engine-Pods mit manueller Envoy-Injektion einrichten
In dieser Anleitung erfahren Sie, wie Sie Google Kubernetes Engine- oder Kubernetes-Pod-Hosts und die Load Balancing-Komponenten konfigurieren, die Cloud Service Mesh benötigt.
Bevor Sie den Anleitungen in diesem Leitfaden folgen, führen Sie die unter Einrichtung von Service Routing APIs mit Envoy und proxylosen Workloads vorbereiten beschriebenen vorbereitenden Aufgaben aus.
Sie können Cloud Service Mesh mit dem Compute Engine-Load Balancing SDK oder mit REST APIs konfigurieren. Weitere Informationen finden Sie in den Load-Balancing API- und gcloud-Referenzen.
GKE-/Kubernetes-Cluster für Cloud Service Mesh konfigurieren
In diesem Abschnitt werden die erforderlichen Schritte beschrieben, damit GKE/Kubernetes-Cluster mit Cloud Service Mesh zusammenarbeiten können.
GKE-Cluster erstellen
GKE-Cluster müssen die folgenden Voraussetzungen erfüllen:
- Die Unterstützung von Netzwerk-Endpunktgruppen muss aktiviert sein. Weitere Informationen und Beispiele finden Sie unter Standalone-Netzwerk-Endpunktgruppen. Das Standalone-NEG-Feature ist für Cloud Service Mesh allgemein verfügbar.
- Das Dienstkonto der Clusterknoteninstanzen muss über die Berechtigung zum Zugriff auf die Cloud Service Mesh API verfügen.
- Informationen zu den erforderlichen Berechtigungen finden Sie unter Dienstkonto für den Zugriff auf die Traffic Director API aktivieren.
- Informationen zum Aktivieren der Cloud Service Mesh API finden Sie unter Cloud Service Mesh API aktivieren.
- Die Container müssen Zugriff auf die Cloud Service Mesh API haben, der durch OAuth-Authentifizierung geschützt ist. Weitere Informationen finden Sie in der Übersicht über den Konfigurationsprozess.
Das folgende Beispiel zeigt, wie Sie einen GKE-Cluster mit dem Namen traffic-director-cluster
in der Zone us-central1-a
erstellen.
Console
Zum Erstellen eines Clusters mit der Google Cloud Console führen Sie die folgenden Schritte aus:
Rufen Sie in der Google Cloud Console das Menü „Kubernetes Engine” auf.
Klicken Sie auf Cluster erstellen.
Füllen Sie die folgenden Felder aus:
- Name: Geben Sie
traffic-director-cluster
ein. - Standorttyp:
Zonal
. - Zone:
us-central1-a
.
- Name: Geben Sie
Klicken Sie im Navigationsbereich unter Knotenpools auf default-pool.
Das Feld Größe gibt die Anzahl der Knoten an, die im Cluster erstellt werden sollen. Sie müssen verfügbare Ressourcenkontingente für die Knoten und ihre Ressourcen (z. B. Firewallrouten) haben.
Klicken Sie im Navigationsbereich unter Standardpool auf Knoten.
Das Feld Maschinentyp gibt den Compute Engine-Maschinentyp an, der für die Instanzen verwendet werden soll. Jeder Maschinentyp wird unterschiedlich abgerechnet. Informationen zu Preisen für Maschinentypen finden Sie auf der Preisübersicht für Compute Engine.
Klicken Sie im Navigationsbereich unter Standardpool auf Sicherheit.
Klicken Sie unter Zugriffsbereiche auf Uneingeschränkten Zugriff auf alle Cloud APIs zulassen.
Passen Sie den Cluster nach Bedarf an.
Klicken Sie auf Erstellen.
Nachdem Sie einen Cluster in der Google Cloud Console erstellt haben, müssen Sie kubectl
für die Interaktion mit dem Cluster konfigurieren. Weitere Informationen finden Sie unter Eintrag in kubeconfig
generieren.
gcloud
gcloud container clusters create traffic-director-cluster \ --zone us-central1-a \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --enable-ip-alias
Erforderliche GKE-Clusterberechtigungen abrufen
Wechseln Sie in GKE zum gerade erstellten Cluster (2). Führen Sie dafür den folgenden Befehl aus. Dadurch wird kubectl auf den richtigen Cluster verwiesen.
gcloud container clusters get-credentials traffic-director-cluster \ --zone us-central1-a
GKE/Kubernetes-Dienste konfigurieren
In diesem Abschnitt wird gezeigt, wie Sie die Kubernetes-Bereitstellungsspezifikationen auf die Zusammenarbeit mit Cloud Service Mesh vorbereiten. Dazu werden Dienste mit NEGs konfiguriert und Sidecar-Proxys in Pods eingefügt, die Zugriff auf die von Cloud Service Mesh verwalteten Dienste benötigen.
Firewallregel konfigurieren
Wenn Sie prüfen möchten, ob die Back-End-Pods ausgeführt werden, müssen Sie eine Firewallregel konfigurieren, die die IP-Adressbereiche der Systemdiagnose zulässt.
Console
- Rufen Sie in der Google Cloud Console die Seite Firewallrichtlinien auf.
Zur Seite „Firewall-Richtlinien“ - Klicken Sie auf Firewallregeln erstellen.
- Geben Sie auf der Seite Firewallregel erstellen die folgenden Informationen an:
- Name: Geben Sie einen Namen für die Regel an. Verwenden Sie für dieses Beispiel
fw-allow-health-checks
. - Netzwerk: Wählen Sie ein VPC-Netzwerk aus.
- Priorität: Geben Sie eine Zahl für die Priorität ein. Niedrigere Zahlen haben höhere Prioritäten. Achten Sie darauf, dass die Firewallregel eine höhere Priorität hat als andere Regeln, die möglicherweise eingehenden Traffic ablehnen.
- Traffic-Richtung: Wählen Sie eingehend aus.
- Aktion bei Übereinstimmung: Wählen Sie Zulassen aus.
- Ziele: Wählen Sie Alle Instanzen im Netzwerk aus.
- Quellfilter: Wählen Sie den richtigen IP-Bereichstyp aus.
- Quell-IP-Bereiche:
35.191.0.0/16,130.211.0.0/22
- Zielfilter: Wählen Sie den IP-Typ aus.
- Protokolle und Ports: Klicken Sie auf Angegebene Ports und Protokolle und setzen Sie ein Häkchen bei
tcp
. TCP ist das zugrunde liegende Protokoll für alle Systemdiagnose-Protokolle. - Klicken Sie auf Erstellen.
- Name: Geben Sie einen Namen für die Regel an. Verwenden Sie für dieses Beispiel
gcloud
Erstellen Sie mit dem folgenden
gcloud
-Befehl eine Firewallregel mit dem Namenfw-allow-health-checks
, die eingehende Verbindungen zu Instanzen in Ihrem Netzwerk mit dem Tagallow-health-checks
zulässt. Ersetzen Sie NETWORK_NAME durch den Namen Ihres Netzwerks.gcloud compute firewall-rules create fw-allow-health-checks \ --network NETWORK_NAME \ --action ALLOW \ --direction INGRESS \ --source-ranges 35.191.0.0/16,130.211.0.0/22 \ --rules tcp
Weitere Informationen finden Sie unter Erforderliche Firewallregeln.
GKE/Kubernetes-Dienste mit NEGs konfigurieren
GKE-Dienste müssen über Netzwerk-Endpunktgruppen (NEGs) verfügbar gemacht werden, damit Sie sie als Back-Ends eines Cloud Service Mesh-Back-End-Dienstes konfigurieren können. Fügen Sie der Kubernetes-Dienstspezifikation die NEG-Annotation hinzu und wählen Sie einen Namen aus, indem Sie NEG-NAME
im Beispiel unten ersetzen, damit Sie sie später leicht wiederfinden. Sie benötigen den Namen, wenn Sie die NEG an Ihren Cloud Service Mesh-Back-End-Dienst anhängen. Weitere Informationen zum Annotieren von NEGs finden Sie unter NEGs benennen.
... metadata: annotations: cloud.google.com/neg: '{"exposed_ports": {"80":{"name": "NEG-NAME"}}}' spec: ports: - port: 80 name: service-test protocol: TCP targetPort: 8000
Für jeden Dienst wird eine eigenständige NEG erstellt, deren Endpunkte die IP-Adressen und Ports des Pods sind. Weitere Informationen und Beispiele finden Sie unter Standalone-Netzwerk-Endpunktgruppen.
Zu Demonstrationszwecken können Sie einen Beispieldienst bereitstellen, der seinen Hostnamen über HTTP an Port 80 sendet:
wget -q -O - \ https://storage.googleapis.com/traffic-director/demo/trafficdirector_service_sample.yaml \ | kubectl apply -f -
Prüfen Sie, ob der neue Diensthostname erstellt wurde und der Anwendungs-Pod ausgeführt wird:
kubectl get svc
Dadurch wird Folgendes zurückgegeben:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service-test ClusterIP 10.71.9.71 none 80/TCP 41m [..skip..]
kubectl get pods
Dadurch wird Folgendes zurückgegeben:
NAME READY STATUS RESTARTS AGE app1-6db459dcb9-zvfg2 1/1 Running 0 6m [..skip..]
Name der NEG speichern
Suchen Sie die NEG, die im obigen Beispiel erstellt wurde, und notieren Sie den Namen der NEG.
Console
Sie können sich eine Liste der Netzwerk-Endpunktgruppen anzeigen lassen. Rufen Sie dazu die Seite "Netzwerk-Endpunktgruppen" in der Google Cloud Console auf.
Zur Seite Netzwerk-Endpunktgruppen
gcloud
gcloud compute network-endpoint-groups list
Es wird Folgendes zurückgegeben:
NAME LOCATION ENDPOINT_TYPE SIZE NEG-NAME us-central1-a GCE_VM_IP_PORT 1
Speichern Sie den NEG-Namen in der Variablen NEG_NAME
. Beispiel:
NEG_NAME=$(gcloud compute network-endpoint-groups list \ | grep service-test | awk '{print $1}')
Google Cloud-Load Balancing-Komponenten für Cloud Service Mesh konfigurieren
Mit den Anleitungen in diesem Abschnitt wird dafür gesorgt, dass GKE-Dienste über die Dienst-VIP zugänglich sind, bei der das Load Balancing durch Cloud Service Mesh erfolgt. Dabei wird eine Load-Balancing-Konfiguration verwendet, die anderen Google Cloud Load Balancing-Produkten ähnelt.
Sie müssen die folgenden Komponenten konfigurieren:
- Systemdiagnose Weitere Informationen zu Systemdiagnosen finden Sie unter Konzepte der Systemdiagnose und Systemdiagnosen erstellen.
- Back-End-Dienst Weitere Informationen zu Back-End-Diensten finden Sie unter Back-End-Dienste.
- Eine Routingregel. Dies umfasst das Erstellen einer Weiterleitungsregel und einer URL-Zuordnung. Weitere Informationen finden Sie unter Weiterleitungsregeln verwenden und URL-Zuordnungen verwenden.
Im folgenden Konfigurationsbeispiel für Cloud Service Mesh werden diese Annahmen getroffen:
- Die NEGs und alle anderen Ressourcen werden im
default
-Netzwerk mit automatischem Modus in der Zoneus-central1-a
erstellt. - Der NEG-Name für den Cluster wird in der Variable
${NEG_NAME}
gespeichert.
Systemdiagnose erstellen
Erstellen Sie die Systemdiagnose:
Console
- Rufen Sie in der Google Cloud Console die Seite "Systemdiagnosen" auf.
Zur Seite "Systemdiagnosen" - Klicken Sie auf Systemdiagnose erstellen.
- Geben Sie als Name
td-gke-health-check
ein. - Wählen Sie als Protokoll HTTP aus.
- Klicken Sie auf Erstellen.
gcloud
gcloud compute health-checks create http td-gke-health-check \ --use-serving-port
Back-End-Dienst erstellen
Erstellen Sie einen globalen Backend-Dienst mit dem Load-Balancing-Schema INTERNAL_SELF_MANAGED. In der Google Cloud Console wird das Load-Balancing-Schema implizit festgelegt. Binden Sie die Systemdiagnose in den Backend-Dienst ein.
Console
Rufen Sie in der Google Cloud Console die Seite Cloud Service Mesh auf.
Klicken Sie auf dem Tab Dienste auf Dienst erstellen.
Klicken Sie auf Weiter.
Geben Sie als Dienstname
td-gke-service
ein.Wählen Sie unter Back-End-Typ Netzwerk-Endpunktgruppen aus.
Wählen Sie die erstellte Netzwerk-Endpunktgruppe aus.
Legen Sie die Maximale Anzahl der Anfragen pro Sekunde auf
5
fest.Klicken Sie auf Fertig.
Wählen Sie unter Systemdiagnose
td-gke-health-check
aus. Dies ist die Systemdiagnose, die Sie erstellt haben.Klicken Sie auf Weiter.
gcloud
Erstellen Sie den Back-End-Dienst und verknüpfen Sie die Systemdiagnose mit dem Back-End-Dienst.
gcloud compute backend-services create td-gke-service \ --global \ --health-checks td-gke-health-check \ --load-balancing-scheme INTERNAL_SELF_MANAGED
Fügen Sie dem Back-End-Dienst die Back-End-NEGs hinzu.
gcloud compute backend-services add-backend td-gke-service \ --global \ --network-endpoint-group ${NEG_NAME} \ --network-endpoint-group-zone us-central1-a \ --balancing-mode RATE \ --max-rate-per-endpoint 5
Routingregelzuordnung erstellen
Folgen Sie dieser Anleitung, um die Routingregel, die Weiterleitungsregel und die interne IP-Adresse für Ihre Cloud Service Mesh-Konfiguration zu erstellen.
Der an die interne IP-Adresse gesendete Traffic wird vom Envoy-Proxy abgefangen und gemäß den Host- und Pfadregeln an den entsprechenden Dienst gesendet.
Die Weiterleitungsregel wird als globale Weiterleitungsregel erstellt, wobei load-balancing-scheme
auf INTERNAL_SELF_MANAGED
gesetzt ist.
Sie können die Adresse Ihrer Weiterleitungsregel auf 0.0.0.0
festlegen. Dabei wird der Traffic basierend auf dem in der URL-Zuordnung konfigurierten HTTP-Hostnamen und den Pfadinformationen weitergeleitet, unabhängig von der tatsächlichen IP-Adresse, in die der Hostname aufgelöst wird.
In diesem Fall müssen die URLs (Hostname und URL-Pfad) Ihrer Dienste gemäß den Hostregeln in der Service Mesh-Konfiguration eindeutig sein. Sie können z. B. nicht zwei verschiedene Dienste mit unterschiedlichen Back-Ends haben, die beide dieselbe Kombination aus Hostname und Pfad verwenden.
Alternativ können Sie das Routing basierend auf der tatsächlichen Ziel-VIP des Dienstes aktivieren. Wenn Sie die VIP Ihres Dienstes als address
-Parameter der Weiterleitungsregel konfigurieren, werden anhand der in der URL-Zuordnung angegebenen HTTP-Parameter nur Anfragen an diese IP-Adresse weitergeleitet.
Console
In der Console wird der Zielproxy mit der Weiterleitungsregel kombiniert. Wenn Sie die Weiterleitungsregel erstellen, erstellt Google Cloud automatisch einen Ziel-HTTP-Proxy und verknüpft ihn mit der URL-Zuordnung.
Die Routingregel besteht aus der Weiterleitungsregel und den Host- und Pfadregeln (auch als URL-Zuordnung bezeichnet).
Rufen Sie in der Google Cloud Console die Seite Cloud Service Mesh auf.
Klicken Sie auf Routingregelzuordnungen.
Klicken Sie auf Routingregel erstellen.
Geben Sie als Name der URL-Zuordnung
td-gke-url-map
ein.Klicken Sie auf Weiterleitungsregel hinzufügen.
Geben Sie als Name für die Weiterleitungsregel
td-gke-forwarding-rule
ein.Wählen Sie das Netzwerk aus.
Wählen Sie Ihre Interne IP-Adresse aus.
Klicken Sie auf Speichern.
Fügen Sie optional benutzerdefinierte Host- und Pfadregeln hinzu oder behalten Sie die Pfadregeln als Standard bei.
Legen Sie den Host auf
service-test
fest.Klicken Sie auf Speichern.
gcloud
Erstellen Sie eine URL-Zuordnung, die den Back-End-Dienst verwendet.
gcloud compute url-maps create td-gke-url-map \ --default-service td-gke-service
Erstellen Sie ein Tool zum Abgleich von Pfaden für URL-Zuordnungen und eine Hostregel, um den Traffic für Ihren Dienst auf Grundlage des Hostnamens und Pfads weiterzuleiten. In diesem Beispiel werden
service-test
als Dienstname und ein Standardtool zum Abgleich von Pfaden verwendet, das mit allen Pfadanfragen für diesen Host (/*
) übereinstimmt.service-test
ist auch der konfigurierte Name des Kubernetes-Dienstes, der in der obigen Beispielkonfiguration verwendet wird.gcloud compute url-maps add-path-matcher td-gke-url-map \ --default-service td-gke-service \ --path-matcher-name td-gke-path-matcher
gcloud compute url-maps add-host-rule td-gke-url-map \ --hosts service-test \ --path-matcher-name td-gke-path-matcher
Erstellen Sie den Ziel-HTTP-Proxy.
gcloud compute target-http-proxies create td-gke-proxy \ --url-map td-gke-url-map
Erstellen Sie die Weiterleitungsregel.
gcloud compute forwarding-rules create td-gke-forwarding-rule \ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGED \ --address=0.0.0.0 \ --target-http-proxy=td-gke-proxy \ --ports 80 --network default
Zu diesem Zeitpunkt ist Cloud Service Mesh so konfiguriert, dass das Load Balancing des Traffics für die in der URL-Zuordnung angegebenen Dienste über Back-Ends in der Netzwerk-Endpunktgruppe erfolgt.
Je nachdem, wie Ihre Mikrodienste in Ihrem Netzwerk verteilt sind, müssen Sie möglicherweise weitere Weiterleitungsregeln oder weitere Host- und Pfadregeln zur URL-Zuordnung hinzufügen.
Konfiguration durch Bereitstellung eines Beispielclients für Tests prüfen
In diesem Abschnitt wird gezeigt, wie Sie Cloud Service Mesh-Back-Ends über eine Clientanwendung erreichen.
Zur Veranschaulichung der Funktionalität können Sie einen Beispiel-Pod mit Busybox bereitstellen. Der Pod hat Zugriff auf service-test
, der im vorherigen Abschnitt erstellt wurde, und empfängt Traffic, bei dem das Load Balancing durch Cloud Service Mesh erfolgt.
Sidecar-Proxy in GKE/Kubernetes-Pods einfügen
Für den Zugriff auf einen von Cloud Service Mesh verwalteten Dienst muss ein xDS API-kompatibler Sidecar-Proxy auf einem Pod installiert sein.
In diesem Beispiel stellen Sie einen Busybox-Client mit einem Istio-Proxy-Sidecar und init-Containern bereit, die mithilfe der Referenzspezifikation zur Bereitstellung hinzugefügt wurden:
Wenn Sie die älteren APIs verwenden, ersetzen Sie die Variablen PROJECT_NUMBER und NETWORK_NAME durch Ihre Projektnummer und Ihren Netzwerknamen:
wget -q -O - https://storage.googleapis.com/traffic-director/demo/trafficdirector_client_sample_xdsv3.yaml sed -i "s/PROJECT_NUMBER/PROJECT_NUMBER/g" trafficdirector_client_sample_xdsv3.yaml sed -i "s/NETWORK_NAME/NETWORK_NAME/g" trafficdirector_client_sample_xdsv3.yaml kubectl apply -f trafficdirector_client_sample_xdsv3.yaml
Wenn Sie die neuen Service Routing APIs verwenden, die sich derzeit in der Vorschau befinden, ersetzen Sie die Variablen PROJECT_NUMBER und MESH_NAME durch die Projektnummer und den Mesh
-Namen:
wget -q -O - https://storage.googleapis.com/traffic-director/demo/trafficdirector_client_new_api_sample_xdsv3.yaml sed -i "s/PROJECT_NUMBER/PROJECT_NUMBER/g" trafficdirector_client_new_api_sample_xdsv3.yaml sed -i "s/MESH_NAME/MESH_NAME/g" trafficdirector_client_new_api_sample_xdsv3.yaml kubectl apply -f trafficdirector_client_new_api_sample_xdsv3.yaml
Im Busybox-Pod sind zwei Container aktiv. Der erste Container ist der Client, der auf dem Busybox-Image beruht, und der zweite Container ist der als Sidecar eingefügte Envoy-Proxy. Mit dem folgenden Befehl können Sie weitere Informationen zum Pod abrufen:
kubectl describe pods -l run=client
Auf Backend-Dienst zugreifen
Nach der Konfiguration haben Anwendungen auf Pods mit eingefügtem Sidecar-Proxy Zugriff auf von Cloud Service Mesh-Diensten verwaltete Dienste. Zum Prüfen der Konfiguration können Sie in einem der Container auf eine Shell zugreifen.
Wenn Sie die in dieser Anleitung enthaltene Demokonfiguration verwendet haben, können Sie mit dem folgenden Befehl prüfen, ob der Hostname des Bereitstellungs-Pods zurückgegeben wird.
# Get name of the Pod with busybox. BUSYBOX_POD=$(kubectl get po -l run=client -o=jsonpath='{.items[0].metadata.name}') # Command to execute that tests connectivity to the service service-test. TEST_CMD="wget -q -O - service-test; echo" # Execute the test command on the Pod . kubectl exec -it $BUSYBOX_POD -c busybox -- /bin/sh -c "$TEST_CMD"
Informationen zum Abfangen von Traffic durch den Sidecar-Proxy
Wenn der Busybox-Client in diesem Beispiel Anfragen an den Back-End-Dienst stellt, wird jede Anfrage vom Sidecar-Proxy weitergeleitet.
Diese Demoanwendung verwendet den Envoy-Proxy. Aus diesem Grund sieht der Client "server: envoy" im Header der Serverantworten.
Verwenden Sie zur Bestätigung die folgenden Befehle:
# Get the name of the Pod with Busybox. BUSYBOX_POD=$(kubectl get po -l run=client -o=jsonpath='{.items[0].metadata.name}') # Command to send a request to service-test and output server response headers. TEST_CMD="wget -S --spider service-test; echo" # Execute the test command on the Pod . kubectl exec -it $BUSYBOX_POD -c busybox -- /bin/sh -c "$TEST_CMD"
In diesem Beispiel haben Sie eine Weiterleitungsregel mit der VIP-Adresse 0.0.0.0 erstellt.
Das bedeutet, dass Cloud Service Mesh Anfragen nur basierend auf dem Header Host
an das Back-End weiterleitet. In diesem Fall kann die Ziel-IP-Adresse eine beliebige Adresse sein, solange der Anfrage-Hostheader mit dem in der URL-Zuordnung service-test
definierten Host übereinstimmt.
Führen Sie die folgenden Testbefehle aus, um dies zu bestätigen:
# Get name of the Pod with Busybox. BUSYBOX_POD=$(kubectl get po -l run=client -o=jsonpath='{.items[0].metadata.name}') # Command to send a request to service-test setting the Host header and using a random IP address. TEST_CMD="wget -q --header 'Host: service-test' -O - 1.2.3.4; echo" # Execute the test command on the Pod . kubectl exec -it $BUSYBOX_POD -c busybox -- /bin/sh -c "$TEST_CMD"
Nächste Schritte
- Erweiterte Traffic-Verwaltung
- Informationen zur Fehlerbehebung bei Cloud Service Mesh-Bereitstellungen
- Beobachtbarkeit mit Envoy einrichten.