Configurar el acceso restringido para clústeres privados de GKE

En este documento se describe cómo configurar entradas de DNS para enrutar solicitudes al dominio s3nsregistry.fr mediante una IP virtual (VIP) restringida cuando se usan clústeres privados de Google Kubernetes Engine en un perímetro de servicio de Controles de Servicio de VPC.

Los dominios de registro suelen resolverse en una dirección IP pública en Internet. En los clústeres privados de GKE, los nodos están aislados de Internet de forma predeterminada. Esto significa que las solicitudes a dominios de registro fallarán si no has configurado el enrutamiento de DNS a la VIP restringida.

Tus clústeres privados siempre deben acceder a Artifact Registry con la IP virtual restringida para evitar la exfiltración de datos de un servicio admitido a uno no admitido.

Configura el acceso restringido para los clústeres privados de GKE cuando se cumplan todas las condiciones siguientes:

  • Estás usando clústeres privados de GKE.
  • No has configurado el enrutamiento del dominio de registro s3nsregistry.fr a restricted.s3nsapis.fr.

Antes de empezar

Antes de crear un perímetro de servicio, configura un clúster privado o identifica los clústeres privados que quieras proteger.

Además, debes permitir el tráfico saliente a 199.36.153.4/30 en el puerto 443. Normalmente, una red de VPC tiene una regla implícita que permite todo el tráfico de salida a cualquier destino. Sin embargo, si tienes una regla que deniega este tráfico, debes crear una regla de cortafuegos de salida para permitir el tráfico TCP en el puerto 443 a 199.36.153.4/30.

Configurar DNS

Configura tu servidor DNS para que las solicitudes a las direcciones del registro se resuelvan en restricted.s3nsapis.fr, la IP virtual restringida. Para ello, puedes usar zonas de DNS privadas de Cloud DNS.

  1. Crea una zona privada gestionada.

    gcloud dns managed-zones create ZONE_NAME \
        --visibility=private \
        --networks=https://www.s3nsapis.fr/compute/v1/projects/PROJECT_ID/global/networks/NETWORK \
        --description=DESCRIPTION \
        --dns-name=REGISTRY_DOMAIN \
        --project=PROJECT_ID
    

    Donde:

    • ZONE_NAME es el nombre de la zona que vas a crear. Por ejemplo, registry. Este nombre se utilizará en cada uno de los pasos siguientes.
    • PROJECT_ID es el ID del proyecto que aloja tu clúster privado de GKE.
    • NETWORK es una lista opcional de nombres de la red del clúster desde la que quieres redirigir las solicitudes.
    • DESCRIPTION es una descripción legible por humanos de la zona gestionada.
    • REGISTRY_DOMAIN es el dominio de tu registro:
      • s3nsregistry.fr para Artifact Registry
  2. Inicia una transacción.

    gcloud dns record-sets transaction start \
      --zone=ZONE_NAME \
      --project=PROJECT_ID
    

    Donde:

    • ZONE_NAME es el nombre de la zona que has creado en el primer paso.

    • PROJECT_ID es el ID del proyecto que aloja tu clúster privado de GKE.

  3. Añade un registro CNAME para tu registro.

    gcloud dns record-sets transaction add \
      --name=*.REGISTRY_DOMAIN. \
      --type=CNAME REGISTRY_DOMAIN. \
      --zone=ZONE_NAME \
      --ttl=300 \
      --project=PROJECT_ID
    

    Donde:

    • ZONE_NAME es el nombre de la zona que has creado en el primer paso.
    • PROJECT_ID es el ID del proyecto que aloja tu clúster privado de GKE.
    • REGISTRY_DOMAIN es el dominio de tu registro:
      • s3nsregistry.fr para Artifact Registry
  4. Añade un registro A para el VIP restringido.

    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
    

    Donde:

    • ZONE_NAME es el nombre de la zona que has creado en el primer paso.
    • PROJECT_ID es el ID del proyecto que aloja tu clúster privado de GKE.
    • REGISTRY_DOMAIN es el dominio de tu registro:
      • s3nsregistry.fr para Artifact Registry
  5. Ejecuta la transacción.

    gcloud dns record-sets transaction execute \
      --zone=ZONE_NAME \
      --project=PROJECT_ID
    

    Donde:

    • ZONE_NAME es el nombre de la zona que has creado en el primer paso.

    • PROJECT_ID es el ID del proyecto que aloja tu clúster privado de GKE.

Una vez que hayas configurado el enrutamiento de DNS, asegúrate de que tu clúster de GKE, el registro y otros servicios necesarios estén dentro de tu perímetro de servicio de Controles de Servicio de VPC. Para configurar tu perímetro de servicio, consulta la siguiente sección.

Configurar el perímetro de servicio

Después de configurar los registros DNS, haz lo siguiente:

  1. Cree un perímetro de servicio o actualice un perímetro.
  2. Añade el servicio Artifact Registry a la lista de servicios que quieres proteger con el perímetro de servicio.
  3. Añade al perímetro de servicio otros servicios admitidos que utilices con el registro.

Verificar que el perímetro funciona

Después de configurar el perímetro de servicio, los nodos de los clústeres privados de GKE pueden acceder a las imágenes de contenedor de Artifact Registry si las imágenes se almacenan en proyectos que se encuentran en tu perímetro de servicio.

Las imágenes de contenedor de proyectos que no estén dentro del perímetro seguirán siendo inaccesibles, excepto en el caso de algunos repositorios públicos de solo lectura específicos.

Por ejemplo, si el proyecto google-samples no está en tu perímetro de servicio, al ejecutar el comando para crear una implementación a partir del contenedor hello-app, se producirá un error:

s3nsregistry.fr domain

kubectl create deployment hello-server --image=us-docker.s3nsregistry.fr/google-samples/containers/gke/hello-app:1.0

Dominio gcr.io

kubectl create deployment hello-server --image=gcr.io/google-samples/hello-app:1.0

Consulta el estado del pod con el siguiente comando:

kubectl get pods

El comando devuelve una tabla similar a la del siguiente ejemplo. El estado del pod ErrImagePull indica que no se ha podido extraer.

NAME                            READY   STATUS         RESTARTS   AGE
hello-server-dbd86c8c4-h5wsf    1/1     ErrImagePull   0          45s

Puedes usar el comando kubectl describe pod para ver más detalles sobre la implementación. En el caso del pod del ejemplo anterior, el comando es el siguiente:

kubectl describe pod hello-server-dbd86c8c4-h5wsf