Questa pagina mostra come creare e pubblicare l'immagine in un repository in Artifact Registry con crane e oras.
Puoi configurare Config Sync per la sincronizzazione dalle immagini OCI utilizzando Artifact Registry. Per utilizzare questa funzionalità, devi abilitare le API RootSync e RepoSync.
Informazioni su Artifact Registry
Artifact Registry è un servizio completamente gestito che supporta sia le immagini container sia gli artefatti non container. Ti consigliamo Artifact Registry per l'archiviazione e la gestione delle immagini container su Cloud de Confiance by S3NS. Esistono molti strumenti disponibili per eseguire il push degli artefatti in Artifact Registry. Ad esempio, puoi eseguire il push di un'immagine Docker o utilizzare la libreria go-containerregistry per lavorare con i container registry. Scegli lo strumento più adatto alle tue esigenze.
Prima di iniziare
-
Installa Google Cloud CLI.
-
Configura gcloud CLI per utilizzare la tua identità federata.
Per ulteriori informazioni, vedi Accedi a gcloud CLI con la tua identità federata.
-
Per inizializzare gcloud CLI, esegui questo comando:
gcloud init -
Crea o seleziona un Cloud de Confiance progetto.
Ruoli richiesti per selezionare o creare un progetto
- Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico. Puoi selezionare qualsiasi progetto per il quale ti è stato concesso un ruolo.
-
Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto
(
roles/resourcemanager.projectCreator), che contiene l'autorizzazioneresourcemanager.projects.create. Scopri come concedere i ruoli.
-
Creare un progetto Cloud de Confiance :
gcloud projects create PROJECT_ID
Sostituisci
PROJECT_IDcon un nome per il progetto Cloud de Confiance che stai creando. -
Seleziona il progetto Cloud de Confiance che hai creato:
gcloud config set project PROJECT_ID
Sostituisci
PROJECT_IDcon il nome del progetto Cloud de Confiance .
-
Verifica che la fatturazione sia attivata per il tuo progetto Cloud de Confiance .
Abilita le API GKE, Config Sync e Artifact Registry:
Ruoli richiesti per abilitare le API
Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo dei servizi (
roles/serviceusage.serviceUsageAdmin), che include l'autorizzazioneserviceusage.services.enable. Scopri come concedere i ruoli.gcloud services enable container.googleapis.com
anthosconfigmanagement.googleapis.com artifactregistry.googleapis.com - Crea o accedi a un cluster che soddisfi i requisiti per Config Sync e che utilizzi l'ultima versione di Config Sync.
- Installa la CLI
nomoso esegui l'upgrade all'ultima versione. - (Facoltativo) Se vuoi utilizzare Cosign per verificare le firme delle immagini OCI, installa quanto segue:
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Cloud de Confiance by S3NS:
Crea un repository Artifact Registry
In questa sezione, crei un repository Artifact Registry. Per scoprire di più sulla creazione di repository Artifact Registry, consulta Crea repository.
Crea un repository Artifact Registry:
gcloud artifacts repositories create AR_REPO_NAME \ --repository-format=docker \ --location=AR_REGION \ --description="Config Sync repo" \ --project=PROJECT_ID
Sostituisci quanto segue:
PROJECT_ID: l'ID progetto dell'organizzazione.AR_REPO_NAME: l'ID del repository.AR_REGION: la posizione regionale o multiregionale del repository.
Variabili utilizzate nelle seguenti sezioni:
FLEET_HOST_PROJECT_ID: se utilizzi GKE Workload Identity Federation for GKE, questo valore è uguale aPROJECT_ID. Se utilizzi Workload Identity Federation for GKE del parco risorse, questo è l'ID progetto del parco risorse a cui è registrato il tuo cluster.GSA_NAME: il nome del account di servizio Google personalizzato che vuoi utilizzare per connetterti ad Artifact Registry.KSA_NAME: il account di servizio Kubernetes per il reconciler.- Per i repository radice, se il nome
RootSyncèroot-sync, aggiungiroot-reconciler. In caso contrario, aggiungiroot-reconciler-ROOT_SYNC_NAME. - Per i repository dello spazio dei nomi, se il nome
RepoSyncèrepo-sync, aggiungins-reconciler-NAMESPACE. In caso contrario, aggiungins-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTHdoveREPO_SYNC_NAME_LENGTHè il numero di caratteri inREPO_SYNC_NAME.
- Per i repository radice, se il nome
Concedere l'autorizzazione di lettura
Utilizza un account di servizio Kubernetes per l'autenticazione in Artifact Registry completando i seguenti passaggi:
Concedi il ruolo IAM Lettore Artifact Registry (roles/artifactregistry.reader)
al account di servizio Kubernetes che ha il pool
Workload Identity Federation per GKE:
gcloud artifacts repositories add-iam-policy-binding AR_REPO_NAME \
--location=AR_REGION \
--member="serviceAccount:FLEET_HOST_PROJECT_ID.s3ns.svc.id.goog[config-management-system/KSA_NAME]" \
--role=roles/artifactregistry.reader \
--project=PROJECT_ID
Esegui il push di un'immagine nel repository Artifact Registry
In questa sezione, crei un'immagine OCI ed esegui il push in Artifact Registry.
Crea un file manifest
Namespace:cat <<EOF> test-namespace.yaml apiVersion: v1 kind: Namespace metadata: name: test EOFAccedi ad Artifact Registry:
gcloud auth configure-docker AR_REGION-docker.pkg.devCrea un pacchetto dell'immagine ed eseguine il push in Artifact Registry:
craneI comandi in questa sezione utilizzano
craneper interagire con immagini e registri remoti.Comprimi il file:
tar -cf test-namespace.tar test-namespace.yamlInstalla lo strumento
crane.Esegui il push dell'immagine in Artifact Registry:
crane append -f test-namespace.tar -t AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1
orasI comandi in questa sezione utilizzano
orasper interagire con immagini e registri remoti.Comprimi il file:
tar -czf test-namespace.tar.gz test-namespace.yamlInstalla lo strumento
oras.Esegui il push dell'immagine in Artifact Registry:
oras push AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1 test-namespace.tar.gz
Configura Config Sync per la sincronizzazione dall'immagine
In questa sezione creerai un oggetto RootSync e configurerai Config Sync
per la sincronizzazione dall'immagine OCI.
Crea un oggetto
RootSynccon un nome univoco: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 EOFSostituisci
ROOT_SYNC_NAMEcon il nome dell'oggettoRootSync. Il nome deve essere univoco nel cluster e non deve contenere più di 26 caratteri. Per l'elenco completo delle opzioni durante la configurazione degli oggettiRootSync, vedi CampiRootSynceRepoSync.Applica l'oggetto
RootSync:kubectl apply -f ROOT_SYNC_NAME.yamlVerifica che Config Sync stia sincronizzando dall'immagine:
nomos status --contexts=$(kubectl config current-context)Dovresti vedere un output simile al seguente esempio:
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 05e6a6bOra hai sincronizzato correttamente un'immagine con il tuo cluster.
(Facoltativo) Verifica le firme dell'origine OCI
Puoi verificare l'autenticità delle immagini di origine OCI prima che le configurazioni vengano applicate
ai tuoi cluster. Questo metodo utilizza un oggetto ValidatingWebhookConfiguration e un server webhook di convalida per intercettare le richieste di aggiornamento per gli oggetti RootSync e RepoSync. Config Sync aggiorna l'annotazione configsync.gke.io/image-to-sync degli oggetti RootSync e RepoSync dopo aver recuperato correttamente un nuovo digest dell'immagine. Il server webhook di convalida confronta i valori tra la vecchia annotazione e la nuova ed esegue la convalida con uno strumento di convalida come Cosign quando viene rilevata una modifica.
Configurare un server di verifica della firma
Per garantire l'autenticità delle origini OCI, è necessario un server HTTP per verificare le firme. Puoi utilizzare gli esempi nel repository di esempi di Config Sync o utilizzare la tua immagine Docker.
Se vuoi utilizzare il campione fornito, completa i seguenti passaggi:
Clona il repository di esempio:
git clone https://github.com/GoogleCloudPlatform/anthos-config-management-samples/Passa alla directory che contiene gli esempi del server di verifica della firma:
cd anthos-config-management-samples/tree/main/pre-sync/oci-image-verification
Per creare un'immagine Docker per il server di verifica della firma ed eseguirne il push in un registro delle immagini, esegui questo comando:
docker build -t SIGNATURE_VERIFICATION_SERVER_IMAGE_URL:latest . && docker push SIGNATURE_VERIFICATION_SERVER_IMAGE_URL:latestSostituisci
SIGNATURE_VERIFICATION_SERVER_IMAGE_URLcon l'URL dell'immagine del server di verifica della firma.
Autenticarsi ai servizi
Per configurare il server di verifica della firma, devi autenticarti in Artifact Registry, nel client Cosign e nel server webhook.
Crea uno spazio dei nomi:
kubectl create ns signature-verificationPer eseguire l'autenticazione ad Artifact Registry con un ServiceAccount Kubernetes, completa i seguenti passaggi:
Crea un ServiceAccount Kubernetes nello spazio dei nomi che hai creato:
kubectl create sa signature-verification-sa -n signature-verificationAggiungi l'associazione di policy IAM per il ruolo Artifact Registry Reader (
roles/artifactregistry.reader):gcloud artifacts repositories add-iam-policy-binding REPOSITORY_NAME \ --location=REPOSITORY_LOCATION \ --member="serviceAccount:PROJECT_ID.s3ns.svc.id.goog[signature-verification/signature-verification-sa]" \ --role=roles/artifactregistry.reader \ --project=PROJECT_IDSostituisci quanto segue:
REPOSITORY_NAME: il nome del repository Artifact Registry in cui memorizzi le immagini OCI.REPOSITORY_LOCATION: la posizione del repository Artifact Registry.
Per eseguire l'autenticazione al client Cosign, completa i seguenti passaggi:
Genera una coppia di chiavi Cosign. Questo comando genera una chiave pubblica e una chiave privata:
cosign generate-key-pairArchivia la chiave pubblica in un secret Kubernetes nello spazio dei nomi che hai creato:
kubectl create secret generic cosign-key --from-file=cosign.pub -n signature-verification
Per autenticare il server di verifica della firma, completa i seguenti passaggi:
Per criptare la comunicazione all'interno del server di verifica della firma, genera un certificato TLS e una chiave privata con 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"Archivia le credenziali che hai generato in un secret Kubernetes:
kubectl create secret tls webhook-tls --cert=tls.crt --key=tls.key -n signature-verificationRecupera i contenuti codificati in base64 di
tls.cert. Questo è necessario per la configurazione del webhook di convalida che crei nella sezione successiva:cat tls.crt | base64 -w 0.
Esegui il deployment del webhook di ammissione
Puoi utilizzare i seguenti esempi per creare un deployment per il server di verifica della firma e una configurazione webhook di convalida.
Crea un deployment per il server di verifica della firma salvando il seguente file:
Sostituisci
SIGNATURE_VERIFICATION_SERVER_IMAGE_URLcon l'URL completo dell'immagine del server di verifica della firma.Applica il deployment al cluster:
kubectl apply -f signature-verification-deployment.yaml -n signature-verificationCrea una configurazione webhook di convalida salvando il seguente file:
Sostituisci
CA_BUNDLEcon i contenuti codificati in base64 ditls.cert.Applica la configurazione del webhook di convalida al cluster:
kubectl apply -f signature-verification-validatingwebhookconfiguration.yaml
Controllare i log per individuare errori di verifica delle immagini
Una volta configurato il server di verifica delle immagini, tutti i tentativi di sincronizzazione da immagini OCI non firmate non dovrebbero andare a buon fine.
Per verificare la presenza di errori di verifica della firma, visualizza i log del server di verifica della firma eseguendo i seguenti comandi:
Controlla i log di
kubectl:kubectl logs deployment signature-verification-server -n signature-verificationGli errori di
kubectlrelativi alla verifica della firma sono simili ai seguenti:main.go:69: error during command execution: no signatures foundControlla i log di Config Sync:
nomos statusGli errori di Config Sync relativi alla verifica della firma sono simili ai seguenti:
Error: KNV2002: admission webhook "imageverification.webhook.com" denied the request: Image validation failed: cosign verification failed: exit status 10, output: Error: no signatures found
Se non ricevi errori, puoi verificare che l'immagine firmata sia l'oggetto
sincronizzato esaminando la configurazione di RootSync o RepoSync:
RootSync
kubectl get rootsync ROOTSYNC_NAME -n config-management-system -oyaml
Sostituisci ROOTSYNC_NAME con il nome del tuo RootSync.
RepoSync
kubectl get reposync REPOSYNC_NAME -n REPOSYNC_NAMESPACE -oyaml
Sostituisci quanto segue:
REPOSYNC_NAME: il nome del tuoRepoSync.REPOSYNC_NAMESPACE: il nome dello spazio dei nomi associato al tuoRepoSync.
Dovresti vedere l'annotazione configsync.gke.io/image-to-sync aggiunta all'oggetto
RootSync o RepoSync. L'annotazione contiene l'URL dell'immagine OCI di origine e l'ultimo digest recuperato da Config Sync.
Passaggi successivi
- Scopri di più sull'installazione di Config Sync.
- Risolvi i problemi di Config Sync.