Utiliser un registre d'images privé sans secrets

GKE sur AWS permet d'extraire des données des images provenant d'Artifact Registry ou de Container Registry sans avoir à utiliser de secret Kubernetes. Auparavant, il fallait exécuter étapes suivantes:

  1. Créez un compte de service Google Identity and Access Management (IAM).
  2. Accorder au compte de service l'autorisation d'accéder au registre privé.
  3. Télécharger la clé du compte de service et l'enregistrer en tant que secret Kubernetes dans votre cluster.
  4. Référencer ce secret dans votre fichier manifeste YAML pour les pods ou les déploiements afin qu'ils puissent accéder aux images du dépôt de conteneurs privé.
  5. Alterner régulièrement et gérer les clés associées au compte de service IAM Google.

GKE sur AWS élimine toutes ces étapes manuelles et gère automatiquement l'authentification et l'autorisation requises pour extraire des images privées.

Avant de commencer

Pour effectuer les étapes décrites sur cette page, procédez comme suit :

Rechercher des images sur Artifact Registry

Pour effectuer les étapes restantes, vous devez disposer d'une image de conteneur. Récupérez le nom de vos images de conteneur en procédant comme suit :

  1. Configurez l'outil de ligne de commande Docker pour vous authentifier auprès d'Artifact Registry avec Google Cloud SDK :

    gcloud auth configure-docker
    

    Google Cloud CLI enregistre un assistant d'identification pour tous les registres Docker compatibles avec Google.

  2. Vérifiez qu'Artifact Registry inclut une image en exécutant la commande docker images :

    docker images
    

    Docker se connecte à Artifact Registry et renvoie les images disponibles dans votre dépôt. Par exemple, la réponse suivante affiche une image de conteneur nommée hello-app dans le dépôt PROJECT_NAME sur 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
    

Si vous n'avez pas d'image de conteneur prête à l'emploi, créez-en une en suivant les étapes décrites sur la page Déployer une application en conteneur.

Créer des pods avec des images privées sans secrets d'extraction d'image

Pour créer un pod pouvant accéder à une image de conteneur privée à partir d'un registre, vous n'avez plus besoin de fournir le champ spec.imagePullSecrets dans la spécification de votre pod. Pour configurer votre pod, procédez comme suit:

  1. Créez une définition de pod sans le champ 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
    

    Remplacez les éléments suivants :

    • POD_NAME : nom du pod.
    • CONTAINER_NAME : nom du conteneur situé dans le pod
    • LOCATION : région Google Cloud contenant votre registre. Exemple :us-west1
    • PROJECT_NAME : nom du projet Google hébergeant votre dépôt Artifact Registry, qui peut être le même que le projet de votre cluster. Si le dépôt se trouve dans un autre projet, consultez la section Utiliser Artifact Registry lorsqu'il n'est pas dans le même projet que votre cluster pour connaître les étapes supplémentaires.
    • REPOSITORY_NAME : le nom de votre dépôt.
    • IMAGE_NAME : nom de l'image.
    • IMAGE_VERSION : version de l'image.
  2. Appliquez la configuration à votre cluster à l'aide de la commande kubectl :

    kubectl apply -f YAML_FILE_NAME
    

    Remplacez YAML_FILE_NAME par le nom de votre fichier YAML .

Exemple de création de pods sans secrets d'extraction d'image

Voici un exemple de création d'un pod Kubernetes sans avoir besoin de secrets d'extraction d'image. Le pod extrait l'image hello-app d'Artifact Registry.

  1. Pour extraire l'image hello-app, copiez le fichier YAML suivant dans un fichier nommé 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. Appliquez la configuration à votre cluster à l'aide de la commande kubectl :

    kubectl apply -f hello-pod.yaml
    
  3. Vérifiez que le pod est en cours d'exécution à l'aide de la commande kubectl get :

    kubectl get pod/hello-pod
    

    La réponse inclut un pod dont l'état est Running.

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

Créer des déploiements avec des images privées sans secrets d'extraction d'image

Pour créer un déploiement pouvant accéder à une image de conteneur privée à partir d'un registre, vous n'avez plus besoin de fournir le champ spec.imagePullSecrets dans votre spécification de déploiement. Pour configurer votre déploiement, procédez comme suit :

  1. Créez une définition de déploiement sans le champ 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
    

    Remplacez les éléments suivants :

    • DEPLOYMENT_NAME: nom de votre déploiement.
    • NUMBER_OF_REPLICAS : nombre d'instances du pod définies dans le déploiement qui doivent être exécutées à tout moment.
    • CONTAINER_NAME : nom du conteneur situé dans le pod
    • LOCATION: région Google Cloud contenant votre registre. Exemple :us-west1
    • PROJECT_NAME : nom du projet Google hébergeant votre dépôt Artifact Registry, qui peut être différent du projet de votre cluster. Si le dépôt se trouve dans un autre projet, consultez la section Utiliser Artifact Registry lorsqu'il n'est pas dans le même projet que votre cluster pour connaître les étapes supplémentaires.
    • REPOSITORY_NAME : le nom de votre dépôt.
    • IMAGE_NAME : nom de l'image.
    • IMAGE_VERSION : version de l'image.
  2. Appliquez la configuration à votre cluster à l'aide de la commande kubectl.

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

Exemple de création d'un déploiement sans secrets d'extraction d'image

Voici un exemple de création d'un déploiement sans secrets d'extraction d'image. Le déploiement extrait une image hello-app d'Artifact Registry.

  1. Créez un fichier nommé hello-deployment.yaml avec le contenu suivant :

    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"
    

    Remplacez les éléments suivants :

  2. Appliquez la configuration à votre cluster à l'aide de la commande kubectl.

    kubectl apply -f hello-deployment.yaml
    
  3. Vérifiez que votre déploiement est en cours d'exécution avec kubectl pods.

    kubectl get pods --selector=app=products
    

    Le résultat affiche trois pods 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
    

Utiliser Artifact Registry lorsqu'il ne se trouve pas dans le même projet que votre cluster

Pour utiliser un dépôt Artifact Registry se trouvant dans un projet Google différent du projet contenant votre cluster, procédez comme suit:

Attribuez les autorisations nécessaires pour accéder à ce registre au compte de service des instances de machine virtuelle du pool de nœuds de votre cluster, connu sous le nom de Agent de service de machine de pool de nœuds.

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

Cette étape permet de s'assurer que votre cluster peut récupérer des artefacts à partir du registre de ce projet distinct.

Remplacez les éléments suivants :

  • AR_PROJECT_ID : ID du projet Google hébergeant le registre d'artefacts.
  • NODE_POOL_MACHINE_SERVICE_AGENT : compte de service du pool de nœuds de votre cluster, au format suivant : service-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com
  • ROLE : le rôle roles/artifactregistry.reader ou un rôle personnalisé qui accorde des autorisations suffisantes pour accéder aux images dans le dépôt Artifact Registry.

Utiliser Google Container Registry privé

Pour intégrer un registre Google Container Registry privé à votre solution GKE sur AWS quel que soit l'emplacement de son projet Google, procédez comme suit:

Autorisez l'agent de service de machine de pool de nœuds, le compte de service des instances de machine virtuelle du pool de nœuds de votre cluster, à accéder à Container Registry :

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

Cette étape permet au compte de service du cluster d'accéder aux images de conteneur privé.

Remplacez les éléments suivants :

  • GCR_PROJECT_ID: ID du projet hébergeant Container Registry.
  • NODE_POOL_MACHINE_SERVICE_AGENT: compte de service de pool de nœuds, au format service-CLUSTER_RESOURCE_PROJECT_NUMBER@gcp-sa-gkemulticloudnpmachine.iam.gserviceaccount.com
  • ROLE : sélectionnez storage.objectViewer ou un rôle personnalisé pour un accès suffisant à Container Registry. Faites attention à l'accès étendu avec storage.objectViewer.

Effectuer un nettoyage

Pour supprimer les ressources que vous avez créées sur cette page, exécutez les commandes suivantes :

kubectl apply -f POD_YAML_FILE
kubectl delete -f DEPLOYMENT_YAML_FILE

Remplacez les éléments suivants :

  • POD_YAML_FILE : nom du fichier YAML dans lequel vous avez défini le pod.
  • DEPLOYMENT_YAML_FILE: nom du fichier YAML dans lequel vous avez défini le déploiement.

Étapes suivantes