Usa un registro di immagini private senza secret

GKE su AWS fornisce un modo per estrarre immagini private da Artifact Registry o Container Registry senza dover utilizzare un secret di Kubernetes. In precedenza, era necessario eseguire i seguenti passaggi:

  1. Creare un account di servizio Google Identity and Access Management (IAM).
  2. Concedi all'account di servizio le autorizzazioni per accedere al registro privato.
  3. Scarica la chiave dell'account di servizio e salvala come secret di Kubernetes nel tuo cluster.
  4. Fai riferimento a questo secret nel manifest YAML per pod o deployment in modo che possano accedere alle immagini dal repository di container privato.
  5. Ruota e gestisci regolarmente le chiavi associate all'account di servizio Google IAM.

GKE su AWS elimina tutti questi passaggi manuali e gestisce automaticamente l'autenticazione e l'autorizzazione necessarie per il pull delle immagini private.

Prima di iniziare

Per seguire i passaggi descritti in questa pagina, devi prima completare le seguenti operazioni:

Cerca immagini su Artifact Registry

Per completare gli altri passaggi, è necessaria un'immagine container. Per recuperare il nome delle immagini container, segui questi passaggi:

  1. Configura lo strumento a riga di comando Docker per eseguire l'autenticazione in Artifact Registry con Google Cloud SDK:

    gcloud auth configure-docker
    

    Google Cloud CLI registra un helper per le credenziali per tutti i registry Docker supportati da Google.

  2. Conferma che Artifact Registry includa un'immagine con il comando docker images:

    docker images
    

    Docker si connette ad Artifact Registry e restituisce le immagini disponibili nel tuo repository. Ad esempio, la seguente risposta mostra un'immagine container denominata hello-app nel repository PROJECT_NAME su us-west1-docker.pkg.dev.

    REPOSITORY                                                            TAG          IMAGE ID       CREATED          SIZE
    us-west1-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app   v1           f7cfe0d58569   21 minutes ago   11.5MB
    

Se non hai un'immagine container pronta, creane una seguendo la procedura descritta in Deployment di un'applicazione containerizzata.

Creazione di pod con immagini private senza secret di pull delle immagini

Per creare un pod che possa accedere a un'immagine container privata da un registro, non devi più fornire il campo spec.imagePullSecrets nella specifica del pod. Per configurare il pod, segui questi passaggi:

  1. Crea una definizione di pod senza il campo spec.imagePullSecrets:

    apiVersion: v1
    kind: Pod
    metadata:
      name: POD_NAME
    spec:
      containers:
      - name: CONTAINER_NAME
        image: LOCATION-docker.pkg.dev/PROJECT_NAME/REPOSITORY_NAME/IMAGE_NAME:IMAGE_VERSION
    

    Sostituisci quanto segue:

    • POD_NAME: il nome del pod.
    • CONTAINER_NAME: il nome del container all'interno del pod.
    • LOCATION: la regione Google Cloud che contiene il registro. Ad esempio, us-west1.
    • PROJECT_NAME: il nome del progetto Google che ospita il repository Artifact Registry, che potrebbe essere uguale al progetto del tuo cluster. Se il repository si trova in un progetto diverso, consulta Utilizzare Artifact Registry quando non si trova nello stesso progetto del tuo cluster per ulteriori passaggi.
    • REPOSITORY_NAME: il nome del repository.
    • IMAGE_NAME: il nome dell'immagine.
    • IMAGE_VERSION: la versione dell'immagine.
  2. Applica la configurazione al cluster con kubectl:

    kubectl apply -f YAML_FILE_NAME
    

    Sostituisci YAML_FILE_NAME con il nome del tuo file YAML.

Esempio di creazione di pod senza secret di pull delle immagini

Ecco un esempio di creazione di un pod Kubernetes senza bisogno di secret di pull delle immagini. Il pod estrae l'immagine hello-app da Artifact Registry.

  1. Per eseguire il pull dell'immagine hello-app, copia il seguente codice YAML in un file denominato hello-pod.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: hello-pod
    spec:
      containers:
      - name: hello-container
        image: us-west1-docker.pkg.dev/example-project/hello-repo/hello-app:v1
    
  2. Applica la configurazione al cluster con kubectl:

    kubectl apply -f hello-pod.yaml
    
  3. Conferma che il pod sia in esecuzione con kubectl get:

    kubectl get pod/hello-pod
    

    La risposta include un pod con stato Running.

    NAME        READY   STATUS    RESTARTS   AGE
    hello-pod   1/1     Running   0          15s
    

Crea deployment con immagini private senza secret di pull delle immagini

Per creare un deployment in grado di accedere a un'immagine container privata da un registro, non devi più fornire il campo spec.imagePullSecrets nella specifica del deployment. Per configurare il deployment, segui questi passaggi:

  1. Crea una definizione di deployment senza il campo spec.imagePullSecrets:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: DEPLOYMENT_NAME
    spec:
      replicas: NUMBER_OF_REPLICAS
      template:
        spec:
          containers:
          - name: CONTAINER_NAME
            image: LOCATION-docker.pkg.dev/PROJECT_NAME/REPOSITORY_NAME/IMAGE_NAME:IMAGE_VERSION
    

    Sostituisci quanto segue:

    • DEPLOYMENT_NAME: il nome del deployment.
    • NUMBER_OF_REPLICAS: quante istanze del pod definito nel deployment devono essere in esecuzione in un dato momento.
    • CONTAINER_NAME: il nome del container all'interno del pod.
    • LOCATION: la regione Google Cloud che contiene il registro. Ad esempio, us-west1.
    • PROJECT_NAME: il nome del progetto Google che ospita il repository Artifact Registry, che potrebbe non corrispondere al progetto del cluster. Se il repository si trova in un progetto diverso, consulta Utilizzare Artifact Registry quando non si trova nello stesso progetto del tuo cluster per ulteriori passaggi.
    • REPOSITORY_NAME: il nome del repository.
    • IMAGE_NAME: il nome dell'immagine.
    • IMAGE_VERSION: la versione dell'immagine.
  2. Applica la configurazione al cluster con kubectl.

    kubectl apply -f name-of-your-yaml-file.yaml
    

Esempio di creazione di un deployment senza secret di pull dell'immagine

Ecco un esempio di creazione di un deployment senza secret di pull dell'immagine. Il deployment estrae un'immagine hello-app da Artifact Registry.

  1. Crea un file denominato hello-deployment.yaml con il seguente contenuto:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: hello-app-deployment
    spec:
      selector:
        matchLabels:
          app: products
          department: sales
      replicas: 3
      template:
        metadata:
          labels:
            app: products
            department: sales
        spec:
          containers:
          - name: hello
            image: LOCATION-docker.pkg.dev/PROJECT_NAME/hello-repo/hello-app:v1
            env:
            - name: "PORT"
              value: "50001"
    

    Sostituisci quanto segue:

  2. Applica la configurazione al cluster con kubectl.

    kubectl apply -f hello-deployment.yaml
    
  3. Conferma che il deployment sia in esecuzione con kubectl pods.

    kubectl get pods --selector=app=products
    

    L'output mostra tre pod Running.

    NAME                                    READY   STATUS    RESTARTS   AGE
    hello-app-deployment-67d9c6d98c-b69f2   1/1     Running   0          14m
    hello-app-deployment-67d9c6d98c-d6k5c   1/1     Running   0          14m
    hello-app-deployment-67d9c6d98c-p2md5   1/1     Running   0          14m
    

Utilizza Artifact Registry se non si trova nello stesso progetto del tuo cluster

Per utilizzare un repository Artifact Registry che si trova in un progetto Google diverso da quello contenente il tuo cluster, segui questi passaggi:

Concedi all'account di servizio delle istanze di macchine virtuali del pool di nodi del cluster, noto come Agente di servizio macchina del pool di nodi, le autorizzazioni necessarie per accedere a questo registro.

gcloud projects add-iam-policy-binding AR_PROJECT_ID \
  --member=NODE_POOL_MACHINE_SERVICE_AGENT \
  --role=ROLE

Questo passaggio garantisce che il cluster possa recuperare gli artefatti dal registro nel progetto separato.

Sostituisci quanto segue:

  • AR_PROJECT_ID: l'ID del progetto Google che ospita Artifact Registry.
  • NODE_POOL_MACHINE_SERVICE_AGENT: l'account di servizio per il pool di nodi del cluster, che ha il formato seguente: service-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com
  • ROLE: il ruolo roles/artifactregistry.reader o un ruolo personalizzato che concede autorizzazioni sufficienti per accedere alle immagini nel repository Artifact Registry.

Utilizza Google Container Registry privato

Per integrare un registro di container Google privato con GKE su cluster AWS, indipendentemente dalla località del progetto Google, segui questi passaggi:

Consenti all'agente di servizio della macchina del pool di nodi, l'account di servizio per le istanze di macchine virtuali del pool di nodi del cluster, di accedere a Container Registry:

gcloud projects add-iam-policy-binding GCR_PROJECT_ID \
  --member=NODE_POOL_MACHINE_SERVICE_AGENT \
  --role=ROLE

Questo passaggio consente all'account di servizio del cluster di accedere alle immagini container private.

Sostituisci quanto segue:

  • GCR_PROJECT_ID: l'ID del progetto che ospita il Container Registry.
  • NODE_POOL_MACHINE_SERVICE_AGENT: l'account di servizio del pool di nodi nel formato service-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com.
  • ROLE: scegli storage.objectViewer o un ruolo personalizzato affinché l'accesso a Container Registry sia sufficiente. Presta attenzione all'accesso ampio con storage.objectViewer.

Esegui la pulizia

Per rimuovere le risorse che hai creato in questa pagina, esegui questi comandi:

kubectl apply -f POD_YAML_FILE
kubectl delete -f DEPLOYMENT_YAML_FILE

Sostituisci quanto segue:

  • POD_YAML_FILE: il nome del file YAML in cui hai definito il pod.
  • DEPLOYMENT_YAML_FILE: il nome del file YAML in cui hai definito il deployment.

Passaggi successivi