Accedi ai cluster privati di Google Kubernetes Engine dai pool privati di Cloud Build utilizzando Identity Service per GKE


Questo tutorial descrive come accedere al piano di controllo di un cluster Google Kubernetes Engine (GKE) privato utilizzando i pool privati di Cloud Build. Questo accesso consente di utilizzare Cloud Buildto per eseguire il deployment di applicazioni e gestire le risorse su un cluster GKE privato. Questo tutorial è destinato agli amministratori di piattaforma, dei cluster e degli sviluppatori. Presuppone che tu conosca GKE, Cloud Build, OpenID Connect e lo strumento a riga di comando gcloud.

I pool privati di Cloud Build e i piani di controllo dei cluster GKE vengono eseguiti in reti Virtual Private Cloud (VPC) di proprietà di Google. Queste reti VPC sono connesse in peering alla tua rete VPC su Google Cloud. Tuttavia, il peering di rete VPC non supporta il peering transitivo, che può costituire una limitazione quando utilizzi i pool privati di Cloud Build. Questo tutorial presenta una soluzione che utilizza Identity Service for GKE per consentire ai worker in un pool privato di Cloud Build di accedere al piano di controllo di un cluster GKE privato.

Panoramica dell'architettura

Identity Service per GKE è un proxy di autenticazione per i piani di controllo dei cluster GKE. Esegue il proxy delle richieste al server API e convalida i token ID emessi dai provider di identità OpenID Connect (OIDC). Una volta convalidato correttamente un token ID, il proxy aggiunge intestazioni HTTP di rappresentazione degli utenti alla richiesta originale e la inoltra al server API. Il proxy viene eseguito come account di servizio Kubernetes che dispone delle autorizzazioni per impersonare utenti e gruppi.

Il proxy Identity Service per GKE viene eseguito come pod sui nodi del cluster. Un servizio Kubernetes di tipo LoadBalancer espone il proxy all'esterno del cluster. Se Identity Service per GKE è abilitato su un cluster privato, il programma di installazione aggiunge un'annotazione al servizio Kubernetes per eseguire il provisioning di un bilanciatore del carico di rete passthrough interno. È possibile accedere al proxy attraverso il bilanciatore del carico su una connessione di peering di rete VPC, ad esempio da un pool privato di Cloud Build, perché il proxy viene eseguito sui nodi cluster nella rete VPC.

Puoi configurare Google come provider di identità OpenID Connect in Identity Service per GKE perché il sistema di autenticazione OAuth 2.0 di Google è conforme alla specifica OpenID Connect. Per ottenere i token ID per un account di servizio Google, puoi utilizzare il metodo generateIdToken dell'API Service Account Credentials. I token ID sono emessi e firmati da Google.

Riassumendo, questa soluzione consente l'accesso al piano di controllo del cluster GKE privato utilizzando il proxy Identity Service for GKE. Le build eseguite su un pool privato di Cloud Build si connettono al proxy tramite una connessione di peering di rete VPC. La build in esecuzione nel pool privato di Cloud Build viene eseguita come account di servizio Google. Questo account di servizio Google può ottenere un token ID per l'autenticazione al proxy dall'API Service Account Credentials.

Il seguente diagramma mostra l'architettura descritta nel testo precedente:

Accedi ai cluster GKE privati utilizzando Identity Service for GKE

Tutte le comunicazioni in questa soluzione avvengono nello spazio di indirizzi IP interni. I worker nel pool privato non hanno bisogno di una connessione a internet pubblica.

Le autorizzazioni IAM (Identity and Access Management) concesse agli account utente e agli account di servizio Google non si applicano quando eseguono l'autenticazione utilizzando Identity Service per GKE. Utilizza invece il controllo dell'controllo dell'accesso basato sui ruoli (RBAC) di Kubernetes per gestire le autorizzazioni cluster per questi account.

Prima di iniziare

  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 gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Installa Google Cloud CLI.
  3. Per initialize gcloud CLI, esegui questo comando:

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

    • Crea 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 tuo progetto Google Cloud.

  5. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  6. Abilita le API Cloud Build, GKE, Identity-Aware Proxy (IAP), and Service Networking APIs.

    gcloud services enable cloudbuild.googleapis.com container.googleapis.com iap.googleapis.com servicenetworking.googleapis.com
  7. Installa Google Cloud CLI.
  8. Per initialize gcloud CLI, esegui questo comando:

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

    • Crea 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 tuo progetto Google Cloud.

  10. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  11. Abilita le API Cloud Build, GKE, Identity-Aware Proxy (IAP), and Service Networking APIs.

    gcloud services enable cloudbuild.googleapis.com container.googleapis.com iap.googleapis.com servicenetworking.googleapis.com

Crea un cluster GKE privato

  1. In Cloud Shell, crea un cluster GKE che non ha accesso client all'endpoint pubblico del piano di controllo e in cui Identity Service for GKE è installato:

    gcloud container clusters create CLUSTER  \
      --enable-identity-service \
      --enable-ip-alias \
      --enable-master-authorized-networks \
      --enable-private-endpoint \
      --enable-private-nodes \
      --master-ipv4-cidr CONTROL_PANE_CIDR \
      --network NETWORK\
      --release-channel regular \
      --scopes cloud-platform \
      --subnetwork SUBNET \
      --tags NODE_TAGS \
      --workload-pool PROJECT_ID.svc.id.goog \
      --zone ZONE
    

    Sostituisci quanto segue:

    • CLUSTER: il nome del cluster. Per questo tutorial, utilizza private-cluster.
    • CONTROL_PANE_CIDR: l'intervallo di indirizzi IP del piano di controllo. Deve avere un prefisso /28. Per questo tutorial, puoi utilizzare 172.16.0.32/28.
    • NETWORK: la rete VPC a cui si connette il piano di controllo. Per questo tutorial, utilizza default.
    • SUBNET: la subnet a cui si connette il piano di controllo del cluster GKE. La subnet deve appartenere alla rete VPC specificata da NETWORK. Per questo tutorial, utilizza default.
    • NODE_TAGS: un elenco separato da virgole di tag di rete da applicare ai nodi. Per questo tutorial, utilizza private-cluster-node.
    • PROJECT_ID: l'ID del tuo progetto Google Cloud.
    • ZONE: la zona per il cluster GKE. Per questo tutorial, utilizza us-central1-f.

    Tieni presente quanto segue in merito al comando:

    • Il flag --enable-identity-service abilita Identity Service per GKE sul cluster. Nel tuo ambiente, puoi abilitare Identity Service per GKE su un cluster esistente.

    • Il flag --enable-private-endpoint configura il piano di controllo in modo che sia accessibile solo mediante indirizzi IP interni.

    • Il flag --enable-private-nodes configura i nodi del cluster in modo che abbiano solo indirizzi IP interni.

    • I flag --enable-master-authorized-networks e --enable-private-nodes consentono l'accesso al server API solo dalle reti private specificate dal flag --network.

    • Il flag facoltativo --workload-pool abilita Workload Identity. Non è obbligatorio per questo tutorial.

  2. Aggiungi una regola firewall che consenta al piano di controllo del cluster GKE di connettersi al webhook di ammissione di convalida per le risorse ClientConfig:

    gcloud compute firewall-rules create allow-control-plane-clientconfig-webhook \
      --allow tcp:15000 \
      --network NETWORK\
      --source-ranges CONTROL_PANE_CIDR\
      --target-tags NODE_TAGS
    

    ClientConfig è un tipo di risorsa personalizzata (CRD) Kubernetes che Identity Service per GKE utilizza per configurare l'interazione con i provider di identità.

Registra Identity Service per GKE come applicazione client OAuth 2.0

In questa sezione registri Identity Service per GKE come applicazione client utilizzando il sistema di autenticazione OAuth 2.0 di Google.

  1. Apri la pagina Credenziali nella console Google Cloud.

    Apri la pagina Credenziali

  2. Fai clic su Crea credenziali.

  3. Seleziona ID client OAuth.

    Se la schermata per il consenso non è stata ancora configurata per il progetto Google Cloud, fai clic su Configura schermata per il consenso. Segui la documentazione relativa alla configurazione della schermata di consenso. Per questo tutorial, imposta i seguenti valori:

    • Tipo di utente può essere Interno o Esterno. Per questo tutorial, puoi selezionare Interno.
    • I valori per Nome app, Email dell'assistenza utenti e Dati di contatto dello sviluppatore sono obbligatori e possono avere qualsiasi valore.
    • Non è necessario aggiungere ambiti per questo tutorial.

    Al termine della configurazione della schermata di consenso, fai clic su Torna alla dashboard e ricomincia dal passaggio 1 della procedura corrente.

  4. Nell'elenco Tipo di applicazione, seleziona Applicazione web.

  5. Nel campo Nome, inserisci un nome per l'ID client. Per questo tutorial, utilizza Identity Service for GKE.

  6. Fai clic su Crea.

    Viene visualizzata una finestra di dialogo. Copia il valore del campo Il tuo ID client. Ti servirà più avanti in questa procedura.

  7. Fai clic su OK per chiudere la finestra di dialogo.

  8. In Cloud Shell, crea una directory sotto la tua home directory denominata cloud-build-private-pools-gke-tutorial, quindi vai a quella directory:

    mkdir -p ~/cloud-build-private-pools-gke-tutorial cd ~/cloud-build-private-pools-gke-tutorial

  9. Nella nuova directory, crea un file YAML denominato client-config-patch.yaml con i valori che ti serviranno in un secondo momento per applicare le patch alla risorsa Identity Service for GKE ClientConfig:

    cat << EOF > client-config-patch.yaml
    spec:
      authentication:
      - name: google-oidc
        oidc:
          clientID: CLIENT_ID
          cloudConsoleRedirectURI: https://console.cloud.google.com/kubernetes/oidc
          extraParams: prompt=consent,access_type=offline
          issuerURI: https://accounts.google.com
          kubectlRedirectURI: http://localhost:10000/callback
          scopes: email
          userClaim: email
          userPrefix: '-'
    EOF
    

    Sostituisci CLIENT_ID con l'ID client OAuth del passaggio precedente.

    Tieni presente quanto segue in merito alla patch:

    • I token ID emessi dal sistema di autenticazione OAuth 2.0 di Google contengono un identificatore numerico univoco nell'attestazione relativa ai contenuti secondari. L'utilizzo di questo identificatore opaco nelle associazioni di ruoli rende difficile l'identificazione del soggetto di un'associazione di ruoli. Questa patch configura quindi Identity Service per GKE in modo che utilizzi la rivendicazione email dei token ID per identificare gli utenti anziché utilizzare la rivendicazione secondaria predefinita.

    • L'ambito email viene aggiunto in modo che i token ID emessi includano l'attestazione via email.

    • I campi cloudConsoleRedirectURI, extraParams, kubectlRedirectURI e ambiti vengono utilizzati quando gli sviluppatori eseguono l'autenticazione nel cluster utilizzando Identity Service for GKE. Non vengono utilizzati quando gli account di servizio Google eseguono l'autenticazione nel cluster. Il campo kubectlredirectURI è obbligatorio.

    • Il campo userPrefix è un prefisso per gli utenti che si autenticano utilizzando il provider di identità configurato. Il valore '-' indica che non c'è alcun prefisso.

    • Il campo spec.authentication è un array. Puoi utilizzare più provider di identità OpenID Connect con Identity Service per GKE. Ad esempio, puoi utilizzare Google come provider di identità per autenticare gli account di servizio Google e un provider di identità diverso per autenticare gli sviluppatori.

    Per saperne di più sui campi di questa configurazione, consulta Utilizzare provider di identità esterni per l'autenticazione in GKE.

Crea un account di servizio Google per configurare Identity Service per GKE

  1. In Cloud Shell, crea un account di servizio Google:

    gcloud iam service-accounts create ISG_GSA \
      --display-name "Configure Identity Service for GKE"
    

    Sostituisci ISG_GSA con il nome che vuoi utilizzare per l'account di servizio Google. Per questo tutorial, utilizza identity-service-for-gke.

    Devi assegnare questo account di servizio Google a un'istanza VM di Compute Engine per configurare Identity Service per GKE e controllo dell'accesso basato sui ruoli di Kubernetes sul cluster.

  2. Concedi il ruolo Amministratore Kubernetes Engine per il progetto all'account di servizio Google:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member serviceAccount:ISG_GSA@PROJECT_ID.iam.gserviceaccount.com \
      --role roles/container.admin
    

    Questo ruolo fornisce le autorizzazioni necessarie per eseguire le attività seguenti in questo tutorial:

    • Configura le impostazioni di Identity Service per GKE sui cluster nel progetto.
    • Crea associazioni di ruoli e associazioni di ruoli cluster nel cluster.

Configura Identity Service per GKE

Per configurare Identity Service per GKE, devi avere accesso al piano di controllo del cluster. In questo tutorial creerai un'istanza VM di Compute Engine per accedere al piano di controllo.

Devi disporre dell'accesso SSH all'istanza VM. Per abilitare l'accesso SSH autenticato e autorizzato dall'esterno della rete VPC all'istanza VM, utilizza l'inoltro TCP con Identity-Aware Proxy (IAP). Questa funzionalità consente l'accesso SSH senza che l'istanza VM abbia un indirizzo IP pubblico.

  1. In Cloud Shell, crea una regola firewall che consenta l'accesso SSH tramite l'inoltro TCP IAP a qualsiasi istanza VM che ha il tag di rete ssh-iap:

    gcloud compute firewall-rules create allow-ssh-ingress-from-iap \
      --allow tcp:22 \
      --description "Allow SSH tunneling using Identity-Aware Proxy" \
      --network NETWORK \
      --source-ranges 35.235.240.0/20 \
      --target-tags ssh-iap
    

    L'intervallo di origine contiene gli indirizzi IP utilizzati da IAP per l'inoltro TCP.

  2. Crea un'istanza VM di Compute Engine nella stessa rete VPC del cluster GKE:

    gcloud compute instances create VM \
      --metadata enable-oslogin=TRUE \
      --network NETWORK \
      --no-address \
      --scopes cloud-platform,userinfo-email \
      --service-account ISG_GSA@PROJECT_ID.iam.gserviceaccount.com \
      --subnet SUBNET  \
      --tags ssh-iap \
      --zone ZONE
    

    Sostituisci VM con il nome che vuoi utilizzare per l'istanza VM. Per questo tutorial, utilizza identity-service-for-gke-configuration.

    Tieni presente quanto segue in merito al comando riportato sopra:

    • Il flag --service-account collega l'account di servizio Google all'istanza VM.

    • L'ambito cloud-platform è obbligatorio per accedere all'API Service Account Credentials.

    • L'ambito userinfo-email è utile quando si crea un'istanza VM per la gestione del controllo dell'accesso basato sui ruoli di Kubernetes. È facoltativo per questo tutorial.

    • Il flag --no-address indica che l'istanza VM viene creata senza un indirizzo IP esterno.

    • Il valore facoltativo dei metadati dell'istanza enable-oslogin abilita OS Login sull'istanza VM. OS Login consente di gestire l'accesso SSH alle istanze VM mediante IAM.

  3. Copia il file di patch ClientConfig nell'istanza VM:

    gcloud compute scp client-config-patch.yaml VM:~ --tunnel-through-iap --zone ZONE
    

    Il flag --tunnel-through-iap indica a gcloud di eseguire il tunneling della connessione tramite IAP.

  4. Connettiti all'istanza VM tramite SSH:

    gcloud compute ssh VM --tunnel-through-iap --zone ZONE
    

    Esegui gli altri comandi in questa sezione dalla sessione SSH.

  5. Installa lo strumento a riga di comando kubectl e il programma binario gke-gcloud-auth-plugin nell'istanza VM:

    sudo apt-get install -y kubectl google-cloud-sdk-gke-gcloud-auth-plugin
    
  6. Recupera le credenziali per il cluster GKE:

    export USE_GKE_GCLOUD_AUTH_PLUGIN=True
    gcloud container clusters get-credentials CLUSTER --zone ZONE
    
  7. Applica la patch alla risorsa ClientConfig predefinita:

    kubectl patch clientconfig default \
        --namespace kube-public \
        --patch-file client-config-patch.yaml \
        --type merge
    
  8. Estrai il campo certificateAuthorityData dalla risorsa ClientConfig predefinita a cui è stata applicata la patch e archivialo in un file denominato certificateAuthorityData.pem:

    kubectl get clientconfig default \
         --namespace kube-public \
         --output jsonpath='{.spec.certificateAuthorityData}' \
         | base64 --decode > certificateAuthorityData.pem
    
  9. Estrai il campo del server dalla risorsa ClientConfig predefinita a cui è stata applicata la patch e archivialo in un file denominato server.txt:

    kubectl get clientconfig default \
         --namespace kube-public \
         --output jsonpath='{.spec.server}' > server.txt
    
  10. Esci dalla sessione SSH:

    exit
    

(Facoltativo) Verifica la configurazione del cluster

Prima di procedere, puoi verificare che Identity Service per GKE sia stato configurato correttamente nel cluster. Puoi verificare la configurazione utilizzando l'account di servizio Google collegato all'istanza VM per eseguire l'autenticazione nel cluster utilizzando Identity Service per GKE.

  1. In Cloud Shell, concedi il Creatore di token di identità OpenID Connect dell'account di servizio all'account di servizio Google all'account di servizio stesso:

    gcloud iam service-accounts add-iam-policy-binding \
      ISG_GSA@PROJECT_ID.iam.gserviceaccount.com \
      --member serviceAccount:ISG_GSA@PROJECT_ID.iam.gserviceaccount.com \
      --role roles/iam.serviceAccountOpenIdTokenCreator
    

    Questo ruolo fornisce l'autorizzazione iam.serviceAccounts.getOpenIdToken necessaria per richiedere i token ID per l'account di servizio dall'API Service Account Credentials.

  2. Connettiti all'istanza VM tramite SSH:

    gcloud compute ssh VM --tunnel-through-iap --zone ZONE
    

    Esegui gli altri comandi in questa sezione dalla sessione SSH.

  3. Richiedi un token di accesso OAuth 2.0 al server di metadati per l'account di servizio Google collegato all'istanza VM, utilizzando l'ID client OAuth come attestazione aud (pubblico) richiesta:

    ACCESS_TOKEN=$(curl --silent --header "Metadata-Flavor: Google" \
    http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token \
           | python3 -c 'import json, sys; print(json.load(sys.stdin).get("access_token"))')
    

    Il corpo della risposta del server di metadati è un documento JSON. Il comando utilizza uno script Python incorporato per estrarre il campo access_token dal corpo della risposta.

  4. Richiedi un token ID dall'API Service Account Credentials per l'account di servizio Google collegato all'istanza VM:

    ID_TOKEN=$(curl --silent --request POST \
        --data '{"audience": "CLIENT_ID", "includeEmail": true}' \
        --header "Authorization: Bearer $ACCESS_TOKEN" \
        --header "Content-Type: application/json; charset=utf-8" \
    "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/ISG_GSA@PROJECT_ID.iam.gserviceaccount.com:generateIdToken" \
           | python3 -c 'import json, sys; print(json.load(sys.stdin).get("token"))')
    

    Tieni presente quanto segue in merito al comando riportato sopra:

    • Il campo audience nel corpo della richiesta JSON specifica la rivendicazione aud (pubblico) richiesta per il token ID.
    • Il token di accesso del passaggio precedente viene utilizzato per l'autenticazione nell'API.
  5. Visualizza le rivendicazioni nel token ID:

    echo $ID_TOKEN \
        | cut -d. -f2 \
        | base64 --decode --ignore-garbage 2> /dev/null \
        | python3 -m json.tool
    

    Verifica che la dichiarazione email contenga l'indirizzo email dell'account di servizio Google.

  6. Utilizza il token ID per eseguire l'autenticazione sul piano di controllo mediante Identity Service for GKE:

    kubectl get namespaces \
        --certificate-authority certificateAuthorityData.pem \
        --server $(cat server.txt) \
        --token $ID_TOKEN
    

    L'output è simile al seguente:

      Error from server (Forbidden): namespaces is forbidden: User "ISG_GSA@PROJECT_ID.iam.gserviceaccount.com" cannot list resource "namespaces" in API group "" at the cluster scope
    

    Questo errore era previsto. Sebbene all'account di servizio Google siano state concesse autorizzazioni IAM sui cluster GKE nel progetto, queste autorizzazioni non si applicano quando esegui l'autenticazione utilizzando Identity Service per GKE. Puoi invece configurare l'accesso utilizzando controllo dell'accesso basato sui ruoli (RBAC) di Kubernetes.

  7. Crea un'associazione di ruoli nel cluster che conceda il ruolo del cluster view all'account di servizio Google quando l'account di servizio esegue l'autenticazione nel cluster utilizzando il provider OpenID Connect di Google:

    kubectl create clusterrolebinding ISG_GSA-cluster-view \
        --clusterrole view \
        --user ISG_GSA@PROJECT_ID.iam.gserviceaccount.com
    

    Se imposti un valore userPrefix diverso da - in ClientConfig nel tuo ambiente, aggiungi il prefisso al valore del flag --user in questo comando.

  8. Accedi al cluster GKE utilizzando Identity Service for GKE:

    kubectl get namespaces \
        --certificate-authority certificateAuthorityData.pem \
        --server $(cat server.txt) \
        --token $ID_TOKEN
    

    L'output è simile al seguente:

    NAME                      STATUS   AGE
    anthos-identity-service   Active   1h
    default                   Active   1h
    kube-node-lease           Active   1h
    kube-public               Active   1h
    kube-system               Active   1h
    
  9. Esci dalla sessione SSH:

    exit
    

Crea un contesto per lo strumento kubectl

Il comando kubectl può utilizzare un file kubeconfig per configurare l'accesso ai cluster. Un file kubeconfig contiene uno o più contesti. Ogni contesto ha un nome e, facoltativamente, include informazioni sulla connettività del cluster, credenziali utilizzate per l'autenticazione nel cluster e uno spazio dei nomi predefinito.

In questa sezione creerai un file kubeconfig con un contesto. Il contesto include i dettagli sulla connettività del proxy di Identity Service per GKE per il cluster. Non aggiungere credenziali utente al file kubeconfig.

  1. In Cloud Shell, copia i file che contengono i dati dell'autorità di certificazione e l'URL del server dall'istanza VM alla directory attuale:

    gcloud compute scp VM:~/certificateAuthorityData.pem VM:~/server.txt . \
        --tunnel-through-iap --zone ZONE
    
  2. Crea un contesto e una configurazione del cluster che utilizzerai in seguito per connetterti al cluster GKE da Cloud Build:

    kubectl config set-context private-cluster \
        --cluster private-cluster \
        --kubeconfig kubeconfig
    

    Il flag --kubeconfig crea il contesto e la configurazione del cluster in un nuovo file denominato kubeconfig nella directory attuale.

    Questo comando utilizza il nome del cluster GKE come nome della configurazione del cluster per il contesto. Nel tuo ambiente, puoi utilizzare un nome di configurazione del cluster diverso nel contesto.

  3. Imposta il campo certificateAuthorityData sulla configurazione del cluster:

    kubectl config set-cluster private-cluster \
        --certificate-authority certificateAuthorityData.pem \
        --embed-certs \
        --kubeconfig kubeconfig
    
  4. Imposta il campo server sulla configurazione del cluster:

    kubectl config set-cluster private-cluster \
        --kubeconfig kubeconfig \
        --server $(cat server.txt)
    

Creare un account di servizio Google per Cloud Build

  1. In Cloud Shell, crea un account di servizio Google per eseguire le build nel pool privato di Cloud Build:

    gcloud iam service-accounts create CB_GSA \
      --description "Runs builds on Cloud Build private pools" \
      --display-name "Cloud Build private pool"
    

    Sostituisci CB_GSA con il nome che vuoi utilizzare per l'account di servizio Google. Per questo tutorial, utilizza cloud-build-private-pool.

  2. Concedi il ruolo Account di servizio Cloud Build per il progetto all'account di servizio Google:

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member serviceAccount:CB_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/cloudbuild.builds.builder
    

    Questo ruolo fornisce le autorizzazioni predefinite dell'account di servizio Cloud Build gestito da Google.

  3. Concedi l'Creatore token identità OpenID Connect dell'account di servizio nell'account di servizio Google all'account di servizio stesso:

    gcloud iam service-accounts add-iam-policy-binding \
        CB_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --member serviceAccount:CB_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.serviceAccountOpenIdTokenCreator
    

    Questo ruolo fornisce l'autorizzazione iam.serviceAccounts.getOpenIdToken necessaria per richiedere i token ID per l'account di servizio dall'API Service Account Credentials.

  4. Connettiti all'istanza VM tramite SSH:

    gcloud compute ssh VM --tunnel-through-iap --zone ZONE
    

    Esegui gli altri comandi in questa sezione dalla sessione SSH.

  5. Nella sessione SSH, crea un'associazione del ruolo del cluster Kubernetes che concede il ruolo del cluster cluster-admin all'account di servizio Google quando l'account di servizio esegue l'autenticazione nel cluster utilizzando il provider OpenID Connect di Google:

    kubectl create clusterrolebinding CB_GSA-cluster-admin \
        --clusterrole cluster-admin \
        --user CB_GSA@PROJECT_ID.iam.gserviceaccount.com
    

    Il ruolo cluster cluster-admin concede autorizzazioni estese a livello di cluster. Nel tuo ambiente puoi utilizzare un ruolo cluster che fornisce solo le autorizzazioni necessarie per le attività eseguite da Cloud Build. Puoi anche utilizzare le associazioni di ruoli per concedere autorizzazioni solo a spazi dei nomi specifici.

    Se imposti un valore userPrefix in ClientConfig nel tuo ambiente, devi aggiungere questo prefisso al valore del flag --user in questo comando.

  6. Esci dalla sessione SSH:

    exit
    

Crea un pool privato di Cloud Build

  1. In Cloud Shell, alloca un intervallo di indirizzi IP nella tua rete VPC per la connessione con il pool privato:

    gcloud compute addresses create RESERVED_RANGE_NAME \
    --addresses RESERVED_RANGE_START_IP\
        --description "Cloud Build private pool reserved range" \
        --global \
        --network NETWORK \
        --prefix-length RESERVED_RANGE_PREFIX_LENGTH \
        --purpose VPC_PEERING
    

    Sostituisci quanto segue:

    • RESERVED_RANGE_NAME: il nome dell'intervallo di indirizzi IP allocato che ospita il pool privato Cloud Build. Per questo tutorial, utilizza cloud-build-private-pool.
    • RESERVED_RANGE_START_IP: il primo indirizzo IP dell'intervallo di indirizzi IP allocato. Per questo tutorial, utilizza 192.168.12.0.
    • RESERVED_RANGE_PREFIX_LENGTH: la lunghezza del prefisso (subnet mask) dell'intervallo di indirizzi IP allocato. La lunghezza del prefisso deve essere /23 o un numero inferiore, ad esempio /22 o /21. Un numero più basso indica un intervallo di indirizzi più ampio. Per questo tutorial, utilizza 23 e non inserire la barra (/) iniziale.
  2. Crea una regola firewall per consentire il traffico in entrata dall'intervallo di indirizzi IP riservati ad altre risorse nella tua rete VPC:

    gcloud compute firewall-rules create allow-private-pools-ingress \
        --allow all \
        --network NETWORK \
        --source-ranges RESERVED_RANGE_START_IP/RESERVED_RANGE_PREFIX_LENGTH
    
  3. Crea una connessione privata ai servizi per connettere la tua rete VPC al servizio di networking di servizi:

    gcloud services vpc-peerings connect \
        --network NETWORK \
        --ranges RESERVED_RANGE_NAME \
        --service servicenetworking.googleapis.com
    

    I pool privati di Cloud Build eseguono i worker utilizzando il networking dei servizi. La connessione privata ai servizi consente alla tua rete VPC di comunicare con il pool privato nell'intervallo allocato di indirizzi IP interni, utilizzando una connessione di peering di rete VPC.

    La creazione della connessione privata ai servizi può richiedere alcuni minuti.

    Se utilizzi un VPC condiviso nel tuo ambiente, per informazioni sui passaggi aggiuntivi per creare la connessione privata ai servizi, consulta Configurare l'ambiente.

  4. Crea un pool privato di Cloud Build in una rete VPC di proprietà di Google connessa in peering con la tua rete VPC:

    gcloud builds worker-pools create PRIVATE_POOL_NAME \
       --no-public-egress \
       --peered-network projects/PROJECT_ID/global/networks/NETWORK \
       --region REGION
    

    Sostituisci quanto segue:

    • PRIVATE_POOL_NAME: il nome del pool privato. Per questo tutorial, utilizza private-pool.
    • REGION: la regione da utilizzare per il pool privato. Per questo tutorial, utilizza us-central1.

    Il flag --no-public-egress indica che i worker nel pool privato non hanno indirizzi IP pubblici. Nel tuo ambiente, puoi rimuovere questo flag se vuoi che i worker del pool privato abbiano una connessione a internet mediante indirizzi IP pubblici.

    Per informazioni sulle opzioni di configurazione aggiuntive, come il tipo di macchina e le dimensioni del disco per i worker nel pool privato, vedi Creare e gestire pool privati.

Verifica la soluzione

In questa sezione verificherai la soluzione eseguendo una build sul pool privato di Cloud Build. La build accede al cluster GKE privato.

  1. In Cloud Shell, crea un bucket Cloud Storage per archiviare i log delle build da Cloud Build:

    gsutil mb -l REGION gs://PROJECT_ID-build-logs
    
  2. Crea un file di configurazione di compilazione per Cloud Build:

    cat << "EOF" > cloudbuild.yaml
    steps:
    - id: list-services
      name: gcr.io/google.com/cloudsdktool/google-cloud-cli
      entrypoint: bash
      args:
      - -eEuo
      - pipefail
      - -c
      - |-
        kubectl config use-context $_KUBECTL_CONTEXT
    
        ACCESS_TOKEN=$$(curl --silent \
            --header "Metadata-Flavor: Google" \
            http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token \
            | python3 -c 'import json, sys; print(json.load(sys.stdin).get("access_token"))')
    
        ID_TOKEN=$$(curl --silent --request POST \
            --data '{"audience": "CLIENT_ID", "includeEmail": true}' \
            --header "Authorization: Bearer $$ACCESS_TOKEN" \
            --header "Content-Type: application/json; charset=utf-8" \
            "https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/$_SERVICE_ACCOUNT:generateIdToken" \
            | python3 -c 'import json, sys; print(json.load(sys.stdin).get("token"))')
    
        kubectl get services --namespace $_NAMESPACE --token $$ID_TOKEN
    
    logsBucket: gs://PROJECT_ID-build-logs
    
    options:
      env:
      - KUBECONFIG=/workspace/$_KUBECONFIG
    
    substitutions:
      _KUBECONFIG: kubeconfig
      _KUBECTL_CONTEXT: private-cluster
      _NAMESPACE: default
    
    serviceAccount: projects/$PROJECT_ID/serviceAccounts/$_SERVICE_ACCOUNT
    EOF
    

    Il passaggio nel file di configurazione di compilazione esegue le seguenti operazioni:

    1. Passa al contesto kubectl specificato dalla sostituzione _KUBECTL_CONTEXT. Il valore di sostituzione predefinito è private-cluster.

    2. Recupera un token di accesso dal server dei metadati. Il token di accesso viene inviato all'account di servizio Google che esegue la build.

    3. Genera un token ID utilizzando l'API Service Account Credentials. La richiesta per generare il token ID viene autenticata mediante il token di accesso. La rivendicazione aud (pubblico) richiesta del token ID è l'ID client OAuth 2.0 specificato dalla sostituzione _CLIENT_ID.

    4. Elenca i servizi Kubernetes nello spazio dei nomi specificato dalla sostituzione _NAMESPACE. Il valore di sostituzione predefinito è default. La richiesta viene autenticata utilizzando il token ID generato nel comando precedente.

    Tieni presente quanto segue in merito al file di configurazione di compilazione:

    • Il carattere $ è il prefisso per le sostituzioni. $$ viene utilizzato per l'espansione dei parametri bash e la sostituzione dei comandi.

    • Le sostituzioni _KUBECONFIG e _KUBECTL_CONTEXT consentono di specificare diversi file kubeconfig e contesti diversi quando esegui una build. Queste sostituzioni consentono di gestire più configurazioni di cluster utilizzando un singolo file kubeconfig con più contesti o più file kubeconfig.

    • La sostituzione _SERVICE_ACCOUNT non ha un valore predefinito. Devi fornire un valore per questa sostituzione quando esegui una build.

    • Il blocco options imposta la variabile di ambiente KUBECONFIG per tutti i passaggi della build.

    • Il passaggio di build utilizza l'immagine del builder di gcr.io/google.com/cloudsdktool/google-cloud-cli. Questa è un'immagine container di grandi dimensioni e il pull dal registro al worker del pool privato richiede un po' di tempo. Per ridurre il tempo necessario per il pull dell'immagine del builder, puoi creare un'immagine del builder personalizzata contenente solo gli strumenti necessari per il passaggio di build, ad esempio curl, kubectl e Python.

    Per ulteriori informazioni sugli script shell incorporati nei file di configurazione della build, consulta la sezione Esecuzione di script bash.

  3. Esegui una build utilizzando il file di configurazione di compilazione e i file nella directory corrente:

    gcloud builds submit \
        --config cloudbuild.yaml \
        --region REGION \
        --substitutions _SERVICE_ACCOUNT=CB_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --worker-pool projects/PROJECT_ID/locations/REGION/workerPools/PRIVATE_POOL_NAME
    

    Il comando carica tutti i file che si trovano nella directory attuale in Cloud Storage per utilizzarli da Cloud Build. Il passaggio di build utilizza il file kubeconfig per connettersi al cluster GKE.

    Verso la fine dell'output, vedrai delle righe simili alle seguenti:

    NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   2h
    

    Questo output mostra che il worker del pool privato si è connesso al piano di controllo del cluster utilizzando il proxy di autenticazione di Identity Service for GKE.

Risoluzione dei problemi

Se non riesci a connetterti all'istanza VM tramite SSH, aggiungi il flag --troubleshoot per scoprire la causa dei problemi di connettività:

gcloud compute ssh VM --tunnel-through-iap --zone ZONE --troubleshoot

Se ricevi il messaggio Error from server (NotFound): clientconfigs.authentication.gke.io "default" not found quando applichi la patch al ClientConfig predefinito sul cluster GKE, assicurati di aver creato la regola firewall come descritto nella sezione Creazione di un cluster GKE privato. Verifica che la regola firewall esista:

gcloud compute firewall-rules describe allow-control-plane-clientconfig-webhook

Se non riesci ad eseguire l'autenticazione al proxy di Identity Service per GKE, cerca gli errori nei log dei pod nel deployment gke-oidc-service:

gcloud compute ssh VM --tunnel-through-iap --zone ZONE --command \
    'kubectl logs deployment/gke-oidc-service \
         --namespace anthos-identity-service --all-containers'

Se riscontri altri problemi con questo tutorial, ti consigliamo di esaminare i seguenti documenti:

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 risorse

Se vuoi mantenere il progetto che hai utilizzato in questo tutorial, elimina le singole risorse:

  1. In Cloud Shell, elimina il pool privato di Cloud Build:

    gcloud builds worker-pools delete PRIVATE_POOL_NAME --region REGION --quiet
    
  2. Elimina la connessione privata del servizio a Networking di servizi:

    gcloud services vpc-peerings delete --network NETWORK \
      --service servicenetworking.googleapis.com --quiet --async
    
  3. Elimina l'intervallo di indirizzi IP allocato ai pool privati di Cloud Build:

    gcloud compute addresses delete RESERVED_RANGE_NAME --global --quiet
    
  4. Elimina il bucket Cloud Storage e tutti i relativi contenuti:

    gsutil rm -r gs://PROJECT_ID-build-logs
    
  5. Elimina il cluster GKE:

    gcloud container clusters delete CLUSTER --zone ZONE --quiet --async
    
  6. Elimina l'istanza VM di Compute Engine:

    gcloud compute instances delete VM --zone ZONE --quiet
    
  7. Elimina le regole firewall:

    gcloud compute firewall-rules delete allow-private-pools-ingress --quiet
    
    gcloud compute firewall-rules delete allow-ssh-ingress-from-iap --quiet
    
    gcloud compute firewall-rules delete allow-control-plane-clientconfig-webhook --quiet
    
  8. Rimuovi le associazioni di ruoli IAM:

    gcloud projects remove-iam-policy-binding PROJECT_ID \
        --member serviceAccount:CB_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/cloudbuild.builds.builder
    
    gcloud projects remove-iam-policy-binding PROJECT_ID \
        --member serviceAccount:ISG_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/container.admin
    
    gcloud iam service-accounts remove-iam-policy-binding \
        CB_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --member serviceAccount:CB_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.serviceAccountOpenIdTokenCreator
    
    gcloud iam service-accounts remove-iam-policy-binding \
        ISG_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --member serviceAccount:ISG_GSA@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.serviceAccountOpenIdTokenCreator
    
  9. Elimina gli account di servizio Google:

    gcloud iam service-accounts delete CB_GSA@PROJECT_ID.iam.gserviceaccount.com \
       --quiet
    
    gcloud iam service-accounts delete ISG_GSA@PROJECT_ID.iam.gserviceaccount.com \
       --quiet
    

Eliminare l'ID client OAuth 2.0

  1. Vai alla pagina Credenziali nella console Google Cloud:

    Apri la pagina Credenziali

  2. Seleziona il progetto dall'elenco del selettore di progetti.

  3. Nella tabella degli ID client OAuth 2.0, individua la riga Identity Service for GKE (Servizio di identità per GKE) e fai clic sull'icona Elimina client OAuth.

  4. Nella finestra di dialogo, fai clic su Elimina.

Passaggi successivi