Guia de início rápido: gerenciar recursos com o Config Controller

Saiba como criar uma instância do Config Controller que vem pré-instalada com o Config Connector, o Policy Controller e o Config Sync. Em seguida, aprenda a usar sua instância concluindo as seguintes tarefas:

  • Use o Config Connector para criar e gerenciar um recurso Google Cloud .
  • Crie uma restrição do Policy Controller para aplicar uma política e detectar uma violação antes de ela ser implantada.
  • Configure o GitOps para que o Config Sync seja sincronizado a partir de um repositório de amostra que contenha um recurso Google Cloud .

Antes de começar

  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. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  4. To initialize the gcloud CLI, run the following command:

    gcloud init
  5. Create or select a Google Cloud project.

    • 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. Make sure that billing is enabled for your Google Cloud project.

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

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

  9. If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

  10. To initialize the gcloud CLI, run the following command:

    gcloud init
  11. Create or select a Google Cloud project.

    • 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. Make sure that billing is enabled for your Google Cloud project.

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

    gcloud services enable krmapihosting.googleapis.com container.googleapis.com anthos.googleapis.com cloudresourcemanager.googleapis.com serviceusage.googleapis.com
  14. Criar uma instância do Config Controller

    1. No terminal, crie uma instância do Autopilot Config Controller:

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

      Essa operação pode levar até 15 minutos para ser concluída.

      A saída é esta:

      Created instance [cc-example].
      Fetching cluster endpoint and auth data.
      kubeconfig entry generated for krmapihost-cc-example.
      
    2. Verifique se a instância foi criada visualizando a lista de instâncias do Config Controller:

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

      A saída é esta:

      NAME                 LOCATION                 STATE
      cc-example           us-central1              RUNNING
      

    Conceder a permissão necessária ao Config Controller

    Nesta seção, você concede permissão ao Config Controller para gerenciar recursos Google Cloud:

    1. Defina uma variável de ambiente para o e-mail da sua conta de serviço:

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

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

      Substitua PROJECT_ID pela ID do seu projeto.

      O resultado será assim:

      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 a instância do Config Controller

    As seções a seguir apresentam as maneiras de usar a instância do Config Controller.

    Criar um Google Cloud recurso com o Config Connector

    Com sua instância do Config Controller, é possível usar o Config Connector para gerenciar muitos Google Cloud serviços e recursos usando ferramentas e APIs do Kubernetes. Nesta seção, você usa o Config Controller para criar um recurso PubSubTopic.

    Para criar um tópico do Pub/Sub usando o Config Connector, conclua as seguintes etapas:

    1. Use o Config Connector para ativar a API Pub/Sub:

      1. Usando seu editor de texto preferido, crie um arquivo chamado enable-pubsub.yaml e copie o YAML a seguir nele:

        # 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
        

        Substitua PROJECT_ID pela ID do seu projeto.

      2. Para ativar a API Pub/Sub, aplique o manifesto ao cluster:

        kubectl apply -f enable-pubsub.yaml
        

        A ativação dessa API pode levar vários minutos.

    2. Use o Config Connector para criar um tópico do Pub/Sub:

      1. Crie um arquivo chamado pubsub-topic.yaml e copie o YAML a seguir nele:

        # 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. Crie o tópico do Pub/Sub:

        kubectl apply -f pubsub-topic.yaml
        
    3. Verifique se o Config Controller criou o recurso em Google Cloud abrindo a lista de tópicos do Pub/Sub:

      gcloud pubsub topics list
      

      O resultado será assim:

      ---
      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 uma política com o Policy Controller

    Sua instância do Config Controller permite usar o Policy Controller e suas restrições. Como parte da instalação do Policy Controller, o Config Controller instala automaticamente a biblioteca de modelos de restrição. É possível usar os modelos nesta biblioteca para aplicar uma variedade de controles comuns de segurança e conformidade às instâncias do Config Controller.

    Nesta seção, você cria uma restrição usando o modelo de restrição GCPStorageLocationConstraintV1. Com esse modelo, é possível restringir o local em que é possível criar buckets do Cloud Storage. A restrição que você cria usando esse modelo restringe o local a us-central1. É possível usar essa restrição para garantir que seus buckets estejam sendo criados em uma região que oferece o melhor preço e desempenho.

    Para criar a restrição, faça o seguinte:

    1. Crie um arquivo chamado bucket-constraint.yaml e copie o YAML a seguir nele:

      # 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. Crie a restrição:

      kubectl apply -f bucket-constraint.yaml
      

      A saída é esta:

      gcpstoragelocationconstraintv1.constraints.gatekeeper.sh/storage-only-in-us-central1 created`
      
    3. Para demonstrar que a restrição está funcionando, tente usar o Config Connector para criar um recurso StorageBucket em asia-southeast1:

      1. Crie um arquivo chamado asia-storage-bucket.yaml e copie o YAML a seguir nele:

        # 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. Tente criar o bucket do Cloud Storage:

        kubectl apply -f asia-storage-bucket.yaml
        

        A saída é esta:

        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 o GitOps com o Config Sync

    O Config Sync é um serviço do GitOps que permite sincronizar a instância do Config Controller com configurações, políticas e Google Cloud recursos armazenados em um repositório Git, imagem OCI ou repositório Helm. Como o Config Sync reconcilia continuamente o estado do Config Controller com as configurações na origem, é possível garantir que as instâncias tenham uma configuração consistente.

    Nesta seção, você vai sincronizar sua instância do Config Controller a um repositório público do GitHub. Esse repositório contém outro recurso PubSubTopic. Ao sincronizar sua instância desse repositório, o recurso é criado e aplicado automaticamente à instância. Se você quiser usar um fluxo de trabalho do GitOps, crie seus recursos com o Config Sync (em vez de aplicar o recurso diretamente).

    1. Para sincronizar com o GitHub, configure o Cloud NAT. Você precisa fazer isso porque sua instância do Config Controller é apoiada por um cluster particular da edição Google Kubernetes Engine (GKE) Enterprise e os nós de cluster particulares não têm acesso de saída à Internet:

      1. Crie um Cloud NAT router. Você precisa desse roteador para configurar o gateway NAT.

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

        O resultado será assim:

        Creating router [cc-nat-router]...done.
        NAME           REGION       NETWORK
        cc-nat-router  us-central1  default
        
      2. Configure um gateway NAT no roteador criado na etapa 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
        

        A saída é esta:

        Creating NAT [cc-nat-config] in router [cc-nat-router]...done.
        
    2. Para configurar a instância do Config Controller para sincronizar a partir de um repositório de amostra, crie um arquivo chamado cc-rootsync.yaml e copie o seguinte YAML nele:

      # 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. Aplique a configuração:

      kubectl apply -f cc-rootsync.yaml
      

      Depois que a instância é sincronizada no repositório, o Config Sync cria o tópico do Pub/Sub e o aplica à instância do Config Controller.

    4. Verifique se o Config Sync está sincronizando o repositório Git com a instância do Config Controller:

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

      O resultado será assim:

      *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
      

      Se você não vir essa saída, aguarde alguns minutos e tente novamente.

    5. Verifique se o Config Controller criou o recurso:

      gcloud pubsub topics list
      

      O resultado será assim:

      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
      

      Nesta saída, você pode ver o Pub/Sub criado na seção Criar uma instância do Config Controller e o criado ao sincronizar sua instância com um repositório do GitHub.

    Limpar

    Para evitar cobranças na sua conta do Google Cloud pelos recursos usados neste tutorial, exclua o projeto que contém os recursos ou mantenha o projeto e exclua os recursos individuais.

    Excluir o projeto

      Delete a Google Cloud project:

      gcloud projects delete PROJECT_ID

    Excluir recursos individuais

    1. Exclua o recurso PubSubTopic do Config Connector:

      kubectl delete -f pubsub-topic.yaml
      
    2. Exclua a restrição do Policy Controller:

      kubectl delete -f bucket-constraint.yaml
      
    3. Exclua o roteador NAT:

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

      Pressione y quando for solicitado.

    4. Exclua o recurso do Pub/Sub criado pelo Config Sync:

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

      kubectl delete rootsync root-sync -n config-management-system
      
    6. Usando seu editor de texto preferido, exclua todos os arquivos YAML que você criou:

      • enable-pubsub.yaml
      • pubsub-topic.yaml
      • bucket-constraint.yaml
      • asia-storage-bucket.yaml
      • cc-rootsync.yaml
    7. Exclua a instância do Config Controller:

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

      Pressione y quando for solicitado.

    A seguir