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.
Objetivos
- Crea un clúster de GKE que incluya el complemento Config Connector.
- Instala Policy Controller.
- Crea una política para restringir las ubicaciones permitidas de los segmentos de Cloud Storage.
- Verifica que la política impida la creación de segmentos de Cloud Storage en ubicaciones no permitidas.
- Evalúa el cumplimiento de las políticas de la definición de los segmentos de Cloud Storage durante el desarrollo.
- Audita los segmentos de Cloud Storage para comprobar que cumplen las políticas.
Costes
En este documento, se utilizan los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costes basada en el uso previsto,
utiliza la calculadora de precios.
Antes de empezar
-
In the Google Cloud console, on the project selector page, select or create 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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, activate Cloud Shell.
En Cloud Shell, define el proyecto Google Cloud que quieras usar en este tutorial:
gcloud config set project PROJECT_ID
Sustituye
PROJECT_ID
por el Google Cloud ID del proyecto de tu proyecto. Cuando ejecutas este comando, Cloud Shell crea una variable de entorno exportada llamadaGOOGLE_CLOUD_PROJECT
que contiene tu ID de proyecto. Si no usas Cloud Shell, puedes crear la variable de entorno con este comando:export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)
Habilita la API de GKE:
gcloud services enable container.googleapis.com
Habilita la API Policy Controller:
gcloud services enable anthospolicycontroller.googleapis.com
Crea un directorio para almacenar los archivos creados en este tutorial:
mkdir -p ~/cnrm-gatekeeper-tutorial
Ve al directorio que has creado:
cd ~/cnrm-gatekeeper-tutorial
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.
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 tutor
ial"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_PROiam.gserviceaccount.comJECT." \ --role roles/stor
age.adminEn 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.workloadIde
ntityUserEste 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.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.
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 <St>orage bucket %v uses a disal<lo>wed 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 c<on>straint for Cloud Storage buc
ket %v", [bucketName]) } EOFAplica 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
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.meth
odName:"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 ha 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.
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.violatio
ns'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.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
Valida los recursos con la función
gatekeeper
de KRM.Importa los recursos en Config Connector.
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.
- In the Google Cloud console, go to the Manage resources page.
- If the project that you plan to delete is attached to an organization, expand the Organization list in the Name column.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
En Cloud Shell, elimina la restricción de ubicación del segmento de Cloud Storage:
kubectl delete -f tutorial-storagebucket-location-constraint.yaml
Añada la anotación
cnrm.cloud.google.com/force-destroy
con el valor de cadenatrue
a todos los recursosstoragebucket
del espacio de nombres gestionado por Config Connector:kubectl annotate storagebucket --all --namespace NAMESPACE \ cnrm.cloud.google.com/force-destroy=true
Esta anotación es una directiva que permite a Config Connector eliminar un segmento de Cloud Storage cuando eliminas el recurso
storagebucket
correspondiente en el clúster de GKE, incluso si el segmento contiene objetos.Elimina los recursos de Config Connector que representan los segmentos de Cloud Storage:
kubectl delete --namespace NAMESPACE storagebucket --all
Elimina el clúster de GKE:
gcloud container clusters delete CLUSTER_NAME \ --zone ZONE --async --quiet
Elimina el enlace de política de identidad de carga de trabajo en Gestión de identidades y accesos:
gcloud iam service-accounts remove-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.workloadIde
ntityUserElimina la vinculación del rol Administrador de Cloud Storage de la cuenta de servicio de Google:
gcloud projects remove-iam-policy-binding $GOOGLE_CLOUD_PROJECT \ --member "serviceAccount:SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROiam.gserviceaccount.comJECT." \ --role roles/stor
age.adminElimina la cuenta de servicio de Google que has creado para Config Connector:
gcloud iam service-accounts delete --quiet \ SERVICE_ACCOUNT_NAME@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
Crear un clúster de GKE
Configurar Config Connector
El proyecto en el que instalas Config Connector se conoce como proyecto host. Google Cloud 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
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
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.
Verificar la política
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.
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.
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:
Para exportar los recursos, utilice Inventario de Recursos de Cloud.
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:
Limpieza
Para evitar que los recursos utilizados en este tutorial se cobren en tu cuenta de Google Cloud, elimina el proyecto que contiene los recursos o conserva el proyecto y elimina los recursos.
Eliminar el proyecto
Eliminar los recursos
Si quieres conservar el Google Cloud proyecto que has usado en este tutorial, elimina los recursos.