Configura Container Registry para los clústeres privados de GKE

En esta página, se describe cómo configurar entradas de DNS para usar Container Registry con un clúster privado de Google Kubernetes Engine y VPC Service Controls. Estos pasos solo son necesarios si tu clúster privado de GKE usa Container Registry.

Antes de comenzar

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

Además, debes permitir la salida 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 tiene una norma que niega dicho tráfico, debe crear una regla de firewall de salida para permitir el tráfico TCP en el puerto 443 a 199.36.153.4/30.

Configurar DNS

Para admitir clústeres privados de GKE que usan Container Registry dentro de un perímetro de servicio, primero debes configurar tu servidor DNS para que las solicitudes a Container Registry resuelvan en restricted.googleapis.com, el VIP restringido. Puedes hacerlo con las zonas DNS privadas de Cloud DNS.

  1. Crea una zona privada administrada

    gcloud beta dns managed-zones create ZONE_NAME \
            --visibility=private \
            --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK \
            --description=DESCRIPTION \
            --dns-name=gcr.io \
            --project=PROJECT_ID
        

    Aquí:

    • ZONE_NAME es un nombre para la zona que estás creando. Por ejemplo: gcr Este nombre se usará en cada uno de los siguientes pasos.

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

    • NETWORK es el nombre de la red del clúster del que deseas redirigir las solicitudes. La red predeterminada es default.

    • DESCRIPTION es una descripción opcional y legible de la zona administrada.

  2. Inicia una transacción.

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

    Aquí:

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

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

  3. Agrega un registro CNAME para *.gcr.io.

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

    Aquí:

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

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

  4. Agrega un registro A para el VIP restringido.

    gcloud dns record-sets transaction add \
          --name=gcr.io. \
          --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
        

    Aquí:

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

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

  5. Ejecuta la transacción.

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

    Aquí:

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

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

Cómo configurar el perímetro de servicio

Después de configurar los registros DNS, cree un nuevo perímetro de servicio o actualice un perímetro existente y, luego, agregue el servicio Container Registry a la lista de servicios que desea proteger con el perímetro de servicio.

Verificar si el perímetro funciona

Después de configurar el perímetro de servicio, puedes seguir el instructivo de libro de visitas PHP para verificar que el perímetro esté funcionando como se espera.

Si la configuración funciona correctamente, no se puede iniciar el pod para el frontend web de la aplicación de libro de visitas.

El siguiente mensaje de error es un ejemplo de lo que se debe mostrar si el perímetro está configurado correctamente:

    Events:
      Type     Reason                 Age               From                                               Message
      ----     ------                 ----              ----                                               -------
      Normal   Scheduled              8m                default-scheduler                                  Successfully assigned sample-67f11b22f-t7ltj to gke-netpolicy-default-pool-02ad111e-06tk
      Normal   SuccessfulMountVolume  8m                kubelet, gke-netpolicy-default-pool-02ad111e-06tk  MountVolume.SetUp succeeded for volume "default-token-lhx2s"
      Normal   Pulling                6m (x4 over 8m)   kubelet, gke-netpolicy-default-pool-02ad111e-06tk  pulling image "gcr.io/google_samples/gb-frontend:v4"
      Warning  Failed                 6m (x4 over 8m)   kubelet, gke-netpolicy-default-pool-02ad111e-06tk  Failed to pull image "gcr.io/google_samples/gb-frontend:v4": rpc error: code = Unknown desc = Error response from daemon: Get https://gcr.io/v2/google_samples/gb-frontend/manifests/v4: denied: Request is prohibited by organization's policy