En esta página, se muestra cómo crear y publicar tu imagen en un repositorio en Artifact Registry con crane y oras.
Puedes configurar el Sincronizador de configuración para que se sincronice desde imágenes de OCI con Artifact Registry. Para usar esta función, debes habilitar las API de RootSync y RepoSync.
Acerca de Artifact Registry
Artifact Registry es un servicio completamente administrado que admite imágenes de contenedores y artefactos que no son de contenedores. Te recomendamos que uses Artifact Registry para el almacenamiento y la administración de imágenes de contenedores en Google Cloud. Hay muchas herramientas disponibles para enviar artefactos a Artifact Registry. Por ejemplo, puedes enviar una imagen de Docker o usar la biblioteca go-containerregistry para trabajar con registros de contenedores. Elige la herramienta que te resulte más conveniente.
Antes de comenzar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
Install the Google Cloud CLI.
-
Si usas un proveedor de identidad externo (IdP), primero debes acceder a gcloud CLI con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init -
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the GKE, Config Sync, Artifact Registry APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloud services enable container.googleapis.com
anthosconfigmanagement.googleapis.com artifactregistry.googleapis.com -
Install the Google Cloud CLI.
-
Si usas un proveedor de identidad externo (IdP), primero debes acceder a gcloud CLI con tu identidad federada.
-
Para inicializar gcloud CLI, ejecuta el siguiente comando:
gcloud init -
Create or select a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_IDwith a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_IDwith your Google Cloud project name.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the GKE, Config Sync, Artifact Registry APIs:
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.gcloud services enable container.googleapis.com
anthosconfigmanagement.googleapis.com artifactregistry.googleapis.com - Crea un clúster que cumpla con los requisitos del Sincronizador de configuración y que tenga la versión más reciente del Sincronizador de configuración, o bien accede a uno.
- Instala la CLI de
nomoso actualízala a la versión más reciente. - (Opcional) Si deseas usar Cosign para verificar las firmas de imágenes de OCI, instala lo siguiente:
- Cosign para firmar imágenes de OCI
- OpenSSL para generar credenciales para el servidor de webhook
- Docker para compilar y enviar la imagen del servidor de webhook de admisión
Crea un repositorio de Artifact Registry:
gcloud artifacts repositories create AR_REPO_NAME \ --repository-format=docker \ --location=AR_REGION \ --description="Config Sync repo" \ --project=PROJECT_IDPROJECT_ID: El ID del proyecto de la organización.AR_REPO_NAME: Es el ID del repositorio.AR_REGION: es la ubicación regional o multirregional del repositorio.FLEET_HOST_PROJECT_ID: Si usas Workload Identity Federation for GKE, esto es lo mismo quePROJECT_ID. Si usas la flota Workload Identity Federation for GKE, este es el ID del proyecto de la flota en la que está registrado tu clúster.GSA_NAME: Es el nombre de la cuenta de servicio personalizada de Google que deseas usar para conectarte a Artifact Registry.KSA_NAME: Es la cuenta de servicio de Kubernetes para el conciliador.- Para los repositorios raíz, si el nombre
RootSyncesroot-sync, agregaroot-reconciler. De lo contrario, agregaroot-reconciler-ROOT_SYNC_NAME. - Para los repositorios de espacios de nombres, si el nombre de
RepoSyncesrepo-sync, agregans-reconciler-NAMESPACE. De lo contrario, agregans-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTH, dondeREPO_SYNC_NAME_LENGTHes la cantidad de caracteres enREPO_SYNC_NAME.
- Para los repositorios raíz, si el nombre
Crea un archivo de manifiesto
Namespace:cat <<EOF> test-namespace.yaml apiVersion: v1 kind: Namespace metadata: name: test EOFAccede a Artifact Registry:
gcloud auth configure-docker AR_REGION-docker.pkg.devCompila y envía la imagen a Artifact Registry:
craneLos comandos de esta sección usan
cranepara interactuar con imágenes y registros remotos.Empaqueta el archivo:
tar -cf test-namespace.tar test-namespace.yamlInstala la herramienta
crane.Envía la imagen a Artifact Registry:
crane append -f test-namespace.tar -t AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1
orasLos comandos de esta sección usan
oraspara interactuar con imágenes y registros remotos.Empaqueta el archivo:
tar -czf test-namespace.tar.gz test-namespace.yamlInstala la herramienta
oras.Envía la imagen a Artifact Registry:
oras push AR_REGION-docker.pkg.dev/PROJECT_ID/AR_REPO_NAME/test-namespace:v1 test-namespace.tar.gz
Crea un objeto
RootSynccon un nombre único: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 EOFReemplaza
ROOT_SYNC_NAMEpor el nombre del objetoRootSync. El nombre debe ser único en el clúster y no debe tener más de 26 caracteres. Para obtener la lista completa de opciones cuando configures objetosRootSync, consulta CamposRootSyncyRepoSync.Aplica el objeto
RootSync:kubectl apply -f ROOT_SYNC_NAME.yamlVerifica que el Sincronizador de configuración se sincronice desde la imagen:
nomos status --contexts=$(kubectl config current-context)Deberías ver un resultado similar al siguiente:
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 05e6a6bYa sincronizaste correctamente una imagen con tu clúster.
Si deseas usar la muestra proporcionada, completa los siguientes pasos:
Clona el repositorio de ejemplo:
git clone https://github.com/GoogleCloudPlatform/anthos-config-management-samples/Cambia al directorio que contiene las muestras del servidor de verificación de firmas:
cd anthos-config-management-samples/tree/main/pre-sync/oci-image-verification
Para crear una imagen de Docker para el servidor de verificación de firmas y enviarla a un registro de imágenes, ejecuta el siguiente comando:
docker build -t SIGNATURE_VERIFICATION_SERVER_IMAGE_URL:latest . && docker push SIGNATURE_VERIFICATION_SERVER_IMAGE_URL:latestReemplaza
SIGNATURE_VERIFICATION_SERVER_IMAGE_URLpor la URL de la imagen de tu servidor de verificación de firmas.Crea un espacio de nombres:
kubectl create ns signature-verificationPara autenticarte en Artifact Registry con una ServiceAccount de Kubernetes, completa los siguientes pasos:
Crea una ServiceAccount de Kubernetes en el espacio de nombres que creaste:
kubectl create sa signature-verification-sa -n signature-verificationAgrega la vinculación de la política de IAM para el rol de lector de Artifact Registry (
roles/artifactregistry.reader):gcloud artifacts repositories add-iam-policy-binding REPOSITORY_NAME \ --location=REPOSITORY_LOCATION \ --member="serviceAccount:PROJECT_ID.svc.id.goog[signature-verification/signature-verification-sa]" \ --role=roles/artifactregistry.reader \ --project=PROJECT_IDReemplaza lo siguiente:
REPOSITORY_NAME: Es el nombre de tu repositorio de Artifact Registry en el que almacenas tus imágenes de OCI.REPOSITORY_LOCATION: Es la ubicación de tu repositorio de Artifact Registry.
Para autenticarte en el cliente de Cosign, completa los siguientes pasos:
Genera un par de claves de Cosign. Este comando genera una clave pública y una privada:
cosign generate-key-pairAlmacena la clave pública en un Secret de Kubernetes en el espacio de nombres que creaste:
kubectl create secret generic cosign-key --from-file=cosign.pub -n signature-verification
Para autenticar el servidor de verificación de firmas, completa los siguientes pasos:
Para encriptar la comunicación dentro del servidor de verificación de firmas, genera un certificado TLS y una clave privada 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"Almacena las credenciales que generaste en un Secret de Kubernetes:
kubectl create secret tls webhook-tls --cert=tls.crt --key=tls.key -n signature-verificationObtén el contenido codificado en Base64 de
tls.cert. Esto es necesario para la configuración del webhook de validación que crearás en la siguiente sección:cat tls.crt | base64 -w 0.
Para crear una implementación para el servidor de verificación de firmas, guarda el siguiente archivo:
Reemplaza
SIGNATURE_VERIFICATION_SERVER_IMAGE_URLpor la URL completa de la imagen del servidor de verificación de firmas.Aplica la implementación al clúster:
kubectl apply -f signature-verification-deployment.yaml -n signature-verificationPara crear una configuración de webhook de validación, guarda el siguiente archivo:
Reemplaza
CA_BUNDLEpor el contenido codificado en base64 detls.cert.Aplica la configuración del webhook de validación al clúster:
kubectl apply -f signature-verification-validatingwebhookconfiguration.yamlVerifica los registros de
kubectl:kubectl logs deployment signature-verification-server -n signature-verificationLos errores de
kubectlrelacionados con la verificación de firmas se parecen a los siguientes:main.go:69: error during command execution: no signatures foundVerifica los registros del Sincronizador de configuración:
nomos statusLos errores del Sincronizador de configuración relacionados con la verificación de firmas se parecen a los siguientes:
Error: KNV2002: admission webhook "imageverification.webhook.com" denied the request: Image validation failed: cosign verification failed: exit status 10, output: Error: no signatures foundREPOSYNC_NAME: El nombre de tuRepoSync.REPOSYNC_NAMESPACE: Es el nombre del espacio de nombres asociado a tuRepoSync.- Obtén más información sobre cómo instalar el Sincronizador de configuración.
- Soluciona problemas del Sincronizador de configuración.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
Crea un repositorio de Artifact Registry
En esta sección, crearás un repositorio de Artifact Registry. Para obtener más información sobre cómo crear repositorios de Artifact Registry, consulta Crea repositorios.
Reemplaza lo siguiente:
Variables que se usan en las siguientes secciones:
Otorga permiso de lector
Para autenticarte en Artifact Registry con una cuenta de servicio de Kubernetes, completa los siguientes pasos:
Otorga el rol de IAM de lector de Artifact Registry (roles/artifactregistry.reader) a la cuenta de servicio de Kubernetes que tiene el grupo de Workload Identity Federation for GKE:
gcloud artifacts repositories add-iam-policy-binding AR_REPO_NAME \
--location=AR_REGION \
--member="serviceAccount:FLEET_HOST_PROJECT_ID.svc.id.goog[config-management-system/KSA_NAME]" \
--role=roles/artifactregistry.reader \
--project=PROJECT_ID
Envía una imagen al repositorio de Artifact Registry
En esta sección, crearás una imagen de OCI y la enviarás a Artifact Registry.
Configura el Sincronizador de configuración para que se sincronice desde tu imagen
En esta sección, crearás un objeto RootSync y configurarás el Sincronizador de configuración para sincronizar desde la imagen de OCI.
(Opcional) Verifica las firmas de la fuente de OCI
A partir de la versión 1.20.0 del Sincronizador de configuración, este admite la verificación de la autenticidad de las imágenes fuente de OCI antes de que se apliquen las configuraciones a tus clústeres. Este método usa un objeto ValidatingWebhookConfiguration y un servidor de webhook de validación para interceptar solicitudes de actualización de objetos RootSync y RepoSync. El Sincronizador de configuración actualiza la anotación configsync.gke.io/image-to-sync de los objetos RootSync y RepoSync después de recuperar correctamente un nuevo resumen de la imagen. El servidor de webhook de validación compara los valores entre la anotación anterior y la nueva, y ejecuta la validación con una herramienta de validación como Cosign cuando se detecta un cambio.
Configura un servidor de verificación de firmas
Para garantizar la autenticidad de tus fuentes de OCI, necesitas un servidor HTTP para verificar las firmas. Puedes usar las muestras del repositorio de muestras de Config Sync o tu propia imagen de Docker.
Autenticación en servicios
Para configurar tu servidor de verificación de firmas, debes autenticarte en Artifact Registry, el cliente de Cosign y el servidor de webhook.
Implementa el webhook de admisión
Puedes usar los siguientes ejemplos para crear una implementación para el servidor de verificación de firmas y una configuración de webhook de validación.
Revisa los registros en busca de errores de verificación de imágenes
Una vez que hayas configurado tu servidor de verificación de imágenes, cualquier intento de sincronización desde imágenes OCI sin firmar debería fallar.
Para comprobar si hay errores de verificación de firma, ejecuta los siguientes comandos para ver los registros del servidor de verificación de firma:
Si no recibes ningún error, puedes confirmar que la imagen firmada es el objeto que se sincroniza inspeccionando tu configuración de RootSync o RepoSync:
RootSync
kubectl get rootsync ROOTSYNC_NAME -n config-management-system -oyaml
Reemplaza ROOTSYNC_NAME por el nombre de tu RootSync.
RepoSync
kubectl get reposync REPOSYNC_NAME -n REPOSYNC_NAMESPACE -oyaml
Reemplaza lo siguiente:
Deberías ver la anotación configsync.gke.io/image-to-sync agregada a tu objeto RootSync o RepoSync. La anotación contiene la URL de la imagen de OCI de origen y el resumen más reciente recuperado por el Sincronizador de configuración.