En este tutorial se muestra cómo pueden usar los administradores de plataformas las políticas de Policy Controller para controlar cómo se crean los recursos Google Cloud con Config Connector.
Esta página está dirigida a administradores y operadores de TI que quieran asegurarse de que todos los recursos que se ejecutan en la plataforma en la nube cumplen los requisitos de cumplimiento de la organización proporcionando y manteniendo la automatización para auditar o aplicar, y que gestionan el ciclo de vida de la infraestructura tecnológica subyacente. Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el contenido, consulta Roles y tareas de usuario habituales de GKE.Google Cloud
En las instrucciones de este tutorial se presupone que tienes conocimientos básicos de Kubernetes o Google Kubernetes Engine (GKE). En el tutorial, definirás una política que restringe las ubicaciones permitidas para los segmentos de Cloud Storage.
Policy Controller comprueba, audita y aplica el cumplimiento de los recursos de tu clúster de Kubernetes con políticas relacionadas con la seguridad, las normativas o las reglas empresariales. Policy Controller se basa en el proyecto de código abierto OPA Gatekeeper.
Config Connector crea y gestiona el ciclo de vida de los Google Cloud recursos describiéndolos como recursos personalizados de Kubernetes. Para crear un Google Cloud recurso, crea un recurso de Kubernetes en un espacio de nombres que gestione Config Connector. En el siguiente ejemplo se muestra cómo describir un segmento de Cloud Storage con Config Connector:
apiVersion: storage.cnrm.cloud.google.com/v1beta1 kind: StorageBucket metadata: name: my-bucket spec: location: us-east1
Al gestionar tus Google Cloud recursos con Config Connector, puedes aplicar políticas de Policy Controller a esos recursos a medida que los creas en tu clúster de Google Kubernetes Engine. Estas políticas te permiten evitar o denunciar acciones que creen o modifiquen recursos de forma que infrinjan tus políticas. Por ejemplo, puedes aplicar una política que restrinja las ubicaciones de los segmentos de Cloud Storage.
Este enfoque, basado en el modelo de recursos de Kubernetes (KRM), te permite usar un conjunto coherente de herramientas y flujos de trabajo para gestionar tanto recursos de Kubernetes como de Google Cloud . En este tutorial se muestra cómo puedes completar las siguientes tareas:
- Define políticas que rijan tus Google Cloud recursos.
- Implementa controles que impidan que los desarrolladores y administradores creen recursos de Google Cloud que infrinjan tus políticas.
- Implementa controles que auditen tus recursos de Google Cloud en función de tus políticas, aunque hayas creado esos recursos fuera de Config Connector.
- Proporcionar comentarios rápidos a los desarrolladores y administradores a medida que crean y actualizan definiciones de recursos.
- Valida las definiciones de recursos Google Cloud con tus políticas antes de intentar aplicar las definiciones a un clúster de Kubernetes.
Crear un clúster de GKE
En Cloud Shell, crea un clúster de GKE con el complemento Config Connector y Workload Identity Federation para 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
Haz los cambios siguientes:
CLUSTER_NAME
: el nombre del clúster que quieras usar en este proyecto (por ejemplo,cnrm-gatekeeper-tutorial
).ZONE
: una zona de Compute Engine cercana a tu ubicación, por ejemplo,asia-southeast1-b
.
El complemento Config Connector instala definiciones de recursos personalizadas (CRDs) para los Google Cloud recursos de tu clúster de GKE.
Opcional: Si usas un clúster privado en tu entorno, añade una regla de cortafuegos que permita que el plano de control del clúster de GKE se conecte al webhook de 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
Haz los cambios siguientes:
CONTROL_PLANE_CIDR
: el intervalo de IPs de tu plano de control del clúster de GKE. Por ejemplo,172.16.0.16/28
.NODE_TAG
: etiqueta aplicada a todos los nodos de tu clúster de GKE.
Esta regla de cortafuegos opcional es necesaria para que el webhook de Policy Controller funcione cuando tu clúster use nodos privados.
Configurar Config Connector
El Google Cloud proyecto en el que instalas Config Connector se conoce como proyecto host. Los proyectos en los que usas Config Connector para gestionar recursos se denominan proyectos gestionados. En este tutorial, usas Config Connector para crear recursos en el mismo proyecto que tu clúster de GKE, de modo que el proyecto host y el proyecto gestionado sean el mismo.Google Cloud
En Cloud Shell, crea una cuenta de servicio de Google para Config Connector:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME \ --display-name "Config Connector Gatekeeper tutorial"
Sustituye
SERVICE_ACCOUNT_NAME
por el nombre que quieras usar para esta cuenta de servicio. Por ejemplo,cnrm-gatekeeper-tutorial
. Config Connector usa esta cuenta de servicio de Google para crear recursos en tu proyecto gestionado.Asigna el rol Administrador de Storage a la cuenta de servicio de 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
En este tutorial, usas el rol Administrador de Storage porque usas Config Connector para crear segmentos de Cloud Storage. En tu entorno, asigna los roles necesarios para gestionar los recursos que quieras crear para Config Connector. Google Cloud Para obtener más información sobre los roles predefinidos, consulta el artículo sobre la descripción de roles de la documentación de gestión de identidades y accesos.
Crea un espacio de nombres de Kubernetes para los recursos de Config Connector que crearás en este tutorial:
kubectl create namespace NAMESPACE
Sustituye NAMESPACE por el espacio de nombres de Kubernetes que quieras usar en el tutorial. Por ejemplo,
tutorial
.Anota el espacio de nombres para especificar qué proyecto debe usar Config Connector para crear recursos (el proyecto gestionado): Google Cloud
kubectl annotate namespace NAMESPACE \ cnrm.cloud.google.com/project-id=$GOOGLE_CLOUD_PROJECT
Crea un recurso
ConfigConnectorContext
que habilite Config Connector para el espacio de nombres de Kubernetes y lo asocie a la cuenta de servicio de Google que has creado: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
Cuando creas el recurso
ConfigConnectorContext
, Config Connector crea una cuenta de servicio de Kubernetes y un StatefulSet en el espacio de nombrescnrm-system
para gestionar los recursos de Config Connector en tu espacio de nombres.Espera a que el pod del controlador de Config Connector de tu espacio de nombres:
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
Cuando el pod esté listo, aparecerá la petición de Cloud Shell. Si recibes el mensaje
error: no matching resources found
, espera un minuto y vuelve a intentarlo.Vincula tu cuenta de servicio de Kubernetes de Config Connector a tu cuenta de servicio de Google creando una vinculación de política de gestión de identidades y accesos:
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
Este enlace permite que la cuenta de servicio de
cnrm-controller-manager-NAMESPACE
Kubernetes del espacio de nombrescnrm-system
actúe como la cuenta de servicio de Google que has creado.
Instalar Policy Controller
Instala Policy Controller siguiendo las instrucciones de instalación.
Usa un intervalo de auditoría de 60
segundos.
Crear un Google Cloud recurso con Config Connector
En Cloud Shell, crea un manifiesto de Config Connector que represente un segmento de Cloud Storage en la región
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
Para crear el segmento de Cloud Storage, aplica el manifiesto:
kubectl apply -f tutorial-storagebucket-us-central1.yaml
Verifica que Config Connector haya creado el segmento de Cloud Storage:
gcloud storage ls | grep tutorial
El resultado debería ser similar al siguiente:
gs://tutorial-us-central1-PROJECT_ID/
Este resultado incluye
PROJECT_ID
, que es el ID de tu proyecto. Google CloudSi no ves este resultado, espera un minuto y vuelve a realizar el paso.
Crear una política
Una política de Policy Controller consta de una plantilla de restricción y una restricción. La plantilla de restricciones contiene la lógica de la política. La restricción especifica dónde se aplica la política y los parámetros de entrada de la lógica de la política.
En Cloud Shell, crea una plantilla de restricción que limite las ubicaciones de los segmentos de 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
Aplica la plantilla para crear el segmento de Cloud Storage:
kubectl apply -f tutorial-storagebucket-location-template.yaml
Crea una restricción que solo permita los contenedores de las regiones de Singapur y Yakarta (
asia-southeast1
yasia-southeast2
). La restricción se aplica al espacio de nombres que has creado anteriormente. Exime al segmento de Cloud Storage predeterminado de 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
Para limitar las zonas en las que pueden existir los contenedores, aplica la siguiente restricción:
kubectl apply -f tutorial-storagebucket-location-constraint.yaml
Verificar la política
Crea un manifiesto que represente un segmento de Cloud Storage en una ubicación no 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
Para crear el segmento de Cloud Storage, aplica el manifiesto:
kubectl apply -f tutorial-storagebucket-us-west1.yaml
El resultado debería ser similar al siguiente:
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"]
Opcional: Puedes ver un registro de la decisión de denegar la solicitud en los registros de auditoría de Cloud. Consulta los registros de actividad de administración de tu proyecto:
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'
El resultado debería ser similar al siguiente:
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'
El campo
methodName
muestra la operación que se ha intentado, el camporesourceName
muestra el nombre completo del recurso de Config Connector y la secciónstatus
muestra que la solicitud no se ha completado correctamente, con el código de error7
y el mensajeForbidden
.Crea un manifiesto que represente un segmento de Cloud Storage en una ubicación 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
Para crear el segmento de Cloud Storage, aplica el manifiesto:
kubectl apply -f tutorial-storagebucket-asia-southeast1.yaml
El resultado debería ser similar al siguiente:
storagebucket.storage.cnrm.cloud.google.com/tutorial-asia-southeast1-PROJECT_ID created
Este resultado incluye
PROJECT_ID
, que es el ID de tu proyecto. Google CloudComprueba que Config Connector haya creado el segmento de Cloud Storage:
gcloud storage ls | grep tutorial
El resultado debería ser similar al siguiente:
gs://tutorial-asia-southeast1-PROJECT_ID/ gs://tutorial-us-central1-PROJECT_ID/
Si no ves este resultado, espera un minuto y vuelve a realizar este paso.
Restricciones de auditoría
El controlador de auditoría de Policy Controller evalúa periódicamente los recursos en función de sus restricciones. El controlador detecta infracciones de políticas en los recursos creados antes de la restricción y en los recursos creados fuera de Config Connector.
En Cloud Shell, consulta las infracciones de todas las restricciones que usen la plantilla de restricción
GCPStorageLocationConstraintV1
:kubectl get gcpstoragelocationconstraintv1 -o json \ | jq '.items[].status.violations'
El resultado debería ser similar al siguiente:
[ { "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" } ]
Verás el segmento de Cloud Storage que has creado
us-central1
antes de crear la restricción.
Validar recursos durante el desarrollo
Durante el desarrollo y las compilaciones de integración continua, es útil validar los recursos con respecto a las restricciones antes de aplicarlos al clúster de GKE. La validación proporciona comentarios rápidos y te permite descubrir problemas con los recursos y las restricciones en una fase temprana. En estos pasos se muestra cómo validar recursos con kpt. La herramienta de línea de comandos kpt te permite gestionar y aplicar manifiestos de recursos de Kubernetes.
En Cloud Shell, ejecuta la
gatekeeper
función KRM con kpt:kpt fn eval . --image=gcr.io/kpt-fn/gatekeeper:v0.2 --truncate-output=false
Una función de KRM es un programa que puede mutar o validar recursos de Kubernetes almacenados en el sistema de archivos local como archivos YAML. La función
gatekeeper
KRM valida los recursos de los segmentos de Cloud Storage de Config Connector con la política de Gatekeeper. La funcióngatekeeper
KRM se empaqueta como una imagen de contenedor disponible en Artifact Registry.La función informa de que los archivos de manifiesto de los segmentos de Cloud Storage de las regiones
us-central1
yus-west1
infringen la restricción.El resultado debería ser similar al siguiente:
[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
Validar recursos creados fuera de Config Connector
Puedes validar los recursos que se hayan creado fuera de Config Connector exportándolos. Google Cloud Después de exportar los recursos, utilice una de las siguientes opciones para evaluar sus políticas de Policy Controller en comparación con los recursos exportados:
Valida los recursos con la función
gatekeeper
de KRM.Importa los recursos en Config Connector.
Para exportar los recursos, utilice Inventario de Recursos de Cloud.
En Cloud Shell, habilita la API Cloud Asset:
gcloud services enable cloudasset.googleapis.com
Elimina los archivos de manifiesto de recursos de Kubernetes de los contenedores de Cloud Storage en
us-central1
yus-west1
:rm tutorial-storagebucket-us-*.yaml
Exporta todos los recursos de Cloud Storage de tu proyecto actual y almacena el resultado en un archivo llamado
export.yaml
:gcloud beta resource-config bulk-export \ --project $GOOGLE_CLOUD_PROJECT \ --resource-format krm \ --resource-types StorageBucket > export.yaml
El resultado debería ser similar al siguiente:
Exporting resource configurations to stdout... Export complete.
Crea un flujo de procesamiento de kpt encadenando funciones de KRM. Esta canalización valida los recursos del directorio actual con la política de ubicación del segmento de 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
Los recursos exportados no tienen ningún valor para el atributo de metadatos
namespace
. Esta canalización usa una función de KRM llamadaset-namespace
para definir el valornamespace
de todos los recursos.El resultado es similar al siguiente y muestra infracciones de los recursos que ha exportado:
[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
Si tu proyecto de Google Cloud contiene segmentos de Cloud Storage que creaste antes de empezar este tutorial y su ubicación infringe la restricción, los segmentos creados anteriormente aparecerán en el resultado.
Enhorabuena, has configurado correctamente una política que rige la ubicación permitida de los segmentos de Cloud Storage. El tutorial se ha completado. Ahora puedes seguir añadiendo tus propias políticas para otros recursos de Google Cloud.
Solución de problemas
Si Config Connector no crea los recursos esperados, Google Cloud usa el siguiente comando en Cloud Shell para ver los registros del gestor de controladores de 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
Si Policy Controller no aplica las políticas correctamente, usa el siguiente comando para ver los registros del gestor de controladores:
kubectl logs deployment/gatekeeper-controller-manager \
--namespace gatekeeper-system
Si Policy Controller no informa de infracciones en el campo status
de los objetos de restricción, consulta los registros del controlador de auditoría
con este comando:
kubectl logs deployment/gatekeeper-audit --namespace gatekeeper-system
Si tienes otros problemas con este tutorial, te recomendamos que consultes estos documentos: