Cette page vous explique comment créer et publier votre image dans un dépôt Artifact Registry avec crane et oras.
Vous pouvez configurer Config Sync pour la synchronisation à partir d'images OCI à l'aide d'Artifact Registry. Pour utiliser cette fonctionnalité, vous devez activer les API RootSync et RepoSync.
À propos d'Artifact Registry
Artifact Registry est un service entièrement géré compatible avec les images de conteneurs et les artefacts non issus de conteneurs. Nous vous recommandons d'utiliser Artifact Registry pour stocker et gérer vos images de conteneurs sur Google Cloud. De nombreux outils permettent de transférer des artefacts vers Artifact Registry. Par exemple, vous pouvez transférer une image Docker ou utiliser la bibliothèque go-containerregistry pour travailler avec des registres de conteneurs. Choisissez l'outil qui vous convient le mieux.
Avant de commencer
- Connectez-vous à votre compte Google Cloud . Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits sans frais pour exécuter, tester et déployer des charges de travail.
-
Installez la Google Cloud CLI.
-
Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.
-
Pour initialiser la gcloud CLI, exécutez la commande suivante :
gcloud init -
Créez ou sélectionnez un projet Google Cloud .
Rôles requis pour sélectionner ou créer un projet
- Sélectionnez un projet : la sélection d'un projet ne nécessite pas de rôle IAM spécifique. Vous pouvez sélectionner n'importe quel projet pour lequel un rôle vous a été attribué.
-
Créer un projet : pour créer un projet, vous devez disposer du rôle Créateur de projet (
roles/resourcemanager.projectCreator), qui contient l'autorisationresourcemanager.projects.create. Découvrez comment attribuer des rôles.
-
Créez un projet Google Cloud :
gcloud projects create PROJECT_ID
Remplacez
PROJECT_IDpar le nom du projet Google Cloud que vous créez. -
Sélectionnez le projet Google Cloud que vous avez créé :
gcloud config set project PROJECT_ID
Remplacez
PROJECT_IDpar le nom de votre projet Google Cloud .
-
Vérifiez que la facturation est activée pour votre projet Google Cloud .
Activez les API GKE, Config Sync et Artifact Registry si elles ne le sont pas déjà :
Rôles requis pour activer les API
Pour activer les API, vous devez disposer de l'autorisation
serviceusage.services.enable. Si vous avez créé le projet, vous disposez probablement déjà de cette autorisation grâce au rôle Propriétaire (roles/owner). Sinon, vous pouvez obtenir cette autorisation grâce au rôle Administrateur Service Usage (roles/serviceusage.serviceUsageAdmin). Découvrez comment attribuer des rôles.gcloud services enable container.googleapis.com
anthosconfigmanagement.googleapis.com artifactregistry.googleapis.com -
Installez la Google Cloud CLI.
-
Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.
-
Pour initialiser la gcloud CLI, exécutez la commande suivante :
gcloud init -
Créez ou sélectionnez un projet Google Cloud .
Rôles requis pour sélectionner ou créer un projet
- Sélectionnez un projet : la sélection d'un projet ne nécessite pas de rôle IAM spécifique. Vous pouvez sélectionner n'importe quel projet pour lequel un rôle vous a été attribué.
-
Créer un projet : pour créer un projet, vous devez disposer du rôle Créateur de projet (
roles/resourcemanager.projectCreator), qui contient l'autorisationresourcemanager.projects.create. Découvrez comment attribuer des rôles.
-
Créez un projet Google Cloud :
gcloud projects create PROJECT_ID
Remplacez
PROJECT_IDpar le nom du projet Google Cloud que vous créez. -
Sélectionnez le projet Google Cloud que vous avez créé :
gcloud config set project PROJECT_ID
Remplacez
PROJECT_IDpar le nom de votre projet Google Cloud .
-
Vérifiez que la facturation est activée pour votre projet Google Cloud .
Activez les API GKE, Config Sync et Artifact Registry si elles ne le sont pas déjà :
Rôles requis pour activer les API
Pour activer les API, vous devez disposer de l'autorisation
serviceusage.services.enable. Si vous avez créé le projet, vous disposez probablement déjà de cette autorisation grâce au rôle Propriétaire (roles/owner). Sinon, vous pouvez obtenir cette autorisation grâce au rôle Administrateur Service Usage (roles/serviceusage.serviceUsageAdmin). Découvrez comment attribuer des rôles.gcloud services enable container.googleapis.com
anthosconfigmanagement.googleapis.com artifactregistry.googleapis.com - Créez un cluster répondant aux exigences de Config Sync et utilisant la dernière version de Config Sync, ou assurez-vous d'y avoir accès.
- Installez la CLI
nomosou mettez-la à niveau vers la dernière version. - (Facultatif) Si vous souhaitez utiliser Cosign pour valider les signatures des images OCI, installez les éléments suivants :
Coûts
Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :
Pour obtenir une estimation des coûts en fonction de votre utilisation prévue,
utilisez le simulateur de coût.
Créer un dépôt Artifact Registry
Dans cette section, vous allez créer un dépôt Artifact Registry. Pour en savoir plus sur la création de dépôts Artifact Registry, consultez la section Créer des dépôts.
Créer un dépôt Artifact Registry :
gcloud artifacts repositories create AR_REPO_NAME \
--repository-format=docker \
--location=AR_REGION \
--description="Config Sync repo" \
--project=PROJECT_ID
Remplacez les éléments suivants :
PROJECT_ID: ID de projet de l'organisation.AR_REPO_NAME: ID du dépôt.AR_REGION: emplacement régional ou multirégional du dépôt.
Variables utilisées dans les sections suivantes :
FLEET_HOST_PROJECT_NUMBER: si vous utilisez Workload Identity Federation for GKE, cette valeur est identique au numéro de projet pourPROJECT_ID. Si vous utilisez la Workload Identity Federation pour parc dans GKE, il s'agit du numéro du projet dans lequel votre cluster est enregistré.FLEET_HOST_PROJECT_ID: si vous utilisez la fédération d'identité de charge de travail GKE pour GKE, cette valeur est identique àPROJECT_ID. Si vous utilisez la Workload Identity Federation for GKE pour votre parc, il s'agit de l'ID du projet dans lequel votre cluster est enregistré.KUBERNETES_SERVICEACCOUNT: compte de service Kubernetes pour le rapprochement :- Pour les dépôts racine, si le nom
RootSyncestroot-sync, ajoutezroot-reconciler. Sinon, ajoutezroot-reconciler-ROOT_SYNC_NAME. - Pour les dépôts d'espaces de noms, si le nom
RepoSyncestrepo-sync, ajoutezns-reconciler-NAMESPACE. Sinon, ajoutezns-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTH, oùREPO_SYNC_NAME_LENGTHcorrespond au nombre de caractères dansREPO_SYNC_NAME.
- Pour les dépôts racine, si le nom
Accorder l'autorisation de lecture
Attribuez le rôle Lecteur Artifact Registry (roles/artifactregistry.reader) au compte de service Kubernetes sur le dépôt :
gcloud artifacts repositories add-iam-policy-binding AR_REPO_NAME \
--location=AR_REGION \
--member="principal://iam.googleapis.com/projects/FLEET_HOST_PROJECT_NUMBER/locations/global/workloadIdentityPools/FLEET_HOST_PROJECT_ID.svc.id.goog/subject/ns/config-management-system/sa/KUBERNETES_SERVICEACCOUNT" \
--role=roles/artifactregistry.reader \
--project=PROJECT_ID \
--condition=None
Transférer une image vers le dépôt Artifact Registry
Dans cette section, vous allez créer une image OCI et la transférer dans Artifact Registry.
Créez un fichier manifeste
Namespace:cat <<EOF> test-namespace.yaml apiVersion: v1 kind: Namespace metadata: name: test EOFConnectez-vous à Artifact Registry :
gcloud auth configure-docker AR_REGION-docker.pkg.devEmpaquetez et transférez l'image vers Artifact Registry :
craneLes commandes de cette section utilisent
cranepour interagir avec les images et registres distants.Empaquetez le fichier :
tar -cf test-namespace.tar test-namespace.yamlInstallez l'outil
crane.Transférez l'image vers Artifact Registry :
crane append -f test-namespace.tar -t AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1
orasLes commandes de cette section utilisent
oraspour interagir avec les images et registres distants.Empaquetez le fichier :
tar -czf test-namespace.tar.gz test-namespace.yamlInstallez l'outil
oras.Transférez l'image vers Artifact Registry :
oras push AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1 test-namespace.tar.gz
Configurer Config Sync pour la synchronisation à partir de votre image
Dans cette section, vous allez créer un objet RootSync et configurer Config Sync pour la synchronisation à partir de l'image OCI.
Créez un objet
RootSyncavec un nom unique :cat <<EOF>> ROOT_SYNC_NAME.yaml apiVersion: configsync.gke.io/v1beta1 kind: RootSync metadata: name: ROOT_SYNC_NAME namespace: config-management-system spec: sourceFormat: unstructured sourceType: oci oci: image: AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1 dir: . auth: k8sserviceaccount EOFRemplacez
ROOT_SYNC_NAMEpar le nom de votre objetRootSync. Le nom doit être unique dans le cluster et ne pas dépasser 26 caractères. Pour obtenir la liste complète des options de configuration des objetsRootSync, consultez les champsRootSyncetRepoSync.Appliquez l'objet
RootSync:kubectl apply -f ROOT_SYNC_NAME.yamlVérifiez que Config Sync est synchronisé à partir de l'image :
nomos status --contexts=$(kubectl config current-context)Un résultat semblable aux lignes suivantes doit s'afficher :
Connecting to clusters... *publish-config-registry -------------------- <root>:root-sync-test AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1 SYNCED 05e6a6b77de7a62286387cfea833d45290105fe84383224938d7b3ab151a55a1 Managed resources: NAMESPACE NAME STATUS SOURCEHASH namespace/test Current 05e6a6bVous venez de synchroniser une image avec votre cluster.
(Facultatif) Vérifier les signatures de la source OCI
Vous pouvez vérifier l'authenticité des images sources OCI avant que les configurations ne soient appliquées à vos clusters. Cette méthode utilise un objet ValidatingWebhookConfiguration et un serveur de webhook de validation pour intercepter les demandes de mise à jour des objets RootSync et RepoSync. Config Sync met à jour l'annotation configsync.gke.io/image-to-sync des objets RootSync et RepoSync après avoir récupéré un nouveau résumé d'image. Le serveur de webhook de validation compare les valeurs entre l'ancienne et la nouvelle annotation, et exécute la validation avec un outil de validation tel que Cosign lorsqu'une modification est détectée.
Configurer un serveur de validation de signature
Pour garantir l'authenticité de vos sources OCI, vous avez besoin d'un serveur HTTP pour vérifier les signatures. Vous pouvez utiliser les exemples du dépôt d'exemples Config Sync ou votre propre image Docker.
Si vous souhaitez utiliser l'exemple fourni, procédez comme suit :
Clonez l'exemple de dépôt :
git clone https://github.com/GoogleCloudPlatform/anthos-config-management-samples/Accédez au répertoire qui contient les exemples de serveur de validation de signature :
cd anthos-config-management-samples/tree/main/pre-sync/oci-image-verification
Pour créer une image Docker pour le serveur de validation de signature et l'importer dans un registre d'images, exécutez la commande suivante :
docker build -t SIGNATURE_VERIFICATION_SERVER_IMAGE_URL:latest . && docker push SIGNATURE_VERIFICATION_SERVER_IMAGE_URL:latestRemplacez
SIGNATURE_VERIFICATION_SERVER_IMAGE_URLpar l'URL de l'image de votre serveur de validation de signature.
S'authentifier auprès des services
Pour configurer votre serveur de validation de signature, vous devez vous authentifier auprès d'Artifact Registry, du client Cosign et du serveur de webhook.
Créez un espace de noms :
kubectl create ns signature-verificationPour vous authentifier auprès d'Artifact Registry avec un compte de service Kubernetes, procédez comme suit :
Créez un ServiceAccount Kubernetes dans l'espace de noms que vous avez créé :
kubectl create sa signature-verification-sa -n signature-verificationAttribuez le rôle Lecteur Artifact Registry (
roles/artifactregistry.reader) au compte de service Kubernetes sur le dépôt :gcloud artifacts repositories add-iam-policy-binding REPOSITORY_NAME \ --location=REPOSITORY_LOCATION \ --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/signature-verification/sa/signature-verification-sa" \ --role=roles/artifactregistry.reader \ --project=PROJECT_ID \ --condition=NoneRemplacez les éléments suivants :
REPOSITORY_NAME: nom de votre dépôt Artifact Registry dans lequel vous stockez vos images OCI.REPOSITORY_LOCATION: emplacement de votre dépôt Artifact Registry.PROJECT_NUMBER: votre numéro de projet.PROJECT_ID: ID de votre projet.
Pour vous authentifier auprès du client Cosign, procédez comme suit :
Générez une paire de clés Cosign. Cette commande génère une clé publique et une clé privée :
cosign generate-key-pairStockez la clé publique dans un secret Kubernetes dans l'espace de noms que vous avez créé :
kubectl create secret generic cosign-key --from-file=cosign.pub -n signature-verification
Pour authentifier le serveur de validation de la signature, procédez comme suit :
Pour chiffrer la communication au sein du serveur de validation de signature, générez un certificat TLS et une clé privée avec OpenSSL :
openssl req -nodes -x509 -sha256 -newkey rsa:4096 \ -keyout tls.key \ -out tls.crt \ -days 356 \ -subj "/CN=signature-verification-service.signature-verification.svc" \ -addext "subjectAltName = DNS:signature-verification-service,DNS:signature-verification-service.signature-verification.svc,DNS:signature-verification-service.signature-verification"Stockez les identifiants que vous avez générés dans un secret Kubernetes :
kubectl create secret tls webhook-tls --cert=tls.crt --key=tls.key -n signature-verificationObtenez le contenu encodé en base64 de
tls.cert. Cette étape est requise pour la configuration du webhook de validation que vous allez créer dans la section suivante :cat tls.crt | base64 -w 0.
Déployer le webhook d'admission
Vous pouvez utiliser les exemples suivants pour créer un déploiement pour le serveur de validation de signature et une configuration de webhook de validation.
Créez un déploiement pour le serveur de validation de signature en enregistrant le fichier suivant :
Remplacez
SIGNATURE_VERIFICATION_SERVER_IMAGE_URLpar l'URL complète de l'image du serveur de validation de la signature.Appliquez le déploiement au cluster :
kubectl apply -f signature-verification-deployment.yaml -n signature-verificationCréez une configuration de webhook de validation en enregistrant le fichier suivant :
Remplacez
CA_BUNDLEpar le contenu encodé en base64 detls.cert.Appliquez la configuration du webhook de validation au cluster :
kubectl apply -f signature-verification-validatingwebhookconfiguration.yaml
Rechercher les erreurs de validation d'image dans les journaux
Une fois que vous avez configuré votre serveur de validation d'images, toute tentative de synchronisation à partir d'images OCI non signées devrait échouer.
Pour rechercher les erreurs de validation de la signature, consultez les journaux du serveur de validation de la signature en exécutant les commandes suivantes :
Consultez les journaux
kubectl:kubectl logs deployment signature-verification-server -n signature-verificationLes erreurs de
kubectlliées à la validation de la signature ressemblent à ce qui suit :main.go:69: error during command execution: no signatures foundVérifiez les journaux Config Sync :
nomos statusLes erreurs de Config Sync liées à la validation de la signature ressemblent à ce qui suit :
Error: KNV2002: admission webhook "imageverification.webhook.com" denied the request: Image validation failed: cosign verification failed: exit status 10, output: Error: no signatures found
Si aucune erreur ne s'affiche, vous pouvez confirmer que l'image signée est l'objet en cours de synchronisation en inspectant votre configuration RootSync ou RepoSync :
RootSync
kubectl get rootsync ROOTSYNC_NAME -n config-management-system -oyaml
Remplacez ROOTSYNC_NAME par le nom de votre RootSync.
RepoSync
kubectl get reposync REPOSYNC_NAME -n REPOSYNC_NAMESPACE -oyaml
Remplacez les éléments suivants :
REPOSYNC_NAME: nom de votreRepoSync.REPOSYNC_NAMESPACE: nom de l'espace de noms associé à votreRepoSync.
L'annotation configsync.gke.io/image-to-sync doit s'afficher dans votre objet RootSync ou RepoSync. L'annotation contient l'URL de l'image OCI source et le dernier condensé récupéré par Config Sync.
Étapes suivantes
- Découvrez comment installer Config Sync.
- Résoudre les problèmes liés à Config Sync