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 (nur Software) für VMware
  • Google Distributed Cloud (nur Software) für Bare Metal
  • 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.

Hinweise

In dieser Anleitung wird davon ausgegangen, dass Sie Cloud Service Mesh mit asmcli install 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:

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.

  1. 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)")
    
  2. Erstellen Sie eine Umgebungsvariable für die Mesh-ID:

    export MESH_ID="proj-${PROJECT_NUMBER}"
    
  3. 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"
    
  4. 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
  5. 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 und CLUSTER_NAME_2 durch die Namen Ihrer Cluster.

  • Ersetzen Sie PATH_TO_KUBECONFIG_1 und PATH_TO_KUBECONFIG_2 durch die kubeconfig-Dateien für Ihre Cluster.

Anthos-Cluster

Mesh CA oder CA-Dienst

  1. 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-1215-7 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
    
  2. 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-1215-7 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=kubernetes -f -
    

Istio CA

  1. 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-1215-7 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    
  2. 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-1215-7 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    

Azure, AWS und angehängt

Mesh CA

  1. 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-1215-7 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    
  2. 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-1215-7 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_2 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    

Istio CA

  1. 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-1215-7 | \
        ./istioctl --kubeconfig=PATH_TO_KUBECONFIG_1 \
        install -y --set spec.values.global.pilotCertProvider=istiod -f -
    
  2. 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-1215-7 | \
        ./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.

  1. 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
    
  2. 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

  1. Erstellen Sie den Beispiel-Namespace in jedem Cluster.

    for CTX in ${CTX_1} ${CTX_2}
    do
        kubectl create --context=${CTX} namespace sample
    done
    
  2. Aktivieren Sie die Sidecar-Injektion für erstellte Namespaces.

    Empfohlen: Führen Sie den folgenden Befehl aus, um das Standard-Injektionslabel auf den Namespace anzuwenden:

    for CTX in ${CTX_1} ${CTX_2}
    do
        kubectl label --context=${CTX} namespace sample \
            istio.io/rev- istio-injection=enabled --overwrite
    done
    

    Wir empfehlen die Verwendung der Standard-Injection, aber auch die revisionsbasierte Injection wird unterstützt: Folgen Sie dazu dieser Anleitung:

    1. Verwenden Sie den folgenden Befehl, um das Überarbeitungslabel für istiod zu finden:

      kubectl get deploy -n istio-system -l app=istiod -o \
          jsonpath={.items[*].metadata.labels.'istio\.io\/rev'}'{"\n"}'
      
    2. Wenden Sie das Überarbeitungslabel auf den Namespace an. Im folgenden Befehl ist REVISION_LABEL der Wert des Überarbeitungslabels istiod, den Sie im vorherigen Schritt notiert haben.

      for CTX in ${CTX_1} ${CTX_2}
      do
          kubectl label --context=${CTX} namespace sample \
              istio-injection- istio.io/rev=REVISION_LABEL --overwrite
      done
      

HelloWorld-Dienst installieren

  • 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

  1. Stellen Sie HelloWorld v1 in CLUSTER_1 und v2 in CLUSTER_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
  2. Prüfen Sie mit den folgenden Befehlen, ob HelloWorld v1 und v2 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

  1. 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
    
  2. 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:

  1. 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
    ...
  2. 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}