En esta página se muestra cómo crear y publicar una imagen en un repositorio de Artifact Registry con crane
y oras
.
Puedes configurar Config Sync para que sincronice imágenes de OCI mediante Artifact Registry. Para usar esta función, debes habilitar las APIs RootSync y RepoSync.
Acerca de Artifact Registry
Artifact Registry es un servicio totalmente gestionado que admite tanto imágenes de contenedor como artefactos que no son de contenedor. Te recomendamos que uses Artifact Registry para almacenar y gestionar tus imágenes de contenedor en Google Cloud. Hay muchas herramientas disponibles para enviar artefactos a Artifact Registry. Por ejemplo, puedes insertar una imagen Docker o usar la biblioteca go-containerregistry para trabajar con registros de contenedores. Elige la herramienta que mejor se adapte a tus necesidades.
Antes de empezar
- 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 utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud 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.create
permission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with 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_ID
with 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.enable
permission. Learn how to grant roles.gcloud services enable container.googleapis.com
anthosconfigmanagement.googleapis.com artifactregistry.googleapis.com -
Install the Google Cloud CLI.
-
Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud 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.create
permission. Learn how to grant roles.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with 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_ID
with 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.enable
permission. Learn how to grant roles.gcloud services enable container.googleapis.com
anthosconfigmanagement.googleapis.com artifactregistry.googleapis.com - Crea un clúster o ten acceso a uno que cumpla los requisitos de Config Sync y que tenga la versión más reciente de Config Sync.
- Instala la CLI de
nomos
o actualízala a la versión más reciente. - (Opcional) Si quieres usar Cosign para verificar las firmas de imágenes de OCI, instala lo siguiente:
- Cosign para firmar imágenes OCI.
- OpenSSL para generar credenciales para el servidor 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_ID
PROJECT_ID
: el ID del proyecto de la organización.AR_REPO_NAME
: el ID del repositorio.AR_REGION
: la ubicación regional o multirregional del repositorio.FLEET_HOST_PROJECT_ID
: si usas GKE Workload Identity Federation for GKE, es lo mismo quePROJECT_ID
. Si usas la federación de identidades de carga de trabajo de flota para GKE, este es el ID del proyecto de la flota en la que está registrado tu clúster.GSA_NAME
: el nombre de la cuenta de servicio de Google personalizada que quieras usar para conectarte a Artifact Registry.KSA_NAME
: la cuenta de servicio de Kubernetes del reconciliador.- En el caso de los repositorios raíz, si el nombre de
RootSync
esroot-sync
, añaderoot-reconciler
. De lo contrario, añaderoot-reconciler-ROOT_SYNC_NAME
. - En el caso de los repositorios de espacios de nombres, si el nombre de
RepoSync
esrepo-sync
, añadens-reconciler-NAMESPACE
. De lo contrario, añadens-reconciler-NAMESPACE-REPO_SYNC_NAME-REPO_SYNC_NAME_LENGTH
, dondeREPO_SYNC_NAME_LENGTH
es el número de caracteres deREPO_SYNC_NAME
.
- En el caso de los repositorios raíz, si el nombre de
Crea un archivo de manifiesto
Namespace
:cat <<EOF> test-namespace.yaml apiVersion: v1 kind: Namespace metadata: name: test EOF
Inicia sesión en Artifact Registry:
gcloud auth configure-docker AR_REGION-docker.pkg.dev
Empaqueta la imagen y envíala a Artifact Registry:
crane
Los comandos de esta sección usan
crane
para interactuar con imágenes y registros remotos.Empaqueta el archivo:
tar -cf test-namespace.tar test-namespace.yaml
Instala 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
oras
Los comandos de esta sección usan
oras
para interactuar con imágenes y registros remotos.Empaqueta el archivo:
tar -czf test-namespace.tar.gz test-namespace.yaml
Instala 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
RootSync
con 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 EOF
Sustituye
ROOT_SYNC_NAME
por el nombre de tu objetoRootSync
. El nombre debe ser único en el clúster y no puede tener más de 26 caracteres. Para ver la lista completa de opciones al configurar objetosRootSync
, consulta los camposRootSync
yRepoSync
.Aplica el objeto
RootSync
:kubectl apply -f ROOT_SYNC_NAME.yaml
Verifica que Config Sync se esté sincronizando desde la imagen:
nomos status --contexts=$(kubectl config current-context)
Debería ver un resultado similar al siguiente ejemplo:
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 05e6a6b
Ahora has sincronizado correctamente una imagen con tu clúster.
Si quieres usar la muestra proporcionada, sigue estos pasos:
Clona el repositorio de muestra:
git clone https://github.com/GoogleCloudPlatform/anthos-config-management-samples/
Cambia al directorio que contiene los ejemplos 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:latest
Sustituye
SIGNATURE_VERIFICATION_SERVER_IMAGE_URL
por la URL de la imagen de tu servidor de verificación de firmas.Crea un espacio de nombres:
kubectl create ns signature-verification
Para autenticarte en Artifact Registry con una cuenta de servicio de Kubernetes, sigue estos pasos:
Crea una cuenta de servicio de Kubernetes en el espacio de nombres que has creado:
kubectl create sa signature-verification-sa -n signature-verification
Añade el enlace de la política de gestión de identidades y accesos para el rol 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_ID
Haz los cambios siguientes:
REPOSITORY_NAME
: el nombre del repositorio de Artifact Registry en el que almacenas tus imágenes OCI.REPOSITORY_LOCATION
: la ubicación de tu repositorio de Artifact Registry.
Para autenticarte en el cliente de Cosign, sigue estos pasos:
Genera un par de claves de Cosign. Este comando genera una clave pública y una privada:
cosign generate-key-pair
Almacena la clave pública en un secreto de Kubernetes en el espacio de nombres que has creado:
kubectl create secret generic cosign-key --from-file=cosign.pub -n signature-verification
Para autenticar el servidor de verificación de firmas, sigue estos pasos:
Para cifrar la comunicación en el 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 has generado en un secreto de Kubernetes:
kubectl create secret tls webhook-tls --cert=tls.crt --key=tls.key -n signature-verification
Obtén el contenido codificado en Base64 de
tls.cert
. Esto es necesario para la configuración del webhook de validación que creará en la siguiente sección:cat tls.crt | base64 -w 0.
Crea una implementación para el servidor de verificación de firmas guardando el siguiente archivo:
Sustituye
SIGNATURE_VERIFICATION_SERVER_IMAGE_URL
por la URL completa de la imagen del servidor de verificación de firmas.Aplica el despliegue al clúster:
kubectl apply -f signature-verification-deployment.yaml -n signature-verification
Crea una configuración de webhook de validación guardando el siguiente archivo:
Sustituye
CA_BUNDLE
por el contenido codificado en Base64 detls.cert
.Aplica la configuración de webhook de validación al clúster:
kubectl apply -f signature-verification-validatingwebhookconfiguration.yaml
Consulta los registros de
kubectl
:kubectl logs deployment signature-verification-server -n signature-verification
Los errores de
kubectl
relacionados con la verificación de firmas son similares a los siguientes:main.go:69: error during command execution: no signatures found
Consulta los registros de Config Sync:
nomos status
Los errores de Config Sync relacionados con la verificación de firmas son similares 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 found
REPOSYNC_NAME
: el nombre de tuRepoSync
.REPOSYNC_NAMESPACE
: el nombre del espacio de nombres asociado a tuRepoSync
.
Costes
En este documento, se utilizan los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costes basada en el uso previsto,
utiliza la calculadora de precios.
Crear 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 el artículo Crear repositorios.
Haz los cambios siguientes:
Variables usadas en las siguientes secciones:
Conceder permiso de lectura
Para autenticarte en Artifact Registry con una cuenta de servicio de Kubernetes, sigue estos pasos:
Concede el rol de lector de Artifact Registry (roles/artifactregistry.reader
) de gestión de identidades y accesos a la cuenta de servicio de Kubernetes que tenga el grupo de Workload Identity Federation para 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
Enviar una imagen al repositorio de Artifact Registry
En esta sección, crearás una imagen OCI y la enviarás a Artifact Registry.
Configurar Config Sync para sincronizar desde tu imagen
En esta sección, crearás un objeto RootSync
y configurarás Config Sync para que se sincronice desde la imagen de OCI.
(Opcional) Verificar las firmas de origen de OCI
A partir de la versión 1.20.0 de Config Sync, Config Sync admite la verificación de la autenticidad de las imágenes de origen de OCI antes de que se apliquen las configuraciones a tus clústeres. Este método usa un objeto ValidatingWebhookConfiguration
y un servidor webhook de validación para interceptar las solicitudes de actualización de los objetos RootSync
y RepoSync
. Config Sync actualiza la anotación configsync.gke.io/image-to-sync
de los objetos RootSync
y RepoSync
después de obtener correctamente un nuevo resumen de imagen. El servidor webhook de validación compara los valores de la anotación antigua y la nueva, y ejecuta la validación con una herramienta de validación como Cosign cuando se detecta un cambio.
Configurar un servidor de verificación de firmas
Para asegurar la autenticidad de tus fuentes de OCI, necesitas un servidor HTTP para verificar las firmas. Puedes usar los ejemplos del repositorio de ejemplos de Config Sync o tu propia imagen de Docker.
Autenticarse en servicios
Para configurar tu servidor de verificación de firmas, debes autenticarte en Artifact Registry, el cliente de Cosign y el servidor webhook.
Desplegar el webhook de admisión
Puedes usar los siguientes ejemplos para crear una implementación del servidor de verificación de firmas y una configuración de webhook de validación.
Consultar los registros para ver si hay errores de verificación de imágenes
Una vez que hayas configurado tu servidor de verificación de imágenes, no se podrá sincronizar ninguna imagen OCI sin firmar.
Para comprobar si hay errores de verificación de firmas, consulta los registros del servidor de verificación de firmas ejecutando los siguientes comandos:
Si no aparece ningún error, puedes confirmar que la imagen firmada es el objeto que se está sincronizando inspeccionando tu configuración de RootSync
o RepoSync
:
RootSync
kubectl get rootsync ROOTSYNC_NAME -n config-management-system -oyaml
Sustituye ROOTSYNC_NAME
por el nombre de tu RootSync
.
RepoSync
kubectl get reposync REPOSYNC_NAME -n REPOSYNC_NAMESPACE -oyaml
Haz los cambios siguientes:
Debería ver la anotación configsync.gke.io/image-to-sync
añadida a su objeto RootSync
o RepoSync
. La anotación contiene la URL de la imagen OCI de origen y el último digest obtenido por Config Sync.