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 do 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 do Google Cloud.

Antes de começar

  1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. Instale a CLI do Google Cloud.
  3. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  4. Crie ou selecione um projeto do Google Cloud.

    • Crie um projeto do Google Cloud:

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o projeto do Google Cloud que você está criando.

    • Selecione o projeto do Google Cloud que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Google Cloud.

  5. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  6. Ative as APIs KRM, API GKE, Resource Manager, e Service Usage:

    gcloud services enable krmapihosting.googleapis.com  container.googleapis.com  cloudresourcemanager.googleapis.com  serviceusage.googleapis.com
  7. Instale a CLI do Google Cloud.
  8. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  9. Crie ou selecione um projeto do Google Cloud.

    • Crie um projeto do Google Cloud:

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o projeto do Google Cloud que você está criando.

    • Selecione o projeto do Google Cloud que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Google Cloud.

  10. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  11. Ative as APIs KRM, API GKE, Resource Manager, e Service Usage:

    gcloud services enable krmapihosting.googleapis.com  container.googleapis.com  cloudresourcemanager.googleapis.com  serviceusage.googleapis.com

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. Para configurar a comunicação kubectl com o endpoint do Config Controller, receba as credenciais de autenticação e as informações do endpoint necessárias:

    gcloud anthos config controller get-credentials cc-example \
        --location us-central1
    
  3. 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 os recursos do 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 recurso do Google Cloud usando o Config Connector

Com sua instância do Config Controller, é possível aproveitar o Config Connector para gerenciar muitos serviços e recursos do Google Cloud 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 no Google Cloud visualizando 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 recursos do Google Cloud 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 pelo GitHub, configure o Cloud NAT. Isso é necessário porque sua instância do Config Controller tem o suporte de um cluster particular da edição Enterprise do Google Kubernetes Engine (GKE) e os nós do cluster particular 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 no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

Excluir o projeto

    Exclua um projeto do Google Cloud:

    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