Kubernetes-Dienste mit Istio schützen


Diese Anleitung richtet sich an Kubernetes-Nutzer und -Administratoren, die mit dem Istio Service Mesh Kubernetes-Dienste sicher bereitstellen und gegenseitige TLS-Kommunikation (mTLS) ermöglichen möchten.

Istio und Cloud Service Mesh

Istio ist kein unterstütztes Google-Produkt. Wir empfehlen, stattdessen verwaltetes Cloud Service Mesh auszuführen. Weitere Informationen finden Sie unter Cloud Service Mesh auf einem GKE Autopilot-Cluster bereitstellen.

Cloud Service Mesh bietet die folgenden Vorteile:

  • Sie können verwaltetes Cloud Service Mesh mit der Fleet API ohne clientseitige Tools wie istioctl bereitstellen.
  • Cloud Service Mesh fügt automatisch Sidecar-Proxys in Arbeitslasten ein, ohne erhöhte Berechtigungen für Ihre Container zu gewähren.
  • Sie können umfangreiche Dashboards für Ihr Mesh-Netzwerk und Ihre Dienste ohne zusätzliche Konfiguration aufrufen und diese Messwerte dann verwenden, um Service Level Objectives (SLOs) und Benachrichtigungen zu konfigurieren und den Zustand Ihrer Anwendungen zu überwachen.
  • Die verwaltete Cloud Service Mesh-Steuerungsebene wird automatisch aktualisiert, damit Sie die neuesten Sicherheitspatches und Features erhalten.
  • Die von Cloud Service Mesh verwaltete Datenebene aktualisiert die Sidecar-Proxys in Ihren Arbeitslasten automatisch, sodass Sie Dienste nicht selbst neu starten müssen, wenn Proxy-Upgrades und Sicherheitspatches verfügbar sind.
  • Cloud Service Mesh ist ein unterstütztes Produkt und kann mit standardmäßigen Open-Source-Istio-APIs konfiguriert werden. Weitere Informationen finden Sie unter Unterstützte Funktionen.

Lernziele

Diese Anleitung umfasst die folgenden Schritte:

  • Erstellen Sie einen GKE Autopilot-Cluster.
  • Installieren Sie Istio mit dem istioctl-Befehlszeilentool.
  • Stellen Sie eine Beispielanwendung bereit, um die gegenseitige TLS-Authentifizierung (mTLS) zu testen.
  • Istio für die Verwendung der mTLS-Authentifizierung für die Dienst-zu-Dienst-Kommunikation mithilfe einer benutzerdefinierten PeerAuthentication-Ressource konfigurieren
  • Prüfen Sie die mTLS-Authentifizierung mit dem Kiali-Dashboard.

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.

Hinweise

Die Software, die Sie für diese Anleitung benötigen, ist in Cloud Shell vorinstalliert, einschließlich kubectl, gcloud CLI und Terraform. Wenn Sie Cloud Shell nicht verwenden, müssen Sie die gcloud CLI installieren.

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the GKE API:

    gcloud services enable container.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  10. Make sure that billing is enabled for your Google Cloud project.

  11. Enable the GKE API:

    gcloud services enable container.googleapis.com
  12. Grant roles to your user account. Run the following command once for each of the following IAM roles: roles/container.clusterAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="USER_IDENTIFIER" --role=ROLE
    • Replace PROJECT_ID with your project ID.
    • Replace USER_IDENTIFIER with the identifier for your user account. For example, user:myemail@example.com.

    • Replace ROLE with each individual role.

Umgebung vorbereiten

So richten Sie Ihre Umgebung ein:

  1. Legen Sie Umgebungsvariablen fest:

    export PROJECT_ID=PROJECT_ID
    gcloud config set project $PROJECT_ID
    gcloud config set compute/region us-central1
    

    Ersetzen Sie PROJECT_ID durch Ihre Google Cloud-Projekt-ID.

  2. Klonen Sie das GitHub-Repository:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
    
  3. Wechseln Sie in das Arbeitsverzeichnis:

    cd kubernetes-engine-samples/service-mesh/istio-tutorial
    

GKE-Cluster erstellen

Aktivieren Sie die Linux-Funktionen, die Istio benötigt: NET_RAW und NET_ADMIN. GKE Autopilot lässt NET_ADMIN nicht standardmäßig zu, aber Sie können NET_ADMIN mit dem Befehl --workload-policies=allow-net-admin in GKE-Versionen 1.27 und höher aktivieren:

gcloud container clusters create-auto istio-cluster \
    --location="us-central1" \
    --workload-policies="allow-net-admin"

Weitere Informationen zur Sicherheit von GKE Autopilot finden Sie unter Integrierte Sicherheitskonfigurationen.

Istio installieren

Sie können Istio mithilfe von Istioctl in einem GKE-Cluster installieren.

In dieser Anleitung installieren Sie Istio mit dem Standardkonfigurationsprofil, das für Produktionsbereitstellungen empfohlen wird.

  1. Installieren Sie Istio:

    export ISTIO_VERSION=1.20.2
    curl -L https://istio.io/downloadIstio | TARGET_ARCH=$(uname -m) sh -
    
  2. Fügen Sie das istioctl-Befehlszeilentool zum PATH hinzu:

    cd istio-${ISTIO_VERSION}
    export PATH=$PWD/bin:$PATH
    
  3. Installieren Sie Istio im Cluster:

    istioctl install --set profile="default" -y
    

    Dieser Schritt kann einige Minuten dauern.

  4. Warten Sie, bis die Istio-Pods bereit sind:

    watch kubectl get pods -n istio-system
    

    Die Ausgabe sieht in etwa so aus:

    NAME                                    READY   STATUS        RESTARTS   AGE
    istio-ingressgateway-5c47bff876-wjm96   1/1     Running       0          2m54s
    istiod-5fc7cb65cd-k8cp4                 1/1     Running       0          2m57s
    

    Wenn die Istio-Pods Running sind, kehren Sie zur Befehlszeile zurück. Drücken Sie dazu Ctrl+C.

Beispielanwendung bereitstellen

In diesem Abschnitt erstellen Sie mit der Beispielanwendung Bank of Cloud ein Service Mesh mit mTLS-Authentifizierung.

  1. Fügen Sie ein Namespace-Label hinzu, das Istio anweist, die automatische Einfügung von Envoy-Sidecar-Proxys zu aktivieren:

    kubectl label namespace default istio-injection=enabled
    
  2. Beispielanwendung bereitstellen:

    cd ..
    git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git
    kubectl apply -f bank-of-anthos/extras/jwt/jwt-secret.yaml
    kubectl apply -f bank-of-anthos/kubernetes-manifests/
    
  3. Warten Sie, bis die Anwendung bereit ist:

    watch kubectl get pods
    

    Die Ausgabe sieht in etwa so aus:

    NAME                                 READY   STATUS    RESTARTS   AGE
    accounts-db-0                        2/2     Running   0          2m16s
    balancereader-5c695f78f5-x4wlz       2/2     Running   0          3m8s
    contacts-557fc79c5-5d7fg             2/2     Running   0          3m7s
    frontend-7dd589c5d7-b4cgq            2/2     Running   0          3m7s
    ledger-db-0                          2/2     Running   0          3m6s
    ledgerwriter-6497f5cf9b-25c6x        2/2     Running   0          3m5s
    loadgenerator-57f6896fd6-lx5df       2/2     Running   0          3m5s
    transactionhistory-6c498965f-tl2sk   2/2     Running   0          3m4s
    userservice-95f44b65b-mlk2p          2/2     Running   0          3m4s
    

    Wenn die Pods den Wert Running haben, kehren Sie zur Befehlszeile zurück. Drücken Sie dazu Ctrl+C.

  4. Prüfen Sie das folgende Manifest:

    # Copyright 2020 Google LLC
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #      http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: frontend-gateway
    spec:
      selector:
        istio: ingressgateway # use Istio default gateway implementation
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: frontend-ingress
    spec:
      hosts:
      - "*"
      gateways:
      - frontend-gateway
      http:
      - route:
        - destination:
            host: frontend
            port:
              number: 80

    Dieses Manifest beschreibt die Istio-Gateway- und VirtualService-Ressourcen, die die Anwendung bereitstellen und Istio als Ingress-Controller verwenden.

  5. Wenden Sie das Manifest auf Ihren Cluster an:

    kubectl apply -f bank-of-anthos/extras/istio/frontend-ingress.yaml
    

mTLS konfigurieren

Die gegenseitige TLS-Authentifizierung (mTLS) ist in Istio standardmäßig aktiviert. Das bedeutet, dass Istio Serverarbeitslasten überwacht, die zu Istio-Proxys migriert wurden, und automatisch Clientproxys konfiguriert, um mTLS-Verbindungen mit diesen Arbeitslasten herzustellen. Istio konfiguriert auch Clientproxys, die mTLS nicht verwenden, wenn eine Verbindung zu Arbeitslasten ohne Sidecar-Proxys hergestellt wird.

Istio kann mTLS für die Funktionsweise in drei Modi konfigurieren:

  • PERMISSIVE: Arbeitslasten akzeptieren sowohl mTLS- als auch Nur-Text-Traffic.
  • STRICT: Arbeitslasten akzeptieren nur mTLS-Traffic.
  • DISABLE: mTLS ist deaktiviert. Verwenden Sie diesen Modus, wenn Sie Ihre eigene Sicherheitslösung verwenden möchten.

Sie können die mTLS-Konfiguration global, pro Namespace oder pro Arbeitslast anwenden. In dieser Anleitung wenden Sie die Konfiguration mit dem mTLS-Modus STRICT pro Namespace an.

  1. Prüfen Sie das folgende Manifest:

    apiVersion: security.istio.io/v1beta1
    kind: PeerAuthentication
    metadata:
      name: default
    spec:
      mtls:
          mode: STRICT

    Dieses Manifest beschreibt eine benutzerdefinierte Istio-Ressource für die Peer-Authentifizierung.

  2. Wenden Sie das Manifest auf Ihren Cluster an:

    kubectl apply -f peer-authentication.yaml
    

Weitere Informationen zu mTLS in Istio finden Sie unter Gegenseitige TLS-Authentifizierung.

Prüfen, ob mTLS aktiviert ist

Kiali ist ein webbasiertes Dashboard zur Beobachtbarkeit für das Service Mesh von Istio, das eine grafische Ansicht Ihrer Mikrodienstumgebung bietet, sodass Sie Ihre Anwendungen überwachen und Fehler beheben können. Mit Kiali können Sie prüfen, ob die mTLS-Authentifizierung im Istio Service Mesh aktiviert ist und ordnungsgemäß funktioniert. Kiali benötigt Prometheus als Telemetriedatenquelle. In dieser Anleitung wird Google Cloud Managed Service for Prometheus verwendet.

Abfrageschnittstelle installieren

  1. Erstellen Sie ein IAM-Dienstkonto mit der roles/monitoring.viewer, damit die Abfrageschnittstelle auf Messwerte zugreifen kann:

    gcloud iam service-accounts create monitoring \
        --display-name="Service account for query interface"
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member "serviceAccount:monitoring@PROJECT_ID.iam.gserviceaccount.com" \
        --role roles/monitoring.viewer
    gcloud iam service-accounts add-iam-policy-binding \
      monitoring@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[monitoring/default]"
    
  2. Erstellen Sie einen Kubernetes-Namespace:

    kubectl create namespace monitoring
    
  3. Annotieren Sie das Kubernetes-Standarddienstkonto im Namespace, um die Workload Identity-Föderation für GKE zu konfigurieren:

    kubectl annotate serviceaccount -n monitoring default \
        iam.gke.io/gcp-service-account=monitoring@PROJECT_ID.iam.gserviceaccount.com --overwrite
    
  4. Stellen Sie die Arbeitslast der Abfrageschnittstelle bereit:

    kubectl -n monitoring apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.7.1/examples/frontend.yaml
    
  5. Prüfen Sie das folgende Manifest:

    apiVersion: monitoring.googleapis.com/v1
    kind: PodMonitoring
    metadata:
      name: istiod
      namespace: istio-system
    spec:
      selector:
        matchLabels:
          app: istiod
      endpoints:
      - port: 15014
        path: /metrics
        timeout: 30s
        interval: 60s

    Dieses Manifest beschreibt eine PodMonitoring-Ressource, die Istio- und Envoy-Proxy-Messwerte erfasst.

  6. Wenden Sie das Manifest auf Ihren Cluster an:

    kubectl apply -f pod-monitorings.yaml
    
  7. Rufen Sie einen Link zur Beispielanwendung ab:

    INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    echo "http://$INGRESS_HOST"
    
  8. Öffnen Sie den Link, um die Beispielanwendung zu sehen. Melden Sie sich mit dem Standardnutzernamen und -passwort an, um Traffic zwischen den Mikrodiensten zu generieren.

Kiali installieren

Wir empfehlen die Installation von Kiali mit dem Kiali-Operator.

  1. Installieren Sie den Kiali-Operator:

    helm repo add kiali https://kiali.org/helm-charts
    helm repo update
    helm install \
        --namespace kiali-operator \
        --create-namespace \
        kiali-operator \
        kiali/kiali-operator
    
  2. Prüfen Sie das folgende Manifest:

    apiVersion: kiali.io/v1alpha1
    kind: Kiali
    metadata:
      name: kiali
      namespace: istio-system
    spec:
      deployment:
        namespace: istio-system
      auth:
        strategy: anonymous
      external_services:
        custom_dashboards:
          prometheus:
            url: "http://frontend.monitoring:9090/"
            auth:
              type: none
        prometheus:
          url: "http://frontend.monitoring:9090/"
          auth:
            type: none
        tracing:
          enabled: false
        grafana:
          enabled: false

    Dieses Manifest beschreibt eine benutzerdefinierte Operator-Ressource, die den Kili-Server definiert.

  3. Wenden Sie das Manifest auf Ihren Cluster an:

    kubectl apply -f kiali.yaml
    
  4. Warten Sie, bis der Kiali-Server bereit ist:

    watch kubectl get pods -n istio-system
    

    Die Ausgabe sieht in etwa so aus:

    NAME                                    READY   STATUS    RESTARTS   AGE
    istio-ingressgateway-6845466857-92zp8   1/1     Running   0          9m11s
    istiod-6b47d84cf-4cqlt                  1/1     Running   0          12m
    

    Wenn die Pods den Wert Running haben, kehren Sie zur Befehlszeile zurück. Drücken Sie dazu Ctrl+C.

  5. Richten Sie die Portweiterleitung im Kiali-Serverdienst ein, um auf das Dashboard zuzugreifen:

    kubectl -n istio-system port-forward svc/kiali 8080:20001
    
  6. Öffnen Sie die Webvorschau. Wechseln Sie in Kiali zum Abschnitt Graph und wählen Sie im Drop-down-Menü Display die Option Security aus. In dieser Ansicht wird der Sicherheitsstatus jedes Knotens im Diagramm angezeigt. Knoten mit dem Logo mTLS aktiviert geben an, dass mTLS für diesen Dienst aktiviert ist. Knoten ohne das Logo geben an, dass mTLS nicht aktiviert ist.

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

Projekt löschen

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

Einzelne Ressourcen löschen

Wenn Sie ein vorhandenes Projekt verwendet haben und es nicht löschen möchten, können Sie die einzelnen Ressourcen löschen.

  1. Löschen Sie Kiali:

    kubectl -n istio-system delete kiali kiali
    helm uninstall --namespace kiali-operator kiali-operator
    
  2. Löschen Sie die Monitoring-Ressourcen:

    kubectl -n monitoring delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.7.1/examples/frontend.yaml
    
  3. Löschen Sie die Beispielanwendung:

    kubectl delete -f bank-of-anthos/extras/istio/frontend-ingress.yaml
    kubectl delete -f bank-of-anthos/kubernetes-manifests
    
  4. Deinstallieren Sie Istio:

    istioctl uninstall --purge -y
    
  5. Löschen Sie den GKE-Cluster:

    gcloud container clusters delete --region us-central1 istio-cluster --quiet
    

Nächste Schritte

  • Referenzarchitekturen, Diagramme und Best Practices zu Google Cloud kennenlernen. Weitere Informationen zu Cloud Architecture Center