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
ougcr.io
versrestricted.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.
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 Registrygcr.io
pour Container Registry ou les dépôts gcr.io hébergés dans Artifact Registry
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.
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 Registrygcr.io
pour Container Registry ou les dépôts gcr.io hébergés dans Artifact Registry
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 Registrygcr.io
pour Container Registry ou Dépôts gcr.io hébergés dans Artifact Registry
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