Questo tutorial descrive come integrare Identity-Aware Proxy (IAP) con Anthos Service Mesh. L'integrazione di IAP con Anthos Service Mesh ti consente di accedere in modo sicuro ai servizi in base ai principi di BeyondCorp di Google. IAP verifica l'identità dell'utente e il contesto della richiesta per determinare se un utente può essere autorizzato ad accedere a un'applicazione o risorsa. L'integrazione di IAP con Anthos Service Mesh offre i seguenti vantaggi:
Completa il controllo dell'accesso sensibile al contesto ai carichi di lavoro in esecuzione su Anthos Service Mesh. Puoi impostare criteri di accesso granulari in base agli attributi della richiesta di origine, come l'identità dell'utente, l'indirizzo IP e il tipo di dispositivo. Puoi combinare i criteri di accesso con le restrizioni in base al nome host e al percorso di un URL di richiesta.
Attiva il supporto per le rivendicazioni sensibili al contesto nell'autorizzazione Anthos Service Mesh.
Accesso scalabile, sicuro e ad alta disponibilità all'applicazione tramite un bilanciatore del carico Google Cloud. Il bilanciamento del carico ad alte prestazioni offre la protezione integrata degli attacchi denial of service (DDoS) distribuiti e supporto per l'indirizzo IP anycast globale.
Obiettivi
- Avvia la configurazione:
- Configurare il progetto Google Cloud per concedere le autorizzazioni e abilitare le API di Google richieste da IAP.
- Prenotare un indirizzo IP statico esterno e configurare un nome di dominio per utilizzare l'indirizzo IP necessario al bilanciatore del carico.
- Configurare un nuovo cluster Google Kubernetes Engine (GKE) con le opzioni necessarie per integrare IAP con Anthos Service Mesh.
- Installa Anthos Service Mesh con le opzioni richieste per l'integrazione.
- Eseguire il deployment di un'applicazione di esempio.
- Eseguire il deployment del bilanciatore del carico.
Abilitare IAP.
Attiva il supporto RCToken sul mesh di servizi.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.
Prima di iniziare
Requisiti
Devi avere una licenza di prova o un abbonamento Anthos. Per i dettagli, consulta la guida ai prezzi di Anthos.
Il cluster GKE deve soddisfare i seguenti requisiti:
- Almeno quattro nodi.
- Il tipo di macchina minimo è
e2-standard-4
, che ha quattro vCPU. - Utilizza un canale di rilascio anziché una versione statica di GKE
Per essere incluse nel mesh di servizi, le porte di servizio devono avere un nome e il nome deve includere il protocollo della porta nella seguente sintassi:
name: protocol[-suffix]
in cui le parentesi quadre indicano un suffisso facoltativo che deve iniziare con un trattino. Per ulteriori informazioni, vedi Denominazione delle porte dei servizi.Se installi Anthos Service Mesh su un cluster privato, devi aggiungere una regola firewall per aprire la porta 9443 se vuoi utilizzare l'iniezione automatica di sidecar. Se non aggiungi la regola firewall e l'inserimento automatico del sidecar è abilitato, ricevi un errore quando esegui il deployment dei carichi di lavoro. Per informazioni dettagliate sull'aggiunta di una regola firewall, consulta Aggiunta di regole firewall per casi d'uso specifici.
Se hai creato un perimetro di servizio nella tua organizzazione, potresti dover aggiungere il servizio Mesh CA al perimetro. Per ulteriori informazioni, consulta la sezione Aggiungere CA CA a un perimetro di servizio.
Configurazione dell'ambiente
Per le installazioni su Google Kubernetes Engine, puoi seguire le guide all'installazione utilizzando Cloud Shell, un'interfaccia a riga di comando nel browser per le tue risorse Google Cloud, o il tuo computer che esegue Linux o macOS.
Opzione A: utilizza Cloud Shell
Cloud Shell esegue il provisioning di una macchina virtuale (VM) g1-small Compute Engine che esegue un sistema operativo Linux basato su Debian. I vantaggi dell'utilizzo di Cloud Shell sono:
Cloud Shell include gli strumenti a riga di comando
gcloud
,kubectl
ehelm
necessari.La directory $HOME di Cloud Shell dispone di 5 GB di spazio di archiviazione permanente.
Puoi scegliere tra editor di testo:
Editor di codice, a cui puoi accedere facendo clic su nella parte superiore della finestra di Cloud Shell.
Emacs, Vim o Nano, a cui puoi accedere dalla riga di comando in Cloud Shell.
Per utilizzare Cloud Shell:
- Vai alla console Google Cloud.
- Selezionare il tuo progetto Google Cloud.
Fai clic sul pulsante Attiva Cloud Shell nella parte superiore della finestra della console Google Cloud.
Una sessione di Cloud Shell si apre all'interno di un nuovo frame nella parte inferiore della console Google Cloud e mostra un prompt della riga di comando.
Aggiorna i componenti:
gcloud components update
Il comando risponde con un output simile al seguente:
ERROR: (gcloud.components.update) You cannot perform this action because the gcloud CLI component manager is disabled for this installation. You can run the following command to achieve the same result for this installation: sudo apt-get update && sudo apt-get --only-upgrade install ...
Copia il comando lungo e incollalo per aggiornare i componenti.
Installa
kubectl
:sudo apt-get install kubectl
Installa
kpt
:sudo apt-get install google-cloud-sdk-kpt
Opzione B: utilizza gli strumenti a riga di comando localmente
Sul tuo computer locale, installa e inizializza l'interfaccia a riga di comando gcloud.
Se hai già installato gcloud CLI:
Esegui l'autenticazione con l'interfaccia alla gcloud CLI:
gcloud auth login
Aggiorna i componenti:
gcloud components update
Installa
kubectl
:gcloud components install kubectl
Installa
kpt
:gcloud components install kpt
Configurazione del progetto in corso…
-
Ottieni l'ID del progetto in cui verrà creato il cluster:
gcloud
gcloud projects list
Console
- Nella console Google Cloud, vai alla pagina Dashboard:
-
Fai clic sull'elenco a discesa Seleziona da nella parte superiore della pagina. Nella finestra Seleziona da che viene visualizzata, seleziona il progetto.
L'ID progetto viene visualizzato nella scheda Informazioni sul progetto della dashboard del progetto.
- Crea una variabile di ambiente per l'ID progetto:
export PROJECT_ID=YOUR_PROJECT_ID
-
Imposta l'ID progetto predefinito per lo strumento a riga di comando
gcloud
:gcloud config set project ${PROJECT_ID}
- Crea una variabile di ambiente per il numero di progetto:
export PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format="value(projectNumber)")
-
Impostare i ruoli IAM (Identity and Access Management). Se sei un proprietario del progetto, disponi di tutte le autorizzazioni necessarie per completare l'installazione e registrare il tuo cluster nell'ambiente.
Se non sei un proprietario del progetto, devi chiedere a qualcuno che ti conceda i seguenti ruoli IAM specifici. Nel comando seguente, cambia
GCP_EMAIL_ADDRESS
con l'account che utilizzi per accedere a Google Cloud.gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member user:GCP_EMAIL_ADDRESS \ --role=roles/editor \ --role=roles/compute.admin \ --role=roles/container.admin \ --role=roles/resourcemanager.projectIamAdmin \ --role=roles/iam.serviceAccountAdmin \ --role=roles/iam.serviceAccountKeyAdmin \ --role=roles/gkehub.admin
Per scoprire di più su come concedere i ruoli IAM, consulta Concessione, modifica e revoca dell'accesso alle risorse. Per una descrizione di questi ruoli, vedi Autorizzazioni richieste per installare Anthos Service Mesh
- Abilita le seguenti API:
gcloud services enable \ container.googleapis.com \ compute.googleapis.com \ monitoring.googleapis.com \ logging.googleapis.com \ cloudtrace.googleapis.com \ meshca.googleapis.com \ meshtelemetry.googleapis.com \ meshconfig.googleapis.com \ iamcredentials.googleapis.com \ anthos.googleapis.com \ gkeconnect.googleapis.com \ gkehub.googleapis.com \ cloudresourcemanager.googleapis.com \ iap.googleapis.com
L'abilitazione delle API può richiedere un minuto o più. Quando le API sono abilitate, visualizzi un output simile al seguente:
Operation "operations/acf.601db672-88e6-4f98-8ceb-aa3b5725533c" finished successfully.
Prenota un indirizzo IP statico e configura il DNS
Per integrare Identity-Aware Proxy con Anthos Service Mesh, devi configurare un bilanciatore del carico HTTP(S) Google Cloud, che richiede un nome di dominio che indirizzi a un indirizzo IP statico. Puoi prenotare un indirizzo IP esterno statico, che assegna l'indirizzo al progetto a tempo indeterminato finché non lo rilasci esplicitamente.
Prenota un indirizzo IP esterno statico:
gcloud compute addresses create example-static-ip --global
Recupera l'indirizzo IP statico:
gcloud compute addresses describe example-static-ip --global
Nel registrar del nome di dominio, configura un nome di dominio completo (FQDN) con l'indirizzo IP statico. In genere, si aggiunge un record
A
alle impostazioni DNS. I passaggi di configurazione e la terminologia per aggiungere un recordA
per un nome di dominio completo variano a seconda del registrar del nome di dominio.Imposta il nome di dominio in una variabile di ambiente:
export DOMAIN_NAME=YOUR_DOMAIN_NAME
La propagazione dell'impostazione DNS può richiedere da 24 a 48 ore. Puoi continuare a configurare tutto in questo tutorial, ma non potrai testare la configurazione fino a quando le impostazioni DNS non saranno state propagate.
Configurazione di un nuovo cluster GKE
Questa sezione spiega le nozioni di base per la creazione di un cluster GKE con le opzioni necessarie per Anthos Service Mesh. Per ulteriori informazioni, consulta la sezione Creazione di un cluster.
Per configurare un nuovo cluster:
Seleziona una zona o una regione, un tipo di macchina e un canale di rilascio GKE per il nuovo cluster. Il tipo di macchina minimo richiesto da Anthos Service Mesh è e2-standard-4. Puoi utilizzare qualsiasi opzione del canale di rilascio.
Se creerai un cluster a zona singola, esegui il comando seguente per ottenere un elenco delle zone GCP disponibili:
gcloud compute zones list
Se creerai un cluster a livello di regione, esegui questo comando per ottenere un elenco delle regioni disponibili:
gcloud compute regions list
Per visualizzare un elenco dei tipi di macchine:
gcloud compute machine-types list | more
Crea le seguenti variabili di ambiente:
Imposta il nome del cluster:
export CLUSTER_NAME=YOUR_CLUSTER_NAME
Il nome del cluster deve contenere solo caratteri alfanumerici minuscoli e "-", deve iniziare con una lettera e terminare con un carattere alfanumerico e non deve superare i 40 caratteri.
Imposta
CLUSTER_LOCATION
sulla zona o sulla regione del cluster:export CLUSTER_LOCATION=YOUR_ZONE_OR_REGION
Imposta il pool di carichi di lavoro:
export WORKLOAD_POOL=${PROJECT_ID}.svc.id.goog
Imposta l'ID mesh:
export MESH_ID="proj-${PROJECT_NUMBER}"
Imposta il canale di rilascio. Sostituisci
YOUR_CHANNEL
con uno dei seguenti elementi:regular
,stable
orapid
.export CHANNEL=YOUR_CHANNEL
Per una descrizione di ciascun canale, vedi Canali disponibili.
Imposta la zona o la regione predefinita per Google Cloud CLI.
Per un cluster a zona singola, imposta la zona predefinita:
gcloud config set compute/zone ${CLUSTER_LOCATION}
Per un cluster a livello di area geografica, imposta la regione predefinita:
gcloud config set compute/region ${CLUSTER_LOCATION}
Suggerimento: per semplificare la configurazione dell'ambiente shell in futuro, puoi copiare e incollare le istruzioni
export
per ogni variabile di ambiente in un semplice script shellsource
quando avvii una nuova shell. Puoi anche aggiungere i comandigcloud
che impostano valori predefiniti allo script. In alternativa, puoi utilizzaregcloud init
per creare e attivare una configurazionegcloud
denominata.Crea il cluster con le opzioni richieste da Anthos Service Mesh. Il comando seguente crea un cluster contenente 4 nodi di tipo di macchina e2-standard-4, con 4 vCPU. Questo è il tipo di macchina minimo e il numero di nodi richiesti per Anthos Service Mesh. Puoi specificare un altro tipo di macchina purché abbia almeno 4 vCPU e puoi aumentare il numero di nodi in base alle tue esigenze in termini di sistema.
gcloud beta container clusters create ${CLUSTER_NAME} \ --machine-type=e2-standard-4 \ --num-nodes=4 \ --workload-pool=${WORKLOAD_POOL} \ --enable-stackdriver-kubernetes \ --subnetwork=default \ --labels=mesh_id=${MESH_ID} \ --release-channel=${CHANNEL}
Il comando
clusters create
include:workload-pool=${WORKLOAD_POOL}
: abilita Workload Identity, che è il modo consigliato per accedere in modo sicuro ai servizi Google Cloud dalle applicazioni GKE.enable-stackdriver-kubernetes
: abilita Cloud Monitoring e Cloud Logging su GKE.subnetwork=default
: crea una subnet predefinita.labels mesh_id=${MESH_ID}
: imposta l'etichettamesh_id
nel cluster, necessaria per visualizzare le metriche sulle pagine di Anthos Service Mesh nella console Google Cloud.release-channel ${CHANNEL}
: registra il cluster nel canale di rilascio specificato.
Preparazione dell'installazione di Anthos Service Mesh
Prima di continuare, verifica che l'account di servizio del piano dati mesh ASM sia un membro del progetto:
gcloud projects get-iam-policy ${PROJECT_ID} | grep -B 1 'roles/meshdataplane.serviceAgent'
Se il comando precedente non restituisce alcun risultato, torna alla sezione Imposta credenziali e autorizzazioni ed esegui il comando curl
.
-
Scarica il file di installazione di Anthos Service Mesh nella directory di lavoro attuale:
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.4.10-asm.18-linux.tar.gz
-
Scarica il file della firma e utilizza
openssl
per verificare la firma:curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.4.10-asm.18-linux.tar.gz.1.sig openssl dgst -verify - -signature istio-1.4.10-asm.18-linux.tar.gz.1.sig istio-1.4.10-asm.18-linux.tar.gz <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
L'output previsto è:
Verified OK
-
Scarica il file di installazione di Anthos Service Mesh nella directory di lavoro attuale:
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.4.10-asm.18-osx.tar.gz
-
Scarica il file della firma e utilizza
openssl
per verificare la firma:curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.4.10-asm.18-osx.tar.gz.1.sig openssl dgst -sha256 -verify /dev/stdin -signature istio-1.4.10-asm.18-osx.tar.gz.1.sig istio-1.4.10-asm.18-osx.tar.gz <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
L'output previsto è:
Verified OK
-
Scarica il file di installazione di Anthos Service Mesh nella directory di lavoro attuale:
curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.4.10-asm.18-win.zip
-
Scarica il file della firma e utilizza
openssl
per verificare la firma:curl -LO https://storage.googleapis.com/gke-release/asm/istio-1.4.10-asm.18-win.zip.1.sig openssl dgst -verify - -signature istio-1.4.10-asm.18-win.zip.1.sig istio-1.4.10-asm.18-win.zip <<'EOF' -----BEGIN PUBLIC KEY----- MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWZrGCUaJJr1H8a36sG4UUoXvlXvZ wQfk16sxprI2gOJ2vFFggdq3ixF2h4qNBt0kI7ciDhgpwS8t+/960IsIgw== -----END PUBLIC KEY----- EOF
L'output previsto è:
Verified OK
-
Estrai i contenuti del file in qualsiasi posizione nel file system. Ad esempio, per estrarre i contenuti nella directory di lavoro corrente:
tar xzf istio-1.4.10-asm.18-linux.tar.gz
Il comando crea una directory di installazione nell'attuale directory di lavoro denominata
istio-1.4.10-asm.18
, che contiene:- Applicazioni di esempio in
samples
- I seguenti strumenti della directory
bin
:istioctl
: utilizziistioctl
per installare Anthos Service Mesh.asmctl
: utilizziasmctl
per convalidare la configurazione di sicurezza dopo l'installazione di Anthos Service Mesh. Attualmenteasmctl
non è supportato sui cluster Anthos su VMware.
- Applicazioni di esempio in
-
Assicurati di essere nella directory principale dell'installazione di Anthos Service Mesh.
cd istio-1.4.10-asm.18
-
Per praticità, aggiungi gli strumenti della directory
/bin
al tuo PERCORSO:export PATH=$PWD/bin:$PATH
Linux
Mac OS
Windows
Installazione di Anthos Service Mesh
Installare Anthos Service Mesh e impostare le opzioni necessarie per integrare Anthos Service Mesh con IAP.
mTLS CONSENTITO
istioctl manifest apply --set profile=asm \ --set values.gateways.istio-ingressgateway.type=NodePort \ --set values.global.trustDomain=${WORKLOAD_POOL} \ --set values.global.sds.token.aud=${WORKLOAD_POOL} \ --set values.nodeagent.env.GKE_CLUSTER_URL=https://container.googleapis.com/v1/projects/${PROJECT_ID}/locations/${CLUSTER_LOCATION}/clusters/${CLUSTER_NAME} \ --set values.global.meshID=${MESH_ID} \ --set values.global.proxy.env.GCP_METADATA="${PROJECT_ID}|${PROJECT_NUMBER}|${CLUSTER_NAME}|${CLUSTER_LOCATION}"
mTLS STRETTA
istioctl manifest apply --set profile=asm \ --set values.gateways.istio-ingressgateway.type=NodePort \ --set values.global.trustDomain=${WORKLOAD_POOL} \ --set values.global.sds.token.aud=${WORKLOAD_POOL} \ --set values.nodeagent.env.GKE_CLUSTER_URL=https://container.googleapis.com/v1/projects/${PROJECT_ID}/locations/${CLUSTER_LOCATION}/clusters/${CLUSTER_NAME} \ --set values.global.meshID=${MESH_ID} \ --set values.global.proxy.env.GCP_METADATA="${PROJECT_ID}|${PROJECT_NUMBER}|${CLUSTER_NAME}|${CLUSTER_LOCATION}" \ --set values.global.mtls.enabled=true
Specifica NodePort
per istio-ingressgateway
, che configura
{[mesh_name]} per aprire una porta specifica nel mesh di servizi. In questo modo puoi configurare un bilanciatore del carico, che instrada il traffico inviato al nome di dominio verso questa porta. Le altre opzioni consentono l'autorità di certificazione (Mesh CA) di Anthos Service Mesh.
Controlla i componenti del piano di controllo
Verifica che i pod del piano di controllo in istio-system
siano aumentati:
kubectl get pod -n istio-system
Dovresti vedere un output simile al seguente:
NAME READY STATUS RESTARTS AGE istio-galley-5c65896ff7-m2pls 2/2 Running 0 18m istio-ingressgateway-587cd459f-q6hqt 2/2 Running 0 18m istio-nodeagent-74w69 1/1 Running 0 18m istio-nodeagent-7524w 1/1 Running 0 18m istio-nodeagent-7652w 1/1 Running 0 18m istio-nodeagent-7948w 1/1 Running 0 18m istio-pilot-9db77b99f-7wfb6 2/2 Running 0 18m istio-sidecar-injector-69c4d9f875-dt8rn 1/1 Running 0 18m promsd-55f464d964-lqs7w 2/2 Running 0 18m
Dovresti vedere un'istanza di istio-nodeagent
per ogni nodo nel tuo cluster. Mesh CA, che sostituisce il componente Istio Citadel OSS, crea gli agenti nodo per emettere certificati mTLS per i carichi di lavoro in esecuzione nel mesh di servizi.
Deployment di un'applicazione di esempio
Prima di abilitare IAP, devi avere un'applicazione in esecuzione sul cluster GKE, in modo da poter verificare che tutte le richieste abbiano un'identità. Questa guida utilizza l'esempio Bookinfo per dimostrare come configurare il bilanciatore del carico HTTP(S) e abilitare IAP.
Avviare i servizi per applicazioni
Cambia la directory nella directory principale dell'installazione di Anthos Service Mesh.
Etichetta lo spazio dei nomi
default
per utilizzare l'iniezione automatica di sidecar:kubectl label namespace default istio-injection=enabled
Esegui il deployment dell'applicazione:
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
Verifica che tutti i servizi
bookinfo
siano in esecuzione:kubectl get services
L'output previsto è simile a:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE details 10.0.0.31
9080/TCP 6m kubernetes 10.0.0.1 443/TCP 7d productpage 10.0.0.120 9080/TCP 6m ratings 10.0.0.15 9080/TCP 6m reviews 10.0.0.170 9080/TCP 6m Verifica che tutti i pod siano in esecuzione:
kubectl get pods
L'output previsto è simile a:
NAME READY STATUS RESTARTS AGE details-v1-1520924117-48z17 2/2 Running 0 6m productpage-v1-560495357-jk1lz 2/2 Running 0 6m ratings-v1-734492171-rnr5l 2/2 Running 0 6m reviews-v1-874083890-f0qf0 2/2 Running 0 6m reviews-v2-1343845940-b34q5 2/2 Running 0 6m reviews-v3-1813607990-8ch52 2/2 Running 0 6m
Verifica che l'applicazione Bookinfo sia in esecuzione:
kubectl exec -it $(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}') -c ratings -- curl productpage:9080/productpage | grep -o "<title>.*</title>"
Output previsto:
<title>Simple Bookstore App</title>
Definisci il gateway in entrata e il servizio virtuale per l'applicazione:
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
Verifica che il gateway sia stato creato:
kubectl get gateway
L'output previsto è simile a:
NAME AGE bookinfo-gateway 32s
Richieste esterne
La risorsa Gateway di Bookinfo (definita in
samples/bookinfo/networking/bookinfo-gateway.yaml
) utilizza il metodo
istio-ingressgateway
preconfigurato.
Ricorda che quando hai eseguito il deployment di Anthos Service Mesh, hai specificato NodePort
per
istio-ingressgateway
, che apre una porta specifica nel mesh di servizi. Fino a quando non configuri il bilanciatore del carico, l'applicazione Bookinfo non è accessibile all'esterno del tuo cluster GKE (ad esempio da un browser). Anche se i nodi nel tuo cluster hanno indirizzi IP esterni, le richieste provenienti dall'esterno del tuo cluster sono bloccate dalle regole firewall di Google Cloud. Con IAP, il modo corretto per esporre questa applicazione alla rete Internet pubblica è utilizzare un bilanciatore del carico. Non esporre gli indirizzi dei nodi utilizzando regole firewall, in modo da ignorare IAP.
Per indirizzare le richieste a Bookinfo, configura un bilanciatore del carico HTTP(S) nel progetto Google Cloud. Poiché il bilanciatore del carico si trova nel tuo progetto, si trova all'interno del firewall e può accedere ai nodi nel tuo cluster. Dopo aver configurato il bilanciatore del carico con l'indirizzo IP statico e il nome di dominio, puoi inviare richieste al nome di dominio e il bilanciatore del carico inoltra le richieste ai nodi nel cluster.
Deployment del bilanciatore del carico
Puoi utilizzare una risorsa in entrata per creare un bilanciatore del carico HTTP(S) con certificati SSL configurati automaticamente. I certificati SSL gestiti da Google vengono forniti, rinnovati e gestiti per il tuo dominio.
Creare una risorsa ManagedCertificate. Questa risorsa specifica il dominio per il certificato SSL. L'elenco
spec.domains
deve contenere un solo dominio. I domini con caratteri jolly non sono supportati.cat <<EOF | kubectl apply -f - apiVersion: networking.gke.io/v1beta1 kind: ManagedCertificate metadata: name: example-certificate spec: domains: - ${DOMAIN_NAME} EOF
Crea il bilanciatore del carico definendo la risorsa Ingress.
Imposta l'annotazione
networking.gke.io/managed-certificates
sul nome del certificato che hai creato nel passaggio precedente,example-certificate
.Imposta l'annotazione
kubernetes.io/ingress.global-static-ip-name
sul nome dell'indirizzo IP statico prenotato,example-static-ip
.Imposta
serviceName
suistio-ingressgateway
, che viene utilizzato nella risorsa Gateway per l'esempio di Bookinfo.
cat <<EOF | kubectl create -f - apiVersion: extensions/v1beta1 kind: Ingress metadata: name: example-ingress namespace: istio-system annotations: kubernetes.io/ingress.global-static-ip-name: example-static-ip networking.gke.io/managed-certificates: example-certificate spec: backend: serviceName: istio-ingressgateway servicePort: 80 EOF
Nella console Google Cloud, vai alla pagina Kubernetes Engine > Servizi e Ingress.
Vai alla pagina Servizi e Ingress
Dovresti visualizzare il messaggio "Creazione del traffico in entrata" nella colonna Stato. Attendi che GKE esegua il provisioning completo della risorsa Ingress prima di continuare. Aggiorna la pagina a intervalli di pochi minuti per ottenere lo stato più aggiornato sulla risorsa Ingress. Dopo aver eseguito il provisioning della risorsa Ingress, potresti visualizzare lo stato "Ok" o l'errore "Tutti i servizi di backend sono in stato NON SALUTE". Una delle risorse di cui GKE esegue il provisioning è un controllo di integrità predefinito. Se viene visualizzato un messaggio di errore, significa che è stato eseguito il provisioning della risorsa Ingress e che è stato eseguito il controllo di integrità predefinito. Quando vedi lo stato "Ok" o l'errore, continua con la sezione successiva per configurare i controlli di integrità per il bilanciatore del carico.
Configurare i controlli di integrità per il bilanciatore del carico.
Per configurare i controlli di integrità, devi ottenere l'ID del controllo di integrità predefinito creato dalla risorsa Ingress, quindi aggiornare il controllo di integrità in modo da utilizzare il percorso e la porta del controllo di integrità di Istio-Ingress.
Recupera le nuove credenziali utente da utilizzare per le credenziali predefinite dell'applicazione:
gcloud auth application-default login
Ottieni l'ID del controllo di integrità predefinito creato dalla risorsa Ingress:
Imposta le seguenti variabili di ambiente:
Servizio di backend: collega vari gruppi di istanze su una determinata NodePort di servizio.
BACKEND_SERVICE=$(gcloud compute url-maps list | grep example-ingress | awk '{print $2}' | cut -d'/' -f 2)
Controllo di integrità: si tratta del controllo di integrità predefinito che viene creato automaticamente al deployment di Ingress.
HC=$(gcloud compute backend-services describe ${BACKEND_SERVICE} --global | grep healthChecks | cut -d'/' -f 10 | tail -n 1)
Porta di controllo di integrità: è la porta di controllo di integrità in entrata.
export HC_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="status-port")].nodePort}')
Percorso di controllo di integrità: è il percorso di controllo dell'integrità di istio-ingress.
export HC_INGRESS_PATH=$(kubectl -n istio-system get deployments istio-ingressgateway -o jsonpath='{.spec.template.spec.containers[?(@.name=="istio-proxy")].readinessProbe.httpGet.path}')
- API Controllo di integrità: si tratta dell'API che chiami per configurare il controllo di integrità.
export HC_API=https://compute.googleapis.com/compute/v1/projects/${PROJECT_ID}/global/healthChecks/${HC}
Ottieni il controllo di integrità predefinito in un file JSON chiamando l'API
healthChecks
:curl --request GET --header "Authorization: Bearer $(gcloud auth application-default print-access-token)" ${HC_API} > health_check.json
Aggiorna il controllo di integrità per utilizzare il percorso e la porta del controllo di integrità istio-ingress:
Aggiorna il file
health_check.json
come indicato di seguito:- Imposta
httpHealthCheck.port
sul valore di${HC_INGRESS_PORT}
. - Imposta
httpHealthCheck.requestPath
sul valore di${HC_INGRESS_PATH}
. - Aggiungi il seguente attributo e impostalo su una stringa vuota:
httpHealthCheck.portSpecification=""
Il modo più semplice per farlo è utilizzare jq, che è preinstallato in Cloud Shell:
jq ".httpHealthCheck.port=${HC_INGRESS_PORT} | .httpHealthCheck.requestPath=\"${HC_INGRESS_PATH}\" | .httpHealthCheck.portSpecification=\"\"" health_check.json > updated_health_check.json
Se esegui
cat
sul fileupdated_health_check.json
risultante, sarà simile al seguente:{ "id": "5062913090021441698", "creationTimestamp": "2019-11-12T10:47:41.934-08:00", "name": "${HC}", "description": "Default kubernetes L7 Loadbalancing health check.", "checkIntervalSec": 60, "timeoutSec": 60, "unhealthyThreshold": 10, "healthyThreshold": 1, "type": "HTTP", "httpHealthCheck": { "port": 32394, "requestPath": "/healthz/ready", "proxyHeader": "NONE", "portSpecification": "" }, "selfLink": "https://www.googleapis.com/compute/v1/projects/${PROJECT_ID}/global/healthChecks/${HC}", "kind": "compute#healthCheck" }
Se hai modificato il file JSON manualmente invece di utilizzare il comando
jq
, salva il file comeupdated_health_check.json
in modo che corrisponda al nome del file nel comando successivo.- Imposta
Aggiorna il controllo di integrità:
curl --request PATCH --header "Authorization: Bearer $(gcloud auth application-default print-access-token)" --header "Content-Type: application/json" --data @updated_health_check.json ${HC_API}
GKE impiega diversi minuti per aggiornare il controllo di integrità. Nella console Google Cloud, aggiorna ogni minuto la pagina Kubernetes Engine > Servizi e Ingress finché lo stato della risorsa Ingress non passa a "OK".
Testa il bilanciatore del carico. Punta il browser a:
http://YOUR_DOMAIN_NAME/productpage
dove
YOUR_DOMAIN_NAME
è il nome di dominio che hai configurato con l'indirizzo IP statico esterno.Dovresti vedere la
productpage
dell'applicazione Bookinfo. Se aggiorni la pagina più volte, dovresti vedere diverse versioni delle recensioni, presentate in stile round robin: stelle rosse, stelle nere, nessuna stella.Devi anche testare l'accesso di
https
a Bookinfo.
Abilitazione di IAP
I seguenti passaggi descrivono come abilitare IAP.
Configurazione della schermata per il consenso
Controlla se hai già un brand utilizzando il comando list. Puoi avere un solo brand per progetto.
gcloud iap oauth-brands list
Di seguito è riportato un esempio di risposta gcloud, se il brand esiste:
name: projects/[PROJECT_NUMBER]/brands/[BRAND_ID] applicationTitle: [APPLICATION_TITLE] supportEmail: [SUPPORT_EMAIL] orgInternalOnly: true
Se non esiste alcun brand, utilizza il comando create:
gcloud iap oauth-brands create --application_title=APPLICATION_TITLE --support_email=SUPPORT_EMAIL
I campi precedenti sono obbligatori quando chiami questa API:
supportEmail
: l'email dell'assistenza visualizzata nella schermata per il consenso OAuth. Può trattarsi dell'indirizzo di un utente o di un alias di Google Gruppi. Anche se gli account di servizio hanno un indirizzo email, non sono indirizzi email validi e non possono essere utilizzati durante la creazione di un brand. Tuttavia, un account di servizio può essere il proprietario di un gruppo Google. Crea un nuovo gruppo Google o configura un gruppo esistente e imposta l'account di servizio desiderato come proprietario del gruppo.applicationTitle
: il nome dell'applicazione visualizzato nella schermata per il consenso OAuth.
La risposta contiene i seguenti campi:
name: projects/[PROJECT_NUMBER]/brands/[BRAND_ID] applicationTitle: [APPLICATION_TITLE] supportEmail: [SUPPORT_EMAIL] orgInternalOnly: true
Creazione di un client OAuth IAP
Utilizza il comando Crea per creare un client. Utilizza il brand
name
del passaggio precedente.gcloud iap oauth-clients create projects/PROJECT_NUMBER/brands/BRAND-ID --display_name=NAME
La risposta contiene i seguenti campi:
name: projects/[PROJECT_NUMBER]/brands/[BRAND_NAME]/identityAwareProxyClients/[CLIENT_ID] secret: [CLIENT_SECRET] displayName: [NAME]
Attivazione di IAP per il servizio
Utilizza il comando seguente per attivare IAP per il tuo servizio.
Sostituisci CLIENT_ID
e CLIENT_SECRET
con il tuo ID client OAuth e il client secret del client creato in precedenza.
gcloud beta iap web enable \ --oauth2-client-id=CLIENT_ID \ --oauth2-client-secret=CLIENT_SECRET \ --resource-type=backend-services \ --service=${BACKEND_SERVICE}
Configura l'elenco di accesso IAP
Aggiungi un utente al criterio di accesso per IAP:
gcloud beta iap web add-iam-policy-binding \ --member=user:EMAIL_ADDRESS \ --role=roles/iap.httpsResourceAccessor \ --resource-type=backend-services \ --service=$BACKEND_SERVICE
dove EMAIL_ADDRESS
è l'indirizzo email completo dell'utente,
ad esempio alice@example.com
.
Abilita il supporto RCToken sul mesh di servizi
Per impostazione predefinita, IAP genera un token web JSON (JWT) che ha come ambito il client OAuth. Per Anthos Service Mesh, puoi configurare IAP per generare un RequestContextToken (RCToken), che è un JWT ma con un pubblico configurabile. RCToken ti consente di configurare il pubblico di JWT con una stringa arbitraria, che può essere utilizzata nei criteri Anthos Service Mesh per un'autorizzazione granulare.
Per configurare RCToken:
Crea una variabile di ambiente per il numero di progetto. Si tratta del numero che è stato generato e assegnato automaticamente al progetto quando lo hai creato. (non corrisponde all'ID progetto).
export PROJECT_NUMBER=YOUR_PROJECT_NUMBER
Crea una variabile di ambiente per il segmento di pubblico RCToken. Puoi scegliere qualsiasi stringa.
export RCTOKEN_AUD="your-rctoken-aud"
Recupera le impostazioni IAP esistenti
gcloud beta iap settings get --format json \ --project=${PROJECT_NUMBER} --resource-type=compute \ --service=${BACKEND_SERVICE} > iapSettings.json
Aggiorna
IapSettings
con il pubblico RCToken.cat iapSettings.json | jq --arg RCTOKEN_AUD_STR $RCTOKEN_AUD \ '. + {applicationSettings: {csmSettings: {rctokenAud: $RCTOKEN_AUD_STR}}}' \ > updatedIapSettings.json
gcloud beta iap settings set updatedIapSettings.json --format json \ --project=${PROJECT_NUMBER} --resource-type=compute --service=${BACKEND_SERVICE}
Abilita l'autenticazione RCToken sul gateway in entrata Istio.
cat <<EOF | kubectl apply -f - apiVersion: "authentication.istio.io/v1alpha1" kind: "Policy" metadata: name: "ingressgateway" namespace: istio-system spec: targets: - name: "istio-ingressgateway" origins: - jwt: issuer: "https://cloud.google.com/iap" jwksUri: "https://www.gstatic.com/iap/verify/public_key-jwk" audiences: - "$RCTOKEN_AUD" jwt_headers: - "ingress-authorization" trigger_rules: - excluded_paths: - exact: /healthz/ready principalBinding: USE_ORIGIN EOF
Assicurati che le richieste al Bookinfo
productpage
abbiano ancora esito positivo:http://DOMAIN_NAME/productpage
Per testare il criterio:
Crea un oggetto di richiesta
IapSettings
, ma impostarctokenAud
su una stringa diversa:echo $(cat <<EOF { "name": "projects/${PROJECT_NUMBER}/iap_web/compute/services/${BACKEND_SERVICE}", "applicationSettings": { "csmSettings": { "rctokenAud": "some-other-arbitrary-string" } } } EOF ) > request.txt
Chiama l'API
IapSettings
per impostare il segmento di pubblico RCtoken.curl --request PATCH --header "Authorization: Bearer $(gcloud beta auth application-default print-access-token)" ${IAP_SETTINGS_API}
Invia una richiesta al BookInfo
productpage
e questa non andrà a buon fine:http://DOMAIN_NAME/productpage
Attivazione dei criteri di sicurezza dei pod
Se abiliti i criteri di sicurezza dei pod, ti assicuri che gli spazi dei nomi compromessi (diversi da istio-system
) non influiscano sulla sicurezza degli altri spazi dei nomi che condividono gli stessi nodi. Esempi di file di risorse PodSecurityPolicy
che funzionano con Mesh CA sono forniti con Anthos Service Mesh. Puoi modificare questi file in base alle esigenze. Nel
seguente, applichi prima i criteri di sicurezza dei pod, quindi abiliti i
criteri di sicurezza dei pod
per il cluster GKE.
Applica il criterio di sicurezza dei pod predefinito per tutti gli account di servizio nel cluster:
kubectl apply -f "samples/security/psp/all-pods-psp.yaml"
Applica il criterio di sicurezza dei pod per proteggere il Secret Discovery Service (SDS):
kubectl apply -f "samples/security/psp/citadel-agent-psp.yaml"
Questo assegna all'agente Citadel (chiamato anche agente nodo) il privilegio di creare il percorso UDS
/var/run/sds
sulla VM host.Esegui questo comando per abilitare il criterio di sicurezza dei pod:
gcloud beta container clusters update ${CLUSTER_NAME} \ --enable-pod-security-policy
L'attivazione dei criteri di sicurezza dei pod potrebbe richiedere diversi minuti. Durante questo processo, i carichi di lavoro esistenti non potranno connettersi al master Kubernetes. Attendi finché il master Kubernetes non si avvia di nuovo. Puoi controllare lo stato del cluster nella console Google Cloud nella pagina Cluster Kubernetes.
Per ulteriori informazioni, consulta la pagina relativa all'utilizzo dei criteri di sicurezza dei pod.
Eseguire la pulizia
Dopo aver completato questo tutorial, rimuovi le seguenti risorse per evitare che al tuo account vengano addebitati costi indesiderati:
Elimina il certificato gestito:
kubectl delete managedcertificates example-certificate
Elimina il traffico Ingress, che alloca le risorse di bilanciamento del carico:
kubectl -n istio-system delete ingress example-ingress
Elimina l'indirizzo IP statico:
gcloud compute addresses delete example-static-ip --global
In questo caso, assicurati di eliminare l'indirizzo IP dal registrar di dominio.
Elimina il cluster, che elimina le risorse che compongono il cluster, ad esempio istanze di calcolo, dischi e risorse di rete:
gcloud container clusters delete ${CLUSTER_NAME}