Configurer un accès restreint pour les clusters privés GKE

Ce document explique comment configurer des entrées DNS pour acheminer les requêtes vers les domaines pkg.dev et gcr.io à l'aide d'une adresse IP virtuelle restreinte (VIP) lorsque vous utilisez des clusters privés Google Kubernetes Engine dans un périmètre de service VPC Service Controls.

Ces domaines de registre se résolvent généralement vers une adresse IP publique sur Internet. Dans les clusters privés GKE, les nœuds sont isolés d'Internet par défaut. Cela signifie que les requêtes adressées aux registres échoueront si vous n'avez pas configuré le routage DNS vers l'adresse IP virtuelle restreinte.

Vos clusters privés doivent toujours accéder à Artifact Registry ou Container Registry avec l'adresse IP virtuelle restreinte pour empêcher l'exfiltration de données depuis un service compatible vers un service non compatible.

Cette procédure n'est requise que dans les cas suivants:

  • Vous utilisez des clusters privés GKE.
  • Vous n'avez pas encore configuré le routage des domaines de registre pkg.dev ou gcr.io vers restricted.googleapis.com.

Avant de commencer

Avant de créer un périmètre de service, configurez un nouveau cluster privé ou identifiez les clusters privés existants que vous souhaitez protéger.

En outre, vous devez autoriser la sortie vers la plage d'adresses 199.36.153.4/30 sur le port 443. Normalement, un réseau VPC possède une règle implicite qui autorise tout le trafic de sortie vers n'importe quelle destination. Toutefois, si vous avez une règle refusant ce trafic, vous devez créer une règle de pare-feu de sortie pour autoriser le trafic TCP sur le port 443 vers la plage d'adresses 199.36.153.4/30.

Configurer un DNS

Configurez votre serveur DNS de sorte que les requêtes envoyées aux adresses de registre soient associées à restricted.googleapis.com, l'adresse IP virtuelle restreinte. Pour ce faire, utilisez les zones DNS privées Cloud DNS.

  1. Créez une zone privée gérée.

    gcloud dns managed-zones create ZONE_NAME \
        --visibility=private \
        --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK \
        --description=DESCRIPTION \
        --dns-name=REGISTRY_DOMAIN \
        --project=PROJECT_ID
    

    Où :

    • ZONE_NAME est le nom de la zone que vous créez. Exemple : registry. Ce nom sera utilisé dans chacune des étapes suivantes.

    • PROJECT_ID est l'ID du projet qui héberge votre cluster privé GKE.

    • NETWORK est une liste facultative de noms pour le réseau du cluster à partir duquel vous souhaitez rediriger les requêtes.

    • DESCRIPTION est une description lisible de la zone gérée.

    • REGISTRY_DOMAIN est le domaine de votre registre :

      • pkg.dev pour Artifact Registry
      • gcr.io pour les dépôts Container Registry ou les dépôts gcr.io hébergés dans Artifact Registry
  2. Lancez une transaction.

    gcloud dns record-sets transaction start \
      --zone=ZONE_NAME \
      --project=PROJECT_ID
    

    Où :

    • ZONE_NAME est le nom de la zone que vous avez créée à la première étape.

    • PROJECT_ID est l'ID du projet qui héberge votre cluster privé GKE.

  3. Ajoutez un enregistrement CNAME pour votre registre.

    gcloud dns record-sets transaction add \
      --name=*.REGISTRY_DOMAIN. \
      --type=CNAME REGISTRY_DOMAIN. \
      --zone=ZONE_NAME \
      --ttl=300 \
      --project=PROJECT_ID
    

    Où :

    • ZONE_NAME est le nom de la zone que vous avez créée à la première étape.

    • PROJECT_ID est l'ID du projet qui héberge votre cluster privé GKE.

    • REGISTRY_DOMAIN est le domaine de votre registre :

      • pkg.dev pour Artifact Registry
      • gcr.io pour les dépôts Container Registry ou les dépôts gcr.io hébergés dans Artifact Registry
  4. Ajoutez un enregistrement A pour l'adresse IP virtuelle restreinte.

    gcloud dns record-sets transaction add \
      --name=REGISTRY_DOMAIN. \
      --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
      --zone=ZONE_NAME \
      --ttl=300 \
      --project=PROJECT_ID
    

    Où :

    • ZONE_NAME est le nom de la zone que vous avez créée à la première étape.

    • PROJECT_ID est l'ID du projet qui héberge votre cluster privé GKE.

    • REGISTRY_DOMAIN est le domaine de votre registre :

      • pkg.dev pour Artifact Registry
      • gcr.io pour les dépôts Container Registry ou les dépôts gcr.io hébergés dans Artifact Registry
  5. Exécutez la transaction.

    gcloud dns record-sets transaction execute \
      --zone=ZONE_NAME \
      --project=PROJECT_ID
    

    Où :

    • ZONE_NAME est le nom de la zone que vous avez créée à la première étape.

    • PROJECT_ID est l'ID du projet qui héberge votre cluster privé GKE.

Après avoir configuré le routage DNS, assurez-vous que GKE, le registre et les autres services requis se trouvent dans votre périmètre de service VPC Service Controls. Pour configurer le périmètre de service, consultez la section suivante.

Configurer le périmètre de service

Après avoir configuré les enregistrements DNS, créez un périmètre de service ou mettez à jour un périmètre existant, puis ajoutez le service Container Registry ou Artifact Registry à la liste des services que vous souhaitez protéger à l'aide de ce périmètre.

Autres caractéristiques :

  • Ajoutez au périmètre de service d'autres services compatibles que vous utilisez avec le registre, tels que Cloud Build, Artifact Analysis et l'autorisation binaire.
  • Pour Container Registry, vous devez également ajouter Cloud Storage au périmètre de service.

Vérifier le fonctionnement du périmètre

Une fois le périmètre de service configuré, les nœuds des clusters privés GKE peuvent accéder aux images de conteneurs dans Artifact Registry et Container Registry, si ces images sont stockées dans des projets situés dans votre périmètre de service.

Les images de conteneurs contenues dans des projets situés en dehors du périmètre restent inaccessibles, à l'exception de certains dépôts publics en lecture seule spécifiques.

Par exemple, si le projet google-samples ne se trouve pas dans votre périmètre de service, l'exécution de la commande permettant de créer un déploiement à partir du conteneur hello-app échouera:

Domaine pkg.dev

kubectl create deployment hello-server --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

Domaine gcr.io

kubectl create deployment hello-server --image=gcr.io/google-samples/hello-app:1.0

Vérifiez l'état du pod avec la commande suivante :

kubectl get pods

La commande renvoie une table semblable à l'exemple suivant. L'état du pod ErrImagePull indique que l'extraction a échoué.

NAME                            READY   STATUS         RESTARTS   AGE
hello-server-dbd86c8c4-h5wsf    1/1     ErrImagePull   0          45s

Vous pouvez utiliser la commande kubectl describe pod pour afficher plus de détails sur le déploiement. Pour le pod de l'exemple précédent, la commande est la suivante :

kubectl describe pod hello-server-dbd86c8c4-h5wsf