Crie recursos da Google Cloud em conformidade com as políticas

Este tutorial mostra como os administradores da plataforma podem usar políticas do Policy Controller para reger a forma como criar recursos Google Cloud usando o Config Connector.

Esta página destina-se a administradores de TI e operadores que querem garantir que todos os recursos executados na plataforma de nuvem cumprem os requisitos de conformidade organizacionais, fornecendo e mantendo a automatização para auditar ou aplicar, e que gerem o ciclo de vida da infraestrutura tecnológica subjacente. Para saber mais sobre as funções comuns e as tarefas de exemplo que referimos no Google Cloud conteúdo, consulte Funções e tarefas comuns de utilizador do GKE.

As instruções neste tutorial pressupõem que tem conhecimentos básicos do Kubernetes ou do Google Kubernetes Engine (GKE). No tutorial, define uma política que restringe as localizações permitidas para contentores do Cloud Storage.

O Policy Controller verifica, audita e aplica a conformidade dos recursos do cluster do Kubernetes com políticas relacionadas com segurança, regulamentos ou regras empresariais. O Policy Controller é criado a partir do projeto de código aberto OPA Gatekeeper.

O Config Connector cria e gere o ciclo de vida dos Google Cloud recursos, descrevendo-os como recursos personalizados do Kubernetes. Para criar um Google Cloud recurso, cria um recurso do Kubernetes num namespace que o Config Connector gere. O exemplo seguinte mostra como descrever um contentor do Cloud Storage através do Config Connector:

apiVersion: storage.cnrm.cloud.google.com/v1beta1
kind: StorageBucket
metadata:
  name: my-bucket
spec:
  location: us-east1

Ao gerir os seus Google Cloud recursos com o Config Connector, pode aplicar políticas do Policy Controller a esses recursos à medida que os cria no seu cluster do Google Kubernetes Engine. Estas políticas permitem-lhe impedir ou denunciar ações que criam ou modificam recursos de formas que violam as suas políticas. Por exemplo, pode aplicar uma política que restrinja as localizações dos contentores do Cloud Storage.

Esta abordagem, baseada no modelo de recursos do Kubernetes (KRM), permite-lhe usar um conjunto consistente de ferramentas e fluxos de trabalho para gerir os recursos do Kubernetes e do Google Cloud . Este tutorial demonstra como pode concluir as seguintes tarefas:

  • Defina políticas que regem os seus Google Cloud recursos.
  • Implemente controlos que impeçam os programadores e os administradores de criarem Google Cloud recursos que violem as suas políticas.
  • Implemente controlos que auditam os seus recursos do Google Cloud existentes em função das suas políticas, mesmo que tenha criado esses recursos fora do Config Connector.
  • Fornecer feedback rápido aos programadores e administradores à medida que criam e atualizam as definições de recursos.
  • Valide as Google Cloud definições de recursos em relação às suas políticas antes de tentar aplicar as definições a um cluster do Kubernetes.

Crie um cluster do GKE

  1. No Cloud Shell, crie um cluster do GKE com o suplemento Config Connector e a federação de identidade da carga de trabalho para o GKE:

    gcloud container clusters create CLUSTER_NAME \
      --addons ConfigConnector \
      --enable-ip-alias \
      --num-nodes 4 \
      --release-channel regular \
      --scopes cloud-platform \
      --workload-pool $GOOGLE_CLOUD_PROJECT.svc.id.goog \
      --zone ZONE
    

    Substitua o seguinte:

    • CLUSTER_NAME: o nome do cluster que quer usar para este projeto, por exemplo, cnrm-gatekeeper-tutorial.
    • ZONE: Uma zona do Compute Engine perto da sua localização, por exemplo, asia-southeast1-b.

    O suplemento Config Connector instala definições de recursos personalizados (CRDs) para Google Cloud recursos no seu cluster do GKE.

  2. Opcional: se usar um cluster privado no seu próprio ambiente, adicione uma regra de firewall que permita que o plano de controlo do cluster do GKE se ligue ao webhook do Policy Controller:

    gcloud compute firewall-rules create allow-cluster-control-plane-tcp-8443 \
      --allow tcp:8443 \
      --network default \
      --source-ranges CONTROL_PLANE_CIDR \
      --target-tags NODE_TAG
    

    Substitua o seguinte:

    • CONTROL_PLANE_CIDR: o intervalo de IP do plano de controlo do cluster do GKE, por exemplo, 172.16.0.16/28.
    • NODE_TAG: uma etiqueta aplicada a todos os nós no seu cluster do GKE.

    Esta regra de firewall opcional é necessária para que o webhook do Policy Controller funcione quando o cluster usa nós privados.

Configure o Config Connector

O Google Cloud projeto onde instala o Config Connector é conhecido como o projeto anfitrião. Os projetos onde usa o Config Connector para gerir recursos são conhecidos como projetos geridos. Neste tutorial, vai usar o Config Connector para criar Google Cloud recursos no mesmo projeto que o seu cluster do GKE, para que o projeto anfitrião e o projeto gerido sejam o mesmo projeto.

  1. No Cloud Shell, crie uma conta de serviço Google para o Config Connector:

    gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \
      --display-name "Config Connector Gatekeeper tutorial"
    

    Substitua SERVICE_ACCOUNT_NAME pelo nome que quer usar para esta conta de serviço, por exemplo, cnrm-gatekeeper-tutorial. O Config Connector usa esta conta de serviço Google para criar recursos no seu projeto gerido.

  2. Conceda a função de administrador de armazenamento à conta de serviço Google:

    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
      --member "serviceAccount:SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com" \
      --role roles/storage.admin
    

    Neste tutorial, usa a função de administrador de armazenamento porque usa o Config Connector para criar contentores do Cloud Storage. No seu próprio ambiente, conceda as funções necessárias para gerir os Google Cloud recursos Google Cloud que quer criar para o Config Connector. Para mais informações sobre as funções predefinidas, consulte a secção Compreender as funções na documentação do IAM.

  3. Crie um espaço de nomes do Kubernetes para os recursos do Config Connector que criar neste tutorial:

    kubectl create namespace NAMESPACE
    

    Substitua NAMESPACE pelo namespace do Kubernetes que quer usar no tutorial, por exemplo, tutorial.

  4. Anote o espaço de nomes para especificar que projeto o Config Connector deve usar para criar Google Cloud recursos (o projeto gerido):

    kubectl annotate namespace NAMESPACE \
        cnrm.cloud.google.com/project-id=$GOOGLE_CLOUD_PROJECT
    
  5. Crie um recurso ConfigConnectorContext que ative o Config Connector para o espaço de nomes do Kubernetes e o associe à conta de serviço Google que criou:

    cat << EOF | kubectl apply -f -
    apiVersion: core.cnrm.cloud.google.com/v1beta1
    kind: ConfigConnectorContext
    metadata:
      name: configconnectorcontext.core.cnrm.cloud.google.com
      namespace: NAMESPACE
    spec:
      googleServiceAccount: SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
    EOF
    

    Quando cria o recurso ConfigConnectorContext, o Config Connector cria uma conta de serviço do Kubernetes e um StatefulSet no espaço de nomes cnrm-system para gerir os recursos do Config Connector no seu espaço de nomes.

  6. Aguarde pelo pod do controlador do Config Connector para o seu espaço de nomes:

    kubectl wait --namespace cnrm-system --for=condition=Ready pod \
      -l cnrm.cloud.google.com/component=cnrm-controller-manager,cnrm.cloud.google.com/scoped-namespace=NAMESPACE
    

    Quando o Pod estiver pronto, aparece a mensagem do Cloud Shell. Se receber a mensagem error: no matching resources found, aguarde um minuto e tente novamente.

  7. Associe a sua conta de serviço do Kubernetes do Config Connector à sua conta de serviço da Google criando uma associação de políticas de IAM:

    gcloud iam service-accounts add-iam-policy-binding \
      SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com \
      --member "serviceAccount:$GOOGLE_CLOUD_PROJECT.svc.id.goog[cnrm-system/cnrm-controller-manager-NAMESPACE]" \
      --role roles/iam.workloadIdentityUser
    

    Esta associação permite que a conta de serviço do cnrm-controller-manager-NAMESPACE Kubernetes no espaço de nomes cnrm-system atue como a conta de serviço da Google que criou.

Instale o Controlador de políticas

Instale o Policy Controller seguindo as instruções de instalação.

Use um intervalo de auditoria de 60 segundos.

Crie um recurso Google Cloud com o Config Connector

  1. No Cloud Shell, crie um manifesto do Config Connector que represente um contentor do Cloud Storage na região us-central1:

    cat << EOF > tutorial-storagebucket-us-central1.yaml
    apiVersion: storage.cnrm.cloud.google.com/v1beta1
    kind: StorageBucket
    metadata:
      name: tutorial-us-central1-$GOOGLE_CLOUD_PROJECT
      namespace: NAMESPACE
    spec:
      location: us-central1
      uniformBucketLevelAccess: true
    EOF
    
  2. Para criar o contentor do Cloud Storage, aplique o manifesto:

    kubectl apply -f tutorial-storagebucket-us-central1.yaml
    
  3. Verifique se o Config Connector criou o contentor do Cloud Storage:

    gcloud storage ls | grep tutorial
    

    O resultado é semelhante ao seguinte:

    gs://tutorial-us-central1-PROJECT_ID/
    

    Este resultado inclui PROJECT_ID, que é o seu ID do projeto. Google Cloud

    Se não vir este resultado, aguarde um minuto e repita o passo.

Criar uma política

Uma política no Policy Controller consiste num modelo de restrição e numa restrição. O modelo de restrição contém a lógica da política. A restrição especifica onde a política se aplica e os parâmetros de entrada da lógica da política.

  1. No Cloud Shell, crie um modelo de restrição que restrinja as localizações dos contentores do Cloud Storage:

    cat << EOF > tutorial-storagebucket-location-template.yaml
    apiVersion: templates.gatekeeper.sh/v1beta1
    kind: ConstraintTemplate
    metadata:
      name: gcpstoragelocationconstraintv1
    spec:
      crd:
        spec:
          names:
            kind: GCPStorageLocationConstraintV1
          validation:
            openAPIV3Schema:
              properties:
                locations:
                  type: array
                  items:
                    type: string
                exemptions:
                  type: array
                  items:
                    type: string
      targets:
      - target: admission.k8s.gatekeeper.sh
        rego: |
          package gcpstoragelocationconstraintv1
    
          allowedLocation(reviewLocation) {
              locations := input.parameters.locations
              satisfied := [ good | location = locations[_]
                                    good = lower(location) == lower(reviewLocation)]
              any(satisfied)
          }
    
          exempt(reviewName) {
              input.parameters.exemptions[_] == reviewName
          }
    
          violation[{"msg": msg}] {
              bucketName := input.review.object.metadata.name
              bucketLocation := input.review.object.spec.location
              not allowedLocation(bucketLocation)
              not exempt(bucketName)
              msg := sprintf("Cloud Storage bucket <%v> uses a disallowed location <%v>, allowed locations are %v", [bucketName, bucketLocation, input.parameters.locations])
          }
    
          violation[{"msg": msg}] {
              not input.parameters.locations
              bucketName := input.review.object.metadata.name
              msg := sprintf("No permitted locations provided in constraint for Cloud Storage bucket <%v>", [bucketName])
          }
    EOF
    
  2. Aplique o modelo para criar o contentor do Cloud Storage:

    kubectl apply -f tutorial-storagebucket-location-template.yaml
    
  3. Crie uma restrição que só permita contentores nas regiões de Singapura e Jacarta (asia-southeast1 e asia-southeast2). A restrição aplica-se ao espaço de nomes que criou anteriormente. Isenta o contentor do Cloud Storage predefinido para o Cloud Build.

    cat << EOF > tutorial-storagebucket-location-constraint.yaml
    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: GCPStorageLocationConstraintV1
    metadata:
      name: singapore-and-jakarta-only
    spec:
      enforcementAction: deny
      match:
        kinds:
        - apiGroups:
          - storage.cnrm.cloud.google.com
          kinds:
          - StorageBucket
        namespaces:
        - NAMESPACE
      parameters:
        locations:
        - asia-southeast1
        - asia-southeast2
        exemptions:
        - ${GOOGLE_CLOUD_PROJECT}_cloudbuild
    EOF
    
  4. Para limitar as zonas em que os contentores podem existir, aplique a restrição:

    kubectl apply -f tutorial-storagebucket-location-constraint.yaml
    

Valide a política

  1. Crie um manifesto que represente um contentor do Cloud Storage numa localização não permitida (us-west1):

    cat << EOF > tutorial-storagebucket-us-west1.yaml
    apiVersion: storage.cnrm.cloud.google.com/v1beta1
    kind: StorageBucket
    metadata:
      name: tutorial-us-west1-$GOOGLE_CLOUD_PROJECT
      namespace: NAMESPACE
    spec:
      location: us-west1
      uniformBucketLevelAccess: true
    EOF
    
  2. Para criar o contentor do Cloud Storage, aplique o manifesto:

    kubectl apply -f tutorial-storagebucket-us-west1.yaml
    

    O resultado é semelhante ao seguinte:

    Error from server ([singapore-and-jakarta-only] Cloud Storage bucket
    <tutorial-us-west1-PROJECT_ID> uses a disallowed location
    <us-west1>, allowed locations are ["asia-southeast1",
    "asia-southeast2"]): error when creating
    "tutorial-storagebucket-us-west1.yaml": admission webhook
    "validation.gatekeeper.sh" denied the request: [singapore-and-jakarta-only]
    Cloud Storage bucket <tutorial-us-west1-PROJECT_ID> uses a
    disallowed location <us-west1>, allowed locations are
    ["asia-southeast1", "asia-southeast2"]
    
  3. Opcional: pode ver um registo da decisão de recusar o pedido nos registos de auditoria do Google Cloud. Consultar os registos de atividade de administrador do seu projeto:

    gcloud logging read --limit=1 \
        "logName=\"projects/$GOOGLE_CLOUD_PROJECT/logs/cloudaudit.googleapis.com%2Factivity\""'
        resource.type="k8s_cluster"
        resource.labels.cluster_name="CLUSTER_NAME"
        resource.labels.location="ZONE"
        protoPayload.authenticationInfo.principalEmail!~"system:serviceaccount:cnrm-system:.*"
        protoPayload.methodName:"com.google.cloud.cnrm."
        protoPayload.status.code=7'
    

    O resultado é semelhante ao seguinte:

    insertId: 3c6940bb-de14-4d18-ac4d-9a6becc70828
    labels:
      authorization.k8s.io/decision: allow
      authorization.k8s.io/reason: ''
      mutation.webhook.admission.k8s.io/round_0_index_0: '{"configuration":"mutating-webhook.cnrm.cloud.google.com","webhook":"container-annotation-handler.cnrm.cloud.google.com","mutated":true}'
      mutation.webhook.admission.k8s.io/round_0_index_1: '{"configuration":"mutating-webhook.cnrm.cloud.google.com","webhook":"management-conflict-annotation-defaulter.cnrm.cloud.google.com","mutated":true}'
    logName: projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Factivity
    operation:
      first: true
      id: 3c6940bb-de14-4d18-ac4d-9a6becc70828
      last: true
      producer: k8s.io
    protoPayload:
      '@type': type.googleapis.com/google.cloud.audit.AuditLog
      authenticationInfo:
        principalEmail: user@example.com
      authorizationInfo:
      - permission: com.google.cloud.cnrm.storage.v1beta1.storagebuckets.create
        resource: storage.cnrm.cloud.google.com/v1beta1/namespaces/NAMESPACE/storagebuckets/tutorial-us-west1-PROJECT_ID
      methodName: com.google.cloud.cnrm.storage.v1beta1.storagebuckets.create
      requestMetadata:
        callerIp: 203.0.113.1
        callerSuppliedUserAgent: kubectl/v1.21.1 (linux/amd64) kubernetes/5e58841
      resourceName: storage.cnrm.cloud.google.com/v1beta1/namespaces/NAMESPACE/storagebuckets/tutorial-us-west1-PROJECT_ID
      serviceName: k8s.io
      status:
        code: 7
        message: Forbidden
    receiveTimestamp: '2021-05-21T06:56:24.940264678Z'
    resource:
      labels:
        cluster_name: CLUSTER_NAME
        location: CLUSTER_ZONE
        project_id: PROJECT_ID
      type: k8s_cluster
    timestamp: '2021-05-21T06:56:09.060635Z'

    O campo methodName mostra a operação tentada, o campo resourceName mostra o nome completo do recurso do Config Connector e a secção status mostra que o pedido não foi bem-sucedido, com o código de erro 7 e a mensagem Forbidden.

  4. Crie um manifesto que represente um contentor do Cloud Storage numa localização permitida (asia-southeast1):

    cat << EOF > tutorial-storagebucket-asia-southeast1.yaml
    apiVersion: storage.cnrm.cloud.google.com/v1beta1
    kind: StorageBucket
    metadata:
      name: tutorial-asia-southeast1-$GOOGLE_CLOUD_PROJECT
      namespace: NAMESPACE
    spec:
      location: asia-southeast1
      uniformBucketLevelAccess: true
    EOF
    
  5. Para criar o contentor do Cloud Storage, aplique o manifesto:

    kubectl apply -f tutorial-storagebucket-asia-southeast1.yaml
    

    O resultado é semelhante ao seguinte:

    storagebucket.storage.cnrm.cloud.google.com/tutorial-asia-southeast1-PROJECT_ID created
    

    Este resultado inclui PROJECT_ID, que é o seu ID do projeto. Google Cloud

  6. Verifique se o Config Connector criou o contentor do Cloud Storage:

    gcloud storage ls | grep tutorial
    

    O resultado é semelhante ao seguinte:

    gs://tutorial-asia-southeast1-PROJECT_ID/
    gs://tutorial-us-central1-PROJECT_ID/
    

    Se não vir este resultado, aguarde um minuto e repita este passo.

Restrições de auditoria

O controlador de auditoria no controlador de políticas avalia periodicamente os recursos em função das respetivas restrições. O controlador deteta violações de políticas para recursos criados antes da restrição e para recursos criados fora do Config Connector.

  1. No Cloud Shell, veja as violações de todas as restrições que usam o modelo de restrição GCPStorageLocationConstraintV1:

    kubectl get gcpstoragelocationconstraintv1 -o json \
      | jq '.items[].status.violations'
    

    O resultado é semelhante ao seguinte:

    [
      {
        "enforcementAction": "deny",
        "kind": "StorageBucket",
        "message": "Cloud Storage bucket <tutorial-us-central1-PROJECT_ID>
        uses a disallowed location <us-central1>, allowed locations are
        \"asia-southeast1\", \"asia-southeast2\"",
        "name": "tutorial-us-central1-PROJECT_ID",
        "namespace": "NAMESPACE"
      }
    ]
    

    Vê o contentor do Cloud Storage que criou us-central1 antes de criar a restrição.

Valide os recursos durante o desenvolvimento

Durante o desenvolvimento e as compilações de integração contínua, é útil validar os recursos em relação às restrições antes de aplicar esses recursos ao cluster do GKE. A validação fornece feedback rápido e permite-lhe descobrir problemas com recursos e restrições antecipadamente. Estes passos mostram como validar recursos com o kpt. A ferramenta de linha de comandos kpt permite-lhe gerir e aplicar manifestos de recursos do Kubernetes.

  1. No Cloud Shell, execute a gatekeeper função KRM com o kpt:

    kpt fn eval . --image=gcr.io/kpt-fn/gatekeeper:v0.2 --truncate-output=false
    

    Uma função KRM é um programa que pode alterar ou validar recursos do Kubernetes armazenados no sistema de ficheiros local como ficheiros YAML. A função KRM valida os recursos do bucket do Google Cloud Storage do Config Connector em relação à política do Gatekeeper.gatekeeper A função gatekeeper KRM é embalada como uma imagem de contentor disponível no Artifact Registry.

    A função comunica que os ficheiros de manifesto para contentores do Cloud Storage nas regiões us-central1 e us-west1 violam a restrição.

    O resultado é semelhante ao seguinte:

    [RUNNING] "gcr.io/kpt-fn/gatekeeper:v0.2"
    [FAIL] "gcr.io/kpt-fn/gatekeeper:v0.2"
      Results:
        [ERROR] Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are ["asia-southeast1", "asia-southeast2"] violatedConstraint: singapore-and-jakarta-only in object "storage.cnrm.cloud.google.com/v1beta1/StorageBucket/tutorial/tutorial-us-central1-GOOGLE_CLOUD_PROJECT" in file "tutorial-storagebucket-us-central1.yaml"
        [ERROR] Cloud Storage bucket <tutorial-us-west1-PROJECT_ID> uses a disallowed location <us-west1>, allowed locations are ["asia-southeast1", "asia-southeast2"] violatedConstraint: singapore-and-jakarta-only in object "storage.cnrm.cloud.google.com/v1beta1/StorageBucket/tutorial/tutorial-us-west1-GOOGLE_CLOUD_PROJECT" in file "tutorial-storagebucket-us-west1.yaml"
      Stderr:
        "[error] storage.cnrm.cloud.google.com/v1beta1/StorageBucket/test/tutorial-us-central1-PROJECT_ID : Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are [\"asia-southeast1\", \"asia-southeast2\"]"
        "violatedConstraint: singapore-and-jakarta-only"
        ""
        "[error] storage.cnrm.cloud.google.com/v1beta1/StorageBucket/test/tutorial-us-west1-PROJECT_IDT : Cloud Storage bucket <tutorial-us-west1-PROJECT_IDgt; uses a disallowed location <us-west1>, allowed locations are [\"asia-southeast1\", \"asia-southeast2\"]"
        "violatedConstraint: singapore-and-jakarta-only"
        ""
      Exit code: 1
    

Valide os recursos criados fora do Config Connector

Pode validar Google Cloud recursos criados fora do Config Connector exportando os recursos. Depois de exportar os recursos, use uma das seguintes opções para avaliar as políticas do Policy Controller em relação aos recursos exportados:

  • Valide os recursos através da função gatekeeper KRM.

  • Importe os recursos para o Config Connector.

Para exportar os recursos, usa o Cloud Asset Inventory.

  1. No Cloud Shell, ative a API Cloud Asset:

    gcloud services enable cloudasset.googleapis.com
    
  2. Elimine os ficheiros de manifesto de recursos do Kubernetes para os contentores do Cloud Storage em us-central1 e us-west1:

    rm tutorial-storagebucket-us-*.yaml
    
  3. Exporte todos os recursos do Cloud Storage no seu projeto atual e armazene o resultado num ficheiro denominado export.yaml:

    gcloud beta resource-config bulk-export \
      --project $GOOGLE_CLOUD_PROJECT \
      --resource-format krm \
      --resource-types StorageBucket > export.yaml
    

    O resultado é semelhante ao seguinte:

    Exporting resource configurations to stdout...
    
    Export complete.
    
  4. Crie um pipeline kpt encadeando funções KRM. Este pipeline valida os recursos no diretório atual em relação à política de localização do contentor do Cloud Storage:

    kpt fn source . \
      | kpt fn eval - --image=gcr.io/kpt-fn/set-namespace:v0.1 -- namespace=NAMESPACE \
      | kpt fn eval - --image=gcr.io/kpt-fn/gatekeeper:v0.2 --truncate-output=false
    

    Os recursos exportados não têm um valor para o atributo de metadados namespace. Este pipeline usa uma função KRM denominada set-namespace para definir o valor namespace de todos os recursos.

    O resultado é semelhante ao seguinte e mostra violações dos recursos que exportou:

    [RUNNING] "gcr.io/kpt-fn/set-namespace:v0.1"
    [PASS] "gcr.io/kpt-fn/set-namespace:v0.1"
    [RUNNING] "gcr.io/kpt-fn/gatekeeper:v0.2"
    [FAIL] "gcr.io/kpt-fn/gatekeeper:v0.2"
      Results:
        [ERROR] Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are ["asia-southeast1", "asia-southeast2"] violatedConstraint: singapore-and-jakarta-only in object "storage.cnrm.cloud.google.com/v1beta1/StorageBucket/tutorial/tutorial-us-central1-GOOGLE_CLOUD_PROJECT" in file "export.yaml"
      Stderr:
        "[error] storage.cnrm.cloud.google.com/v1beta1/StorageBucket/test/tutorial-us-central1-PROJECT_ID : Cloud Storage bucket <tutorial-us-central1-PROJECT_ID> uses a disallowed location <us-central1>, allowed locations are [\"asia-southeast1\", \"asia-southeast2\"]"
        "violatedConstraint: singapore-and-jakarta-only"
        ""
      Exit code: 1
    

    Se o seu Google Cloud projeto contiver contentores do Cloud Storage que criou antes de trabalhar neste tutorial e a respetiva localização violar a restrição, os contentores criados anteriormente aparecem no resultado.

Parabéns, configurou com êxito uma política que rege a localização permitida dos contentores do Cloud Storage. O tutorial está concluído. Agora, pode continuar a adicionar as suas próprias políticas para outros Google Cloud recursos.

Resolução de problemas

Se o Config Connector não criar os Google Cloud recursos esperados, use o seguinte comando no Cloud Shell para ver os registos do gestor do controlador do Config Connector:

kubectl logs --namespace cnrm-system --container manager \
  --selector cnrm.cloud.google.com/component=cnrm-controller-manager,cnrm.cloud.google.com/scoped-namespace=NAMESPACE

Se o Policy Controller não aplicar as políticas corretamente, use o seguinte comando para ver os registos do gestor do controlador:

kubectl logs deployment/gatekeeper-controller-manager \
  --namespace gatekeeper-system

Se o Policy Controller não comunicar violações no campo status dos objetos de restrição, veja os registos do controlador de auditoria com este comando:

kubectl logs deployment/gatekeeper-audit --namespace gatekeeper-system

Se tiver outros problemas com este tutorial, recomendamos que reveja estes documentos: