Multi-Cluster-Mesh-Netzwerk außerhalb von Google Cloud einrichten
In dieser Anleitung wird beschrieben, wie Sie ein Multi-Cluster-Mesh-Netzwerk für die folgenden Plattformen einrichten:
- Google Distributed Cloud
- Google Distributed Cloud
- GKE on Azure
- GKE on AWS
- Angehängte Cluster, einschließlich Amazon EKS-Cluster und Microsoft AKS-Cluster
In dieser Anleitung wird beschrieben, wie Sie zwei Cluster einrichten. Sie können den Vorgang jedoch erweitern und eine beliebige Anzahl von Clustern in Ihr Mesh-Netzwerk einbinden.
Hinweis
In dieser Anleitung wird davon ausgegangen, dass Sie Cloud Service Mesh mit asmcli install
installiert haben. Sie benötigen asmcli
und das Konfigurationspaket, das von asmcli
in das Verzeichnis heruntergeladen wird, das Sie bei der Ausführung von asmcli install
in --output_dir
angegeben haben.
Wenn Sie die Einrichtung vornehmen müssen, führen Sie die Schritte unter Abhängige Tools installieren und Cluster validieren aus, um Folgendes zu tun:
- Erforderliche Tools installieren
asmcli
herunterladen- Clusteradministratorberechtigungen erteilen
- Projekt und Cluster validieren
Sie benötigen Zugriff auf die kubeconfig-Dateien für alle Cluster, die Sie im Mesh-Netzwerk einrichten.
Umgebungsvariablen und Platzhalter einrichten
Sie benötigen die folgenden Umgebungsvariablen, wenn Sie das east-west-Gateway installieren.
Erstellen Sie eine Umgebungsvariable für die Projektnummer. Ersetzen Sie im folgenden Befehl FLEET_PROJECT_ID durch die Projekt-ID des Flottenhostprojekts.
export PROJECT_NUMBER=$(gcloud projects describe FLEET_PROJECT_ID \ --format="value(projectNumber)")
Erstellen Sie eine Umgebungsvariable für die Mesh-ID:
export MESH_ID="proj-${PROJECT_NUMBER}"
Erstellen Sie Umgebungsvariablen für die Clusternamen in dem Format, das
asmcli
erfordert.export CLUSTER_1="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_1" export CLUSTER_2="cn-FLEET_PROJECT_ID-global-CLUSTER_NAME_2"
Rufen Sie den Kontextnamen für die Cluster ab. Verwenden Sie dazu die Werte in der Spalte
NAME
in der Ausgabe dieses Befehls:kubectl config get-contexts
Legen Sie die Umgebungsvariablen auf die Namen des Clusterkontexts fest, der in dieser Anleitung in vielen Schritten verwendet wird:
export CTX_1=CLUSTER1_CONTEXT_NAME export CTX_2=CLUSTER2_CONTEXT_NAME
east-west-Gateway installieren
Tun Sie dazu in den folgenden Befehlen Folgendes:
Ersetzen Sie
CLUSTER_NAME_1
undCLUSTER_NAME_2
durch die Namen Ihrer Cluster.Ersetzen Sie
PATH_TO_KUBECONFIG_1
undPATH_TO_KUBECONFIG_2
durch die kubeconfig-Dateien für Ihre Cluster.
Anthos-Cluster
Mesh CA oder CA-Dienst
Gateway in cluster1 installieren, das für Folgendes vorgesehen ist: Ost-West-Traffic an
$CLUSTER_2
. Standardmäßig ist dieses Gateway im Internet öffentlich zugänglich. Für Produktionssysteme sind möglicherweise zusätzliche Zugriffseinschränkungen erforderlich, z. B. Firewallregeln, um externe Angriffe zu verhindern.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1233-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
Installieren Sie ein Gateway in
$CLUSTER_2
, das für den east-west-Traffic für$CLUSTER_1
reserviert ist.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1233-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
Istio CA
Installieren Sie ein Gateway in cluster1 speziell für east-west-Traffic an
$CLUSTER_2
. Standardmäßig ist dieses Gateway im Internet öffentlich zugänglich. Für Produktionssysteme sind möglicherweise zusätzliche Zugriffseinschränkungen erforderlich, z. B. Firewallregeln, um externe Angriffe zu verhindern.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1233-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Installieren Sie ein Gateway in
$CLUSTER_2
, das für den east-west-Traffic für$CLUSTER_1
reserviert ist.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1233-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Azure, AWS und angehängt
Mesh CA
Installieren Sie ein Gateway in cluster1 speziell für east-west-Traffic an
$CLUSTER_2
. Standardmäßig ist dieses Gateway im Internet öffentlich zugänglich. Für Produktionssysteme sind möglicherweise zusätzliche Zugriffseinschränkungen erforderlich, z. B. Firewallregeln, um externe Angriffe zu verhindern.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1233-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Installieren Sie ein Gateway in
$CLUSTER_2
, das für den east-west-Traffic für$CLUSTER_1
reserviert ist.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1233-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Istio CA
Gateway in cluster1 installieren, das für Folgendes vorgesehen ist: Ost-West-Traffic an
$CLUSTER_2
. Standardmäßig ist dieses Gateway im Internet öffentlich zugänglich. Für Produktionssysteme sind möglicherweise zusätzliche Zugriffseinschränkungen erforderlich, z. B. Firewallregeln, um externe Angriffe zu verhindern.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_1} \ --network default \ --revision asm-1233-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Installieren Sie ein Gateway in
$CLUSTER_2
, das für den east-west-Traffic für$CLUSTER_1
reserviert ist.asm/istio/expansion/gen-eastwest-gateway.sh \ --mesh ${MESH_ID} \ --cluster ${CLUSTER_2} \ --network default \ --revision asm-1233-2 | \ ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \ install -y --set spec.values.global.pilotCertProvider=istiod -f -
Verfügbar machende Dienste
Da sich die Cluster in separaten Netzwerken befinden, müssen Sie alle Dienste (*.local
) auf dem east-west-Gateway in beiden Clustern verfügbar machen. Während dieses Gateway öffentlich im Internet verfügbar ist, können Dienste nur mit Diensten mit einem vertrauenswürdigen mTLS-Zertifikat und einer Arbeitslast-ID aufgerufen werden, genauso wie sie sich im selben Netzwerk befinden.
Machen Sie Dienste über das east-west-Gateway für
CLUSTER_NAME_1
verfügbar.kubectl --kubeconfig=PATH_TO_KUBECONFIG_1 apply -n istio-system -f \ asm/istio/expansion/expose-services.yaml
Machen Sie Dienste über das east-west-Gateway für
CLUSTER_NAME_2
verfügbar.kubectl --kubeconfig=PATH_TO_KUBECONFIG_2 apply -n istio-system -f \ asm/istio/expansion/expose-services.yaml
Endpunkterkennung aktivieren
Führen Sie den Befehl asmcli create-mesh
aus, um die Endpunkterkennung zu aktivieren. In diesem Beispiel werden nur zwei Cluster gezeigt. Sie können aber den Befehl ausführen, um die Endpunkterkennung für zusätzliche Cluster zu aktivieren, wobei das GKE Hub-Dienstlimit gilt.
./asmcli create-mesh \
FLEET_PROJECT_ID \
PATH_TO_KUBECONFIG_1 \
PATH_TO_KUBECONFIG_2
Multicluster-Konnektivität prüfen
In diesem Abschnitt wird erläutert, wie Sie die Beispieldienste HelloWorld
und Sleep
in Ihrer Multi-Cluster-Umgebung bereitstellen, um zu überprüfen, ob das clusterübergreifende Load-Balancing funktioniert.
Sidecar-Injektion aktivieren
Suchen Sie den Wert des Überarbeitungslabels, den Sie in späteren Schritten verwenden.
Ermitteln Sie mit folgendem Befehl das Überarbeitungslabel, das Sie in späteren Schritten verwenden werden.
kubectl -n istio-system get pods -l app=istiod --show-labels
Die Ausgabe sieht dann ungefähr so aus:
NAME READY STATUS RESTARTS AGE LABELS istiod-asm-173-3-5788d57586-bljj4 1/1 Running 0 23h app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586 istiod-asm-173-3-5788d57586-vsklm 1/1 Running 1 23h app=istiod,istio.io/rev=asm-173-3,istio=istiod,pod-template-hash=5788d57586
Notieren Sie sich den Wert des Überarbeitungslabels istiod
aus der Ausgabe in der Spalte LABELS
, das auf das Präfix istio.io/rev=
folgt. In diesem Beispiel ist der Wert asm-173-3
. Verwenden Sie den Überarbeitungswert in den Schritten im nächsten Abschnitt.
HelloWorld-Dienst installieren
Erstellen Sie den Beispiel-Namespace und die Dienstdefinition in jedem Cluster. Ersetzen Sie im folgenden Befehl REVISION durch das Überarbeitungslabel
istiod
, das Sie im vorherigen Schritt notiert haben.for CTX in ${CTX_1} ${CTX_2} do kubectl create --context=${CTX} namespace sample kubectl label --context=${CTX} namespace sample \ istio-injection- istio.io/rev=REVISION --overwrite done
Dabei ist REVISION das Versionslabel
istiod
, das Sie zuvor notiert haben.Die Ausgabe sieht so aus:
label "istio-injection" not found. namespace/sample labeled
Sie können
label "istio-injection" not found.
ignorieren.Erstellen Sie in beiden Clustern den HelloWorld-Dienst:
kubectl create --context=${CTX_1} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n sample
kubectl create --context=${CTX_2} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l service=helloworld -n sample
HelloWorld v1 und v2 in jedem Cluster bereitstellen
Stellen Sie
HelloWorld v1
inCLUSTER_1
undv2
inCLUSTER_2
bereit. Das erleichtert später die Prüfung des clusterübergreifenden Load-Balancings.kubectl create --context=${CTX_1} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l version=v1 -n sample
kubectl create --context=${CTX_2} \ -f ${SAMPLES_DIR}/samples/helloworld/helloworld.yaml \ -l version=v2 -n sample
Prüfen Sie mit den folgenden Befehlen, ob
HelloWorld v1
undv2
ausgeführt werden. Prüfen Sie, ob die Ausgabe in etwa so aussieht:kubectl get pod --context=${CTX_1} -n sample
NAME READY STATUS RESTARTS AGE helloworld-v1-86f77cd7bd-cpxhv 2/2 Running 0 40s
kubectl get pod --context=${CTX_2} -n sample
NAME READY STATUS RESTARTS AGE helloworld-v2-758dd55874-6x4t8 2/2 Running 0 40s
Sleep-Dienst bereitstellen
Stellen Sie den
Sleep
-Dienst in beiden Clustern bereit. Dieser Pod generiert künstlichen Netzwerktraffic zur Veranschaulichung:for CTX in ${CTX_1} ${CTX_2} do kubectl apply --context=${CTX} \ -f ${SAMPLES_DIR}/samples/sleep/sleep.yaml -n sample done
Warten Sie, bis der
Sleep
-Dienst in jedem Cluster gestartet wurde. Prüfen Sie, ob die Ausgabe in etwa so aussieht:kubectl get pod --context=${CTX_1} -n sample -l app=sleep
NAME READY STATUS RESTARTS AGE sleep-754684654f-n6bzf 2/2 Running 0 5s
kubectl get pod --context=${CTX_2} -n sample -l app=sleep
NAME READY STATUS RESTARTS AGE sleep-754684654f-dzl9j 2/2 Running 0 5s
Clusterübergreifendes Load-Balancing prüfen
Rufen Sie den HelloWorld
-Dienst mehrmals auf und prüfen Sie die Ausgabe, um abwechselnde Antworten von v1 und v2 zu prüfen:
Rufen Sie den Dienst
HelloWorld
auf:kubectl exec --context="${CTX_1}" -n sample -c sleep \ "$(kubectl get pod --context="${CTX_1}" -n sample -l \ app=sleep -o jsonpath='{.items[0].metadata.name}')" \ -- /bin/sh -c 'for i in $(seq 1 20); do curl -sS helloworld.sample:5000/hello; done'
Die Ausgabe sollte in etwa so aussehen:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
Rufen Sie den Dienst
HelloWorld
noch einmal auf:kubectl exec --context="${CTX_2}" -n sample -c sleep \ "$(kubectl get pod --context="${CTX_2}" -n sample -l \ app=sleep -o jsonpath='{.items[0].metadata.name}')" \ -- /bin/sh -c 'for i in $(seq 1 20); do curl -sS helloworld.sample:5000/hello; done'
Die Ausgabe sollte in etwa so aussehen:
Hello version: v2, instance: helloworld-v2-758dd55874-6x4t8 Hello version: v1, instance: helloworld-v1-86f77cd7bd-cpxhv ...
Sie haben Ihr Cloud Service Mesh mit Load Balancing und mehreren Clustern geprüft.
Bereinigen
Entfernen Sie nach der Prüfung des Load-Balancings die Dienste HelloWorld
und Sleep
aus dem Cluster.
kubectl delete ns sample --context ${CTX_1} kubectl delete ns sample --context ${CTX_2}