Proteggere i servizi Kubernetes con Istio

Questo tutorial è destinato agli utenti e agli amministratori di Kubernetes interessati a utilizzare il mesh di servizi Istio per eseguire il deployment sicuro dei servizi Kubernetes e abilitare la comunicazione mutual TLS (mTLS).

Istio e Cloud Service Mesh

Istio non è un prodotto Google supportato. Ti consigliamo invece di eseguire Cloud Service Mesh gestito. Per maggiori informazioni, consulta Provisioning di un control plane Cloud Service Mesh gestito su GKE.

Cloud Service Mesh offre i seguenti vantaggi:

  • Puoi eseguire il provisioning di Cloud Service Mesh gestito utilizzando l'API Fleet senza strumenti lato client come istioctl.
  • Cloud Service Mesh inserisce automaticamente i proxy sidecar nei workload senza concedere privilegi elevati ai tuoi container.
  • Puoi visualizzare dashboard avanzate per la tua mesh e i tuoi servizi senza alcuna configurazione aggiuntiva e poi utilizzare queste metriche per configurare gli obiettivi del livello di servizio (SLO) e gli avvisi per monitorare l'integrità delle tue applicazioni.
  • L'upgrade del control plane di Cloud Service Mesh gestito viene eseguito automaticamente per garantire che tu riceva le patch di sicurezza e le funzionalità più recenti.
  • Il piano dati gestito di Cloud Service Mesh esegue automaticamente l'upgrade dei proxy sidecar nei tuoi carichi di lavoro, in modo da non dover riavviare manualmente i servizi quando sono disponibili upgrade del proxy e patch di sicurezza.
  • Cloud Service Mesh è un prodotto supportato e può essere configurato utilizzando le API Istio open source standard. Per saperne di più, consulta la pagina Funzionalità supportate.

Obiettivi

Questo tutorial include i seguenti passaggi:

  • Creare un cluster GKE Autopilot.
  • Installa Istio utilizzando lo strumento a riga di comando istioctl.
  • Esegui il deployment di un'applicazione di esempio per testare l'autenticazione TLS reciproca (mTLS).
  • Configura Istio per utilizzare l'autenticazione mTLS per la comunicazione tra servizi utilizzando una risorsa personalizzata PeerAuthentication.
  • Verifica l'autenticazione mTLS utilizzando la dashboard Kiali.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

I nuovi utenti di Google Cloud potrebbero avere diritto a una prova senza costi.

Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.

Prima di iniziare

Cloud Shell è preinstallato con il software necessario per questo tutorial, tra cui kubectl, gcloud CLI e Terraform. Se non utilizzi Cloud Shell, devi installare gcloud CLI.

  1. Accedi al tuo account Google Cloud . Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
  2. Installa Google Cloud CLI.

  3. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  4. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  5. Crea o seleziona un Google Cloud progetto.

    Ruoli richiesti per selezionare o creare un progetto

    • Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per il quale ti è stato concesso un ruolo.
    • Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto (roles/resourcemanager.projectCreator), che contiene l'autorizzazione resourcemanager.projects.create. Scopri come concedere i ruoli.
    • Creare un progetto Google Cloud :

      gcloud projects create PROJECT_ID

      Sostituisci PROJECT_ID con un nome per il progetto Google Cloud che stai creando.

    • Seleziona il progetto Google Cloud che hai creato:

      gcloud config set project PROJECT_ID

      Sostituisci PROJECT_ID con il nome del progetto Google Cloud .

  6. Verifica che la fatturazione sia abilitata per il tuo progetto Google Cloud .

  7. Abilita l'API GKE:

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo dei servizi (roles/serviceusage.serviceUsageAdmin), che include l'autorizzazione serviceusage.services.enable. Scopri come concedere i ruoli.

    gcloud services enable container.googleapis.com
  8. Installa Google Cloud CLI.

  9. Se utilizzi un provider di identità (IdP) esterno, devi prima accedere a gcloud CLI con la tua identità federata.

  10. Per inizializzare gcloud CLI, esegui questo comando:

    gcloud init
  11. Crea o seleziona un Google Cloud progetto.

    Ruoli richiesti per selezionare o creare un progetto

    • Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per il quale ti è stato concesso un ruolo.
    • Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto (roles/resourcemanager.projectCreator), che contiene l'autorizzazione resourcemanager.projects.create. Scopri come concedere i ruoli.
    • Creare un progetto Google Cloud :

      gcloud projects create PROJECT_ID

      Sostituisci PROJECT_ID con un nome per il progetto Google Cloud che stai creando.

    • Seleziona il progetto Google Cloud che hai creato:

      gcloud config set project PROJECT_ID

      Sostituisci PROJECT_ID con il nome del progetto Google Cloud .

  12. Verifica che la fatturazione sia abilitata per il tuo progetto Google Cloud .

  13. Abilita l'API GKE:

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo dei servizi (roles/serviceusage.serviceUsageAdmin), che include l'autorizzazione serviceusage.services.enable. Scopri come concedere i ruoli.

    gcloud services enable container.googleapis.com
  14. Concedi ruoli al tuo account utente. Esegui il seguente comando una volta per ciascuno dei seguenti ruoli IAM: roles/container.clusterAdmin

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto.
    • USER_IDENTIFIER: l'identificatore del tuo account utente . Ad esempio: myemail@example.com.
    • ROLE: il ruolo IAM che concedi al tuo account utente.

Prepara l'ambiente

Per configurare l'ambiente:

  1. Imposta le variabili di ambiente:

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

    Sostituisci PROJECT_ID con l'ID progetto Google Cloud.

  2. Clona il repository GitHub:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
    
  3. Passa alla directory di lavoro:

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

Crea un cluster GKE

Abilita le funzionalità Linux richieste da Istio: NET_RAW e NET_ADMIN. GKE Autopilot non consente NET_ADMIN per impostazione predefinita, ma puoi abilitare NET_ADMIN utilizzando il comando --workload-policies=allow-net-admin in GKE 1.27 e versioni successive:

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

Per scoprire di più sulla sicurezza di GKE Autopilot, consulta Configurazioni di sicurezza integrate.

Installa Istio

Puoi installare Istio su un cluster GKE utilizzando Istioctl.

In questo tutorial, installi Istio con il profilo di configurazione predefinito consigliato per i deployment di produzione.

  1. Installa Istio:

    • Per installare l'ultima versione di Istio:

      curl -L https://istio.io/downloadIstio | sh -
      
    • Per installare una versione specifica di Istio:

      export ISTIO_VERSION=VERSION_NUMBER
      curl -L https://istio.io/downloadIstio | TARGET_ARCH=$(uname -m) sh -
      

      Sostituisci VERSION_NUMBER con la versione di Istio che vuoi installare. Per informazioni sulle release di Istio, consulta Annunci delle release.

  2. Aggiungi lo strumento a riga di comando istioctl a PATH:

    cd istio-*
    export PATH=$PWD/bin:$PATH
    
  3. Installa Istio sul cluster:

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

    Questo passaggio potrebbe richiedere alcuni minuti.

  4. Attendi che i pod Istio siano pronti:

    watch kubectl get pods -n istio-system
    

    L'output è simile al seguente:

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

    Quando i pod Istio sono Running, torna alla riga di comando premendo Ctrl+C.

Esegui il deployment dell'applicazione di esempio

In questa sezione utilizzerai l'applicazione di esempio Bank of Anthos per creare un mesh di servizi con autenticazione mTLS.

  1. Aggiungi un'etichetta dello spazio dei nomi che indica a Istio di abilitare l'inserimento automatico dei proxy sidecar Envoy:

    kubectl label namespace default istio-injection=enabled
    
  2. Esegui il deployment dell'applicazione di esempio:

    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. Attendi che l'applicazione sia pronta:

    watch kubectl get pods
    

    L'output è simile al seguente:

    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
    

    Quando i pod sono Running, torna alla riga di comando premendo Ctrl+C.

  4. Esamina il seguente 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

    Questo manifest descrive le risorse Gateway e VirtualService di Istio che espongono l'applicazione e utilizzano Istio come controller Ingress.

  5. Applica il manifest al cluster:

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

Configura mTLS

L'autenticazione TLS reciproca (mTLS) è abilitata per impostazione predefinita in Istio. Ciò significa che Istio monitora i workload del server di cui è stata eseguita la migrazione ai proxy Istio e configura automaticamente i proxy client per stabilire connessioni mTLS con questi workload. Istio configura anche i proxy client in modo che non utilizzino mTLS quando si connettono ai workload senza proxy sidecar.

Istio può configurare mTLS per funzionare in tre modalità:

  • PERMISSIVE: i workload accettano sia il traffico mTLS che quello in testo non crittografato.
  • STRICT: i workload accettano solo il traffico mTLS.
  • DISABLE: mTLS è disattivato. Utilizza questa modalità se vuoi utilizzare la tua soluzione di sicurezza.

Puoi applicare la configurazione mTLS a livello globale, per spazio dei nomi o per workload. In questo tutorial, applichi la configurazione per spazio dei nomi utilizzando la modalità mTLS STRICT.

  1. Esamina il seguente manifest:

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

    Questo manifest descrive una risorsa personalizzata Istio di autenticazione peer.

  2. Applica il manifest al cluster:

    kubectl apply -f peer-authentication.yaml
    

Per saperne di più su mTLS in Istio, consulta Autenticazione TLS reciproca.

Verifica che mTLS sia abilitato

Kiali è una dashboard di osservabilità basata sul web per la mesh di servizi Istio che fornisce una visualizzazione grafica dell'ambiente di microservizi, consentendoti di monitorare e risolvere i problemi delle tue applicazioni. Puoi utilizzare Kiali per verificare che l'autenticazione mTLS sia attivata e funzioni correttamente nelmesh di servizih Istio. Kiali richiede Prometheus come origine dati di telemetria. Questo tutorial utilizza Google Cloud Managed Service per Prometheus.

Installare un'interfaccia di query

  1. Crea un account di servizio IAM con roles/monitoring.viewer per consentire all'interfaccia di query di accedere alle metriche:

    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. Crea uno spazio dei nomi Kubernetes:

    kubectl create namespace monitoring
    
  3. Aggiungi un'annotazione al account di servizio Kubernetes predefinito nello spazio dei nomi per configurare Workload Identity Federation for GKE:

    kubectl annotate serviceaccount -n monitoring default \
        iam.gke.io/gcp-service-account=monitoring@PROJECT_ID.iam.gserviceaccount.com --overwrite
    
  4. Esegui il deployment del carico di lavoro dell'interfaccia di query:

    kubectl -n monitoring apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.7.1/examples/frontend.yaml
    
  5. Esamina il seguente 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

    Questo manifest descrive una risorsa PodMonitoring che raccoglie le metriche di Istio e Envoy Proxy.

  6. Applica il manifest al cluster:

    kubectl apply -f pod-monitorings.yaml
    
  7. Ottieni un link all'applicazione di esempio:

    INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    echo "http://$INGRESS_HOST"
    
  8. Apri il link per visualizzare l'applicazione di esempio. Accedi con il nome utente e la password predefiniti per generare traffico tra i microservizi.

Installa Kiali

Ti consigliamo di installare Kiali utilizzando l'operatore Kiali.

  1. Installa l'operatore Kiali:

    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. Esamina il seguente 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

    Questo manifest descrive una risorsa personalizzata dell'operatore che definisce il server Kiali.

  3. Applica il manifest al cluster:

    kubectl apply -f kiali.yaml
    
  4. Attendi che il server Kiali sia pronto:

    watch kubectl get pods -n istio-system
    

    L'output è simile al seguente:

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

    Quando i pod sono Running, torna alla riga di comando premendo Ctrl+C.

  5. Configura l'inoltro delle porte sul servizio del server Kiali per accedere alla dashboard:

    kubectl -n istio-system port-forward svc/kiali 8080:20001
    
  6. Apri l'anteprima web. In Kiali, vai alla sezione Grafico e seleziona l'opzione Sicurezza nel menu a discesa Visualizza. Questa visualizzazione mostra lo stato di sicurezza di ogni nodo del grafico. I nodi con un badge mTLS abilitato indicano che mTLS è abilitato per quel servizio, mentre i nodi senza il badge indicano che mTLS non è abilitato.

Esegui la pulizia

Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

    Elimina un progetto Google Cloud :

    gcloud projects delete PROJECT_ID

Elimina le singole risorse

Se hai utilizzato un progetto esistente e non vuoi eliminarlo, elimina le singole risorse.

  1. Elimina Kiali:

    kubectl -n istio-system delete kiali kiali
    helm uninstall --namespace kiali-operator kiali-operator
    
  2. Elimina le risorse di monitoraggio:

    kubectl -n monitoring delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/prometheus-engine/v0.7.1/examples/frontend.yaml
    
  3. Elimina l'applicazione di esempio:

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

    istioctl uninstall --purge -y
    
  5. Elimina il cluster GKE:

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

Passaggi successivi

  • Esplora architetture di riferimento, diagrammi e best practice su Google Cloud. Consulta il nostro Cloud Architecture Center.