Guía de inicio rápido: gestiona recursos con Config Controller

Consulta cómo crear una instancia de Config Controller que venga preinstalada con Config Connector, Policy Controller y Config Sync. A continuación, descubre cómo utilizar tu instancia completando las siguientes tareas:

  • Usa Config Connector para crear y gestionar un recurso de Google Cloud .
  • Crea una restricción de Policy Controller para aplicar una política y detectar una infracción de la política antes de que se implemente.
  • Configura GitOps configurando Config Sync para que se sincronice desde un repositorio de ejemplo que contenga un recurso Google Cloud .

Antes de empezar

  1. 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.
  2. Install the Google Cloud CLI.

  3. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  4. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  5. 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 the resourcemanager.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.

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the KRM, GKE, Resource Manager, and Service Usage APIs:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable krmapihosting.googleapis.com container.googleapis.com cloudresourcemanager.googleapis.com serviceusage.googleapis.com
  8. Install the Google Cloud CLI.

  9. Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

  10. Para inicializar gcloud CLI, ejecuta el siguiente comando:

    gcloud init
  11. 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 the resourcemanager.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.

  12. Verify that billing is enabled for your Google Cloud project.

  13. Enable the KRM, GKE, Resource Manager, and Service Usage APIs:

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    gcloud services enable krmapihosting.googleapis.com container.googleapis.com cloudresourcemanager.googleapis.com serviceusage.googleapis.com
  14. Crear una instancia de Config Controller

    1. En el terminal, crea una instancia de Autopilot Config Controller:

      gcloud anthos config controller create cc-example \
          --location=us-central1 \
          --full-management
      

      Esta operación puede tardar hasta 15 minutos en completarse.

      El resultado es el siguiente:

      Created instance [cc-example].
      Fetching cluster endpoint and auth data.
      kubeconfig entry generated for krmapihost-cc-example.
      
    2. Comprueba que se ha creado tu instancia viendo la lista de instancias de Config Controller:

      gcloud anthos config controller list --location=us-central1
      

      El resultado es el siguiente:

      NAME                 LOCATION                 STATE
      cc-example           us-central1              RUNNING
      

    Conceder el permiso necesario de Config Controller

    En esta sección, se concede permiso a Config Controller para gestionar recursos: Google Cloud

    1. Define una variable de entorno para el correo de tu cuenta de servicio:

      export SA_EMAIL="$(kubectl get ConfigConnectorContext -n config-control \
          -o jsonpath='{.items[0].spec.googleServiceAccount}' 2> /dev/null)"
      
    2. Crea el enlace de la política:

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member "serviceAccount:${SA_EMAIL}" \
          --role "roles/owner" \
          --project PROJECT_ID
      

      Sustituye PROJECT_ID por el ID del proyecto.

      El resultado debería ser similar al siguiente:

      Updated IAM policy for project [PROJECT_ID].
      auditConfigs:
      - auditLogConfigs:
        - logType: ADMIN_READ
        - logType: DATA_READ
        - logType: DATA_WRITE
        service: gkehub.googleapis.com
      # Remainder of output omitted
      

    Usar tu instancia de Config Controller

    En las siguientes secciones se explica cómo puedes usar tu instancia de Config Controller.

    Crear un Google Cloud recurso con Config Connector

    Con tu instancia de Config Controller, puedes aprovechar Config Connector para gestionar muchos Google Cloud servicios y recursos con herramientas y APIs de Kubernetes. En esta sección, usarás Config Controller para crear un recurso PubSubTopic.

    Para crear un tema de Pub/Sub con Config Connector, sigue estos pasos:

    1. Usa Config Connector para habilitar la API Pub/Sub:

      1. Con el editor de texto que prefieras, crea un archivo llamado enable-pubsub.yaml y copia el siguiente YAML en él:

        # enable-pubsub.yaml
        apiVersion: serviceusage.cnrm.cloud.google.com/v1beta1
        kind: Service
        metadata:
          name: pubsub.googleapis.com
          namespace: config-control
        spec:
          projectRef:
            external: projects/PROJECT_ID
        

        Sustituye PROJECT_ID por el ID del proyecto.

      2. Para habilitar la API Pub/Sub, aplica el manifiesto a tu clúster:

        kubectl apply -f enable-pubsub.yaml
        

        Habilitar esta API puede tardar varios minutos.

    2. Usa Config Connector para crear un tema de Pub/Sub:

      1. Crea un archivo llamado pubsub-topic.yaml y copia el siguiente YAML en él:

        # pubsub-topic.yaml
        apiVersion: pubsub.cnrm.cloud.google.com/v1beta1
        kind: PubSubTopic
        metadata:
          annotations:
            cnrm.cloud.google.com/project-id: PROJECT_ID
          labels:
            label-one: "value-one"
          name: example-topic
          namespace: config-control
        
      2. Crea el tema de Pub/Sub:

        kubectl apply -f pubsub-topic.yaml
        
    3. Comprueba que Config Controller ha creado tu recurso en Google Cloud viendo la lista de temas de Pub/Sub:

      gcloud pubsub topics list
      

      El resultado debería ser similar al siguiente:

      ---
      name: projects/PROJECT_ID/topics/start-instance-event
      ---
      labels:
        label-one: value-one
        managed-by-cnrm: 'true'
      name: projects/PROJECT_ID/topics/example-topic
      

    Aplicar una política con Policy Controller

    Tu instancia de Config Controller te permite usar Policy Controller y las restricciones de Policy Controller. Como parte de la instalación de Policy Controller, Config Controller instala automáticamente la biblioteca de plantillas de restricciones. Puedes usar las plantillas de esta biblioteca para aplicar varios controles de seguridad y cumplimiento comunes en tus instancias de Config Controller.

    En esta sección, creará una restricción mediante la plantilla de restricción GCPStorageLocationConstraintV1. Esta plantilla te permite restringir la ubicación en la que puedes crear segmentos de Cloud Storage. La restricción que crees con esta plantilla limita la ubicación a us-central1. Puede usar esta restricción para asegurarse de que sus segmentos se creen en una región que ofrezca el mejor precio y rendimiento.

    Para crear la restricción, sigue estos pasos:

    1. Crea un archivo llamado bucket-constraint.yaml y copia el siguiente YAML en él:

      # bucket-constraint.yaml
      apiVersion: constraints.gatekeeper.sh/v1beta1
      kind: GCPStorageLocationConstraintV1
      metadata:
        name: storage-only-in-us-central1
      spec:
        match:
          kinds:
          - apiGroups:
            - storage.cnrm.cloud.google.com
            kinds:
            - StorageBucket
        parameters:
          locations:
          - us-central1
      
    2. Crea la restricción:

      kubectl apply -f bucket-constraint.yaml
      

      El resultado es el siguiente:

      gcpstoragelocationconstraintv1.constraints.gatekeeper.sh/storage-only-in-us-central1 created`
      
    3. Demuestra que la restricción funciona intentando usar Config Connector para crear un recurso StorageBucket en asia-southeast1:

      1. Crea un archivo llamado asia-storage-bucket.yaml y copia el siguiente código YAML en él:

        # asia-storage-bucket.yaml
        apiVersion: storage.cnrm.cloud.google.com/v1beta1
        kind: StorageBucket
        metadata:
          name: bucket-in-disallowed-location
          namespace: config-control
        spec:
          location: asia-southeast1
        
      2. Intenta crear el segmento de Cloud Storage:

        kubectl apply -f asia-storage-bucket.yaml
        

        El resultado es el siguiente:

        Error from server (Forbidden): error when creating "STDIN": admission webhook "validation.gatekeeper.sh" denied the request: [storage-only-in-us-central1] Cloud Storage bucket <bucket-in-disallowed-location> uses a disallowed location <asia-southeast1>, allowed locations are ["us-central1"]
        
    .

    Configurar GitOps con Config Sync

    Config Sync es un servicio GitOps que te permite sincronizar tu instancia de Config Controller con configuraciones, políticas yGoogle Cloud recursos almacenados en un repositorio de Git, una imagen OCI o un repositorio de Helm. Como Config Sync concilia continuamente el estado de Config Controller con las configuraciones de tu fuente, puedes asegurarte de que tus instancias tengan una configuración coherente.

    En esta sección, sincronizarás tu instancia de Config Controller con un repositorio público de GitHub. Este repositorio contiene otro recurso PubSubTopic. Si sincronizas tu instancia desde este repositorio, el recurso se creará automáticamente y se aplicará a tu instancia. Puedes crear tus recursos con Config Sync (en lugar de aplicar el recurso directamente) si quieres usar un flujo de trabajo de GitOps.

    1. Para sincronizar desde GitHub, configura Cloud NAT. Debes hacerlo porque tu instancia de Config Controller se basa en un clúster privado de GKE y los nodos de clúster privados no tienen acceso saliente a Internet:

      1. Crea un router de Cloud NAT. Necesitas este router para configurar tu pasarela NAT.

        gcloud compute routers create cc-nat-router \
            --network default \
            --region us-central1
        

        El resultado debería ser similar al siguiente:

        Creating router [cc-nat-router]...done.
        NAME           REGION       NETWORK
        cc-nat-router  us-central1  default
        
      2. Configura una pasarela NAT en el router que has creado en el paso anterior:

        gcloud compute routers nats create cc-nat-config \
            --router-region us-central1 \
            --router cc-nat-router \
            --nat-all-subnet-ip-ranges \
            --auto-allocate-nat-external-ips
        

        El resultado es el siguiente:

        Creating NAT [cc-nat-config] in router [cc-nat-router]...done.
        
    2. Para configurar tu instancia de Config Controller de forma que se sincronice desde un repositorio de ejemplo, crea un archivo llamado cc-rootsync.yaml y copia el siguiente código YAML en él:

      # cc-rootsync.yaml
      apiVersion: configsync.gke.io/v1beta1
      kind: RootSync
      metadata:
        name: root-sync
        namespace: config-management-system
      spec:
        sourceFormat: unstructured
        git:
          repo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples
          branch: main
          dir: config-controller-quickstart
          auth: none
      
    3. Aplica la configuración:

      kubectl apply -f cc-rootsync.yaml
      

      Una vez que tu instancia se haya sincronizado desde el repositorio, Config Sync creará el tema de Editor/Suscriptor y lo aplicará a tu instancia de Config Controller.

    4. Verifica que Config Sync esté sincronizando el repositorio de Git con tu instancia de Config Controller:

      nomos status --contexts gke_PROJECT_ID_us-central1_krmapihost-cc-example
      

      El resultado debería ser similar al siguiente:

      *gke_PROJECT_ID_us-central1_krmapihost-cc-example
      --------------------
      <root>:root-sync                         https://github.com/GoogleCloudPlatform/anthos-config-management-samples/config-controller-quickstart@main
      SYNCED @ 2023-01-10 18:31:02 +0000 UTC   715b4295d3eac07b057cce2543275c1ee104cad8
      Managed resources:
         NAMESPACE        NAME                                                               STATUS   SOURCEHASH
         config-control   pubsubtopic.pubsub.cnrm.cloud.google.com/pubsub-topic-sample-sync  Current   715b429
         config-control   service.serviceusage.cnrm.cloud.google.com/pubsub.googleapis.com   Current   715b429
      

      Si no ves este resultado, espera un par de minutos y vuelve a intentarlo.

    5. Verifica que Config Controller ha creado tu recurso:

      gcloud pubsub topics list
      

      El resultado debería ser similar al siguiente:

      name: projects/PROJECT_ID/topics/start-instance-event
      ---
      labels:
        managed-by-cnrm: 'true'
      name: projects/PROJECT_ID/topics/sample-topic
      ---
      labels:
        managed-by-cnrm: 'true'
      name: projects/PROJECT_ID/topics/pubsub-topic-sample-sync
      ---
      labels:
        label-one: value-one
        managed-by-cnrm: 'true'
      name: projects/PROJECT_ID/topics/example-topic
      

      En este resultado, puedes ver el Pub/Sub que has creado en la sección Crear una instancia de Config Controller y el que has creado sincronizando tu instancia con un repositorio de GitHub.

    Limpieza

    Para evitar que se apliquen cargos en tu Google Cloud cuenta por los recursos utilizados en este tutorial, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.

    Eliminar el proyecto

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    Eliminar los recursos concretos

    1. Elimina el recurso PubSubTopic de Config Connector:

      kubectl delete -f pubsub-topic.yaml
      
    2. Elimina la restricción de Policy Controller:

      kubectl delete -f bucket-constraint.yaml
      
    3. Elimina el router NAT:

      gcloud compute routers delete cc-nat-router \
          --project=PROJECT_ID \
          --region=us-central1
      

      Pulsa y cuando se te pida.

    4. Elimina el recurso de Pub/Sub creado por Config Sync:

      kubectl delete PubSubTopic pubsub-topic-sample-sync -n config-control
      
    5. Elimina el recurso RootSync:

      kubectl delete rootsync root-sync -n config-management-system
      
    6. Con el editor de texto que prefieras, elimina todos los archivos YAML que hayas creado:

      • enable-pubsub.yaml
      • pubsub-topic.yaml
      • bucket-constraint.yaml
      • asia-storage-bucket.yaml
      • cc-rootsync.yaml
    7. Elimina la instancia de Config Controller:

      gcloud anthos config controller delete --location=us-central1 cc-example
      

      Pulsa y cuando se te pida.

    Siguientes pasos