Configurer l'accès restreint pour les clusters privés GKE

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

Ces domaines de registre se résout généralement en 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 vers les registres échoueront si vous n'ont 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 IPV restreinte pour empêcher l'exfiltration de données d'un service compatible vers un service non compatible.

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

  • Vous utilisez des clusters GKE privés.
  • 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 afin que les requêtes envoyées aux adresses de registre pointent vers 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 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 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 Container Registry ou 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.

Une fois le routage DNS configuré, assurez-vous que votre GKE, le registre et les autres services requis se trouvent dans le périmètre de service VPC Service Controls. Pour configurer votre 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 :

  • Ajouter d'autres services compatibles que vous utilisez avec le registre au périmètre de service, comme 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

Après avoir configuré le périmètre de service, vos nœuds dans les clusters privés GKE peuvent accéder aux images de conteneur dans Artifact Registry et Container Registry si les images sont stockées dans des projets appartenant à votre périmètre de service.

Les images de conteneurs dans les projets 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, Exécuter la commande pour 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. É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