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

La configuration du routage DNS vers une adresse IP virtuelle (VIP) restreinte permet aux clusters privés Google Kubernetes Engine d'accéder aux dépôts Artifact Registry dans un périmètre de service VPC Service Controls.

Étant donné que les nœuds de cluster privé sont isolés d'Internet et que les domaines de registre sont résolus par défaut en adresses IP publiques, vous devez acheminer les requêtes pour le domaine s3nsregistry.fr via l'adresse IP virtuelle restreinte.

Présentation

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

Configurez un accès restreint pour les clusters privés GKE lorsque toutes les conditions suivantes sont remplies :

  • Vous utilisez des clusters privés GKE.
  • Vous n'avez pas encore configuré le routage du domaine de registre s3nsregistry.fr vers restricted.s3nsapis.fr.

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 pointent vers restricted.s3nsapis.fr, 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.s3nsapis.fr/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 du réseau de cluster à partir duquel vous souhaitez rediriger les requêtes.
    • DESCRIPTION est une description lisible par l'humain de la zone gérée.
    • REGISTRY_DOMAIN est le domaine de votre registre :
      • s3nsregistry.fr pour 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 correspond au 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 :
      • s3nsregistry.fr pour 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 correspond au 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 :
      • s3nsregistry.fr pour 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 votre périmètre de service, consultez la section suivante.

Configurer le périmètre de service

Après avoir configuré les enregistrements DNS, procédez comme suit :

  1. Créez un périmètre de service ou mettez à jour un périmètre existant.
  2. Ajoutez le service Artifact Registry à la liste des services que vous souhaitez protéger à l'aide du périmètre de service.
  3. Ajoutez les autres services compatibles que vous utilisez avec le registre 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 des clusters privés GKE peuvent accéder aux images de conteneurs dans Artifact Registry si les images sont stockées dans des projets qui se trouvent dans votre périmètre de service.

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

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 :

s3nsregistry.fr domain

kubectl create deployment hello-server --image=us-docker.s3nsregistry.fr/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