En este documento, se explica cómo migrar tus políticas de admisión desde Policy Controller para reducir el riesgo de que se produzcan brechas en la aplicación de las políticas. Policy Controller dejará de estar disponible a partir del 12 de noviembre de 2026 y dejará de recibir asistencia el 31 de diciembre de 2027. En la versión 1.39 y posteriores, los clústeres de Google Kubernetes Engine (GKE) no admiten Policy Controller.
Puedes migrar las políticas de admisión que aplicas con Policy Controller a ValidatingAdmissionPolicies de Kubernetes o a Open Policy Agent (OPA) Gatekeeper autoadministrado. La migración no afecta las cargas de trabajo que ya se están ejecutando. Policy Controller evalúa las solicitudes para crear o actualizar recursos, por lo que quitarlo no reinicia ni cambia las cargas de trabajo en ejecución.
Este documento está dirigido a operadores y especialistas en seguridad que administran Policy Controller en una flota. Para obtener más información sobre los roles comunes y las tareas de ejemplo a las que hacemos referencia en el contenido deGoogle Cloud , consulta Roles y tareas comunes del usuario de GKE.
Actualizaciones bloqueadas a la versión 1.39 de GKE
GKE bloquea las actualizaciones a la versión 1.39 y posteriores para los clústeres que tienen instalado Policy Controller. Antes de actualizar un clúster a la versión 1.39, migra tus políticas y quita Policy Controller de ese clúster. No quites Policy Controller solo para desbloquear la actualización antes de migrar tus políticas, ya que, si lo haces, el clúster quedará sin aplicación de políticas.
Elige un reemplazo
Evalúa cada política de admisión en Policy Controller y elige una opción de reemplazo para esa política de la siguiente tabla. No es necesario que elijas un reemplazo para todo un clúster. Puedes combinar opciones en el mismo clúster según lo que requiera cada política:
| Opción | Cuándo usar | Operación y asistencia |
|---|---|---|
| ValidatingAdmissionPolicy (recomendado) | Son políticas que verifican un solo recurso cuando se crea o actualiza. La mayoría de las plantillas de la biblioteca de plantillas de Policy Controller funcionan de esta manera. | Las ValidatingAdmissionPolicies están integradas en Kubernetes y disponibles en GKE 1.30 y versiones posteriores sin costo adicional. La Atención al cliente de Cloud admite ValidatingAdmissionPolicies como parte de GKE. |
| Admisión de seguridad de Pods (recomendada para paquetes de seguridad de Pods) | Controles de seguridad de Pods predefinidos de los paquetes
pss-baseline-v2022, pss-restricted-v2022 o
psp-v2022. Para obtener más información, consulta
Usa la admisión de seguridad de Pods para los paquetes de seguridad
de Pods. |
La admisión de seguridad de Pods está integrada en Kubernetes y habilitada de forma predeterminada en GKE sin costo adicional. La Atención al cliente admite la admisión de seguridad de Pods como parte de GKE. |
| OPA Gatekeeper autoadministrado | Políticas que ValidatingAdmissionPolicies no puede expresar, como políticas de referencia que leen otros recursos del clúster, políticas que deseas mantener en Rego y auditorías de recursos existentes. También puedes agregar reglas de Common Expression Language (CEL) a las ConstraintTemplates de Gatekeeper para que este genere ValidatingAdmissionPolicies para la aplicación de políticas del servidor de la API, y su controlador de auditoría verifique los recursos existentes. | Instalas, actualizas y operas Gatekeeper. El equipo de Atención al cliente no admite Gatekeeper de código abierto. La comunidad de Gatekeeper proporciona asistencia a través de GitHub. |
Inventariar y clasificar tus políticas
De forma predeterminada, la biblioteca de plantillas de Policy Controller instala todas las plantillas, y
los paquetes de políticas instalan sus restricciones con la medida por incumplimiento dryrun.
Como resultado, las plantillas y las restricciones de un clúster no coinciden necesariamente con
las políticas que aplicas. Para averiguar qué aplicas, sigue estos
pasos:
Identifica los clústeres de tu flota que ejecutan Policy Controller:
gcloud container fleet policycontroller describe \ --project=PROJECT_IDReemplaza
PROJECT_IDpor el ID del proyecto host de tu flota.En cada clúster que identificaste, enumera tus restricciones:
kubectl get constraints \ -o custom-columns='KIND:.kind,NAME:.metadata.name,'\ 'ACTION:.spec.enforcementAction,VIOLATIONS:.status.totalViolations,'\ 'BUNDLE:.metadata.labels.policycontroller\.gke\.io/bundleName'En el resultado, se muestra la medida por incumplimiento de cada restricción, su recuento de incumplimientos de la auditoría más reciente y cualquier paquete que la haya instalado. Una restricción que no tiene valor en la columna
ACTIONusa la medida por incumplimientodenypredeterminada.Crea una copia de seguridad de tus ConstraintTemplates y restricciones en archivos separados:
kubectl get constrainttemplates -o yaml \ > policy-controller-templates-backup.yaml kubectl get constraints -o yaml \ > policy-controller-constraints-backup.yamlOpcional: Realiza las siguientes operaciones de copia de seguridad adicionales:
Si habilitaste las reglas de referencia en Policy Controller, crea una copia de seguridad de tu configuración de sincronización:
kubectl get config.config.gatekeeper.sh -n gatekeeper-system -o yaml \ > policy-controller-config-backup.yamlSi habilitaste la mutación en Policy Controller, crea una copia de seguridad de tus mutadores:
kubectl get assign,assignmetadata,assignimage,modifyset -o yaml \ > policy-controller-mutators-backup.yaml
Guarda estos archivos de copia de seguridad en un lugar seguro. Cuando quitas Policy Controller, se borran todas las ConstraintTemplates, restricciones, configuraciones de sincronización y mutadores del clúster, incluidos los que creaste. Necesitas las copias de seguridad para traducir o volver a crear tus políticas.
Después de crear una copia de seguridad de tus políticas, determina la ruta de migración para cada restricción. Para ello, verifica el tipo de restricción en la siguiente tabla:
| Tipo de restricción | Ruta de migración |
|---|---|
| Restricción de un solo recurso | Si una restricción evalúa campos solo en el recurso entrante
sin leer data.inventory ni pertenecer a un paquete de seguridad de Pod, usa una ValidatingAdmissionPolicy. |
Restricción dryrun no aplicada |
Si una restricción usa la medida por incumplimiento dryrun y
no planeas aplicarla, bórrala. |
| Restricción del paquete de seguridad de Pods | Si una restricción proviene del paquete pss-baseline-v2022,
pss-restricted-v2022 o psp-v2022,
usa la admisión de seguridad de Pods. Usa ValidatingAdmissionPolicies para cualquier
control que no abarque la admisión de seguridad de Pods. |
| Restricción referencial | Si una restricción usa una plantilla referencial que lee otros
recursos en el clúster, usa Gatekeeper autoadministrado. Para encontrar
plantillas referenciales, busca la referencia data.inventory en tu archivo de copia de seguridad. |
| Restricción de Cloud Service Mesh, Istio o Google Cloud | Revisa la restricción de forma individual para verificar si una función integrada
de GKE reemplaza la política o si la
ConstraintTemplate en tu archivo de copia de seguridad lee
data.inventory. La mayoría de estas plantillas solo verifican el
recurso entrante y funcionan en ValidatingAdmissionPolicies, excepto las plantillas
referenciales AsmAuthzPolicyDefaultDeny y
AsmPeerAuthnMeshStrictMtls, que requieren
Gatekeeper autoadministrado. Para los reemplazos integrados, habilita
la Autorización Binaria en lugar de usar la ConstraintTemplate
K8sRequireBinAuthZ y configura la imagen de nodo de tus grupos de nodos
en lugar de usar la ConstraintTemplate
K8sRequireCosNodeImage. |
Migra a ValidatingAdmissionPolicy
Un ValidatingAdmissionPolicy contiene la lógica de la política, como una ConstraintTemplate. Un ValidatingAdmissionPolicyBinding aplica la política, como una restricción. Un ValidatingAdmissionPolicy usa expresiones de CEL en lugar de Rego, y el servidor de la API evalúa las expresiones directamente, sin un webhook.
Ejemplo: Repositorios de imágenes permitidos
La siguiente restricción de Policy Controller requiere que los Pods usen imágenes de un
repositorio de Artifact Registry. Excluye el espacio de nombres kube-system:
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sAllowedRepos
metadata:
name: allowed-repos
spec:
enforcementAction: deny
match:
kinds:
- apiGroups: [""]
kinds: ["Pod"]
excludedNamespaces: ["kube-system"]
parameters:
repos:
- "us-docker.pkg.dev/example-project/example-repo/"
Los siguientes ValidatingAdmissionPolicy y ValidatingAdmissionPolicyBinding
aplican la misma regla. ValidatingAdmissionPolicyBinding usa las acciones Warn y
Audit para que puedas comparar los resultados antes de aplicar
ValidatingAdmissionPolicy:
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicy
metadata:
name: allowed-repos
spec:
failurePolicy: Fail
matchConstraints:
resourceRules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE", "UPDATE"]
resources: ["pods", "pods/ephemeralcontainers"]
variables:
- name: repos
expression: "['us-docker.pkg.dev/example-project/example-repo/']"
- name: images
expression: >-
object.spec.containers.map(c, c.image) +
(has(object.spec.initContainers) ?
object.spec.initContainers.map(c, c.image) : []) +
(has(object.spec.ephemeralContainers) ?
object.spec.ephemeralContainers.map(c, c.image) : [])
validations:
- expression: >-
variables.images.all(image,
variables.repos.exists(repo, image.startsWith(repo)))
messageExpression: >-
'container images must come from one of these repositories: ' +
variables.repos.join(', ')
reason: Forbidden
---
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingAdmissionPolicyBinding
metadata:
name: allowed-repos
spec:
policyName: allowed-repos
validationActions: ["Warn", "Audit"]
matchResources:
namespaceSelector:
matchExpressions:
- key: kubernetes.io/metadata.name
operator: NotIn
values: ["kube-system", "gatekeeper-system"]
En este ejemplo, la variable repos contiene el valor del campo parameters de la restricción. La expresión de validación muestra un valor true para los Pods
que cumplen con la ValidatingAdmissionPolicy, que es lo opuesto a una regla de incumplimiento
de Rego. Para reutilizar una ValidatingAdmissionPolicy en varios
ValidatingAdmissionPolicyBindings que proporcionan valores diferentes, usa un recurso de parámetro
en lugar de una variable. Para obtener más información sobre los recursos de parámetros,
consulta
Recursos de parámetros
en la documentación de Kubernetes.
En la siguiente tabla, se muestra cómo se asignan los campos de restricción a los campos ValidatingAdmissionPolicy y ValidatingAdmissionPolicyBinding:
| Campo de restricción | Campo ValidatingAdmissionPolicy o ValidatingAdmissionPolicyBinding |
|---|---|
spec.enforcementAction |
El campo validationActions en ValidatingAdmissionPolicyBinding, que asigna las acciones deny, warn y dryrun a los valores ["Deny"], ["Warn"] y ["Audit"] |
spec.parameters |
El campo variables en ValidatingAdmissionPolicy o
un recurso de parámetro al que hace referencia ValidatingAdmissionPolicyBinding
en el campo paramRef |
spec.match.kinds |
El campo matchConstraints.resourceRules en la
ValidatingAdmissionPolicy, que usa grupos de API y nombres de recursos, como
el recurso pods, en lugar de tipos |
spec.match.namespaces y
spec.match.excludedNamespaces |
El campo matchResources.namespaceSelector en el
ValidatingAdmissionPolicyBinding, con el operador In o
NotIn en la
etiqueta kubernetes.io/metadata.name |
spec.match.labelSelector |
El campo matchResources.objectSelector en ValidatingAdmissionPolicyBinding |
spec.match.namespaceSelector |
El campo matchResources.namespaceSelector en ValidatingAdmissionPolicyBinding |
spec.match.scope |
El campo scope de cada regla de recurso |
Para obtener más información sobre cómo escribir expresiones, consulta CEL en Kubernetes en la documentación de Kubernetes.
Prueba las políticas junto con Policy Controller
Para reemplazar una restricción sin una brecha en la aplicación, ejecuta la ValidatingAdmissionPolicy junto a la restricción antes de aplicar la ValidatingAdmissionPolicy:
- Aplica ValidatingAdmissionPolicy y ValidatingAdmissionPolicyBinding
que tenga el parámetro de configuración
validationActions: ["Warn", "Audit"]. Deja la restricción de Policy Controller en su lugar. - Compara los resultados con la consulta del registro de auditoría en Reemplaza los informes de incumplimiento. Si la ValidatingAdmissionPolicy marca las solicitudes que Policy Controller permite, o lo contrario, corrige la ValidatingAdmissionPolicy. Para las ValidatingAdmissionPolicies que coinciden con los Pods, no confíes en las advertencias. Los controladores crean los Pods para los Deployments y otras cargas de trabajo, por lo que el controlador recibe la advertencia.
- Después de que los resultados coincidan, cambia ValidatingAdmissionPolicyBinding para usar
el parámetro de configuración
validationActions: ["Deny"]. - Borra la restricción de Policy Controller.
Planifica para las diferencias de comportamiento
Las ValidatingAdmissionPolicies se comportan de manera diferente al Policy Controller de las siguientes maneras, lo que puede bloquear solicitudes o dejar brechas en la aplicación de políticas:
- Política de fallas: El webhook de Policy Controller falla, lo que significa
que el servidor de la API admite una solicitud si Policy Controller no responde.
Un ValidatingAdmissionPolicy que tiene el parámetro de configuración
failurePolicy: Failrechaza una solicitud si una expresión devuelve un error o excede el límite de costo de CEL. ValidatingAdmissionPolicy también rechaza una solicitud si no existe un recurso de parámetro al que se hace referencia y el valor del campoparamRef.parameterNotFoundActionen ValidatingAdmissionPolicyBinding esDeny. Si el valor esAllow, el servidor de la API omite un recurso de parámetro faltante, sin importar el parámetro de configuraciónfailurePolicy. Prueba cada ValidatingAdmissionPolicy y elige valores para ambos campos. - Campos faltantes: Rego trata un campo faltante como si no hubiera un incumplimiento, pero CEL
devuelve un error. Antes de leer un campo opcional, usa la macro
has()para verificar si el campo existe. - Exenciones: Una ValidatingAdmissionPolicy no exime los espacios de nombres de forma predeterminada ni usa la etiqueta
admission.gatekeeper.sh/ignore. En los clústeres de GKE Standard, se aplica un ValidatingAdmissionPolicyBinding a cada espacio de nombres del clúster, incluidos los espacios de nombres del sistema, como el espacio de nombreskube-system, a menos que los excluyas en el campomatchResources.namespaceSelectordel ValidatingAdmissionPolicyBinding o en los camposmatchConstraints.namespaceSelectoromatchConditionsde la ValidatingAdmissionPolicy. En los clústeres de Autopilot, GKE excluye los espacios de nombres administrados automáticamente y rechaza las ValidatingAdmissionPolicies que coinciden con los recursosnodes,persistentVolumes,certificatesigningrequestsotokenreviews. Para obtener más información, consulta Medidas de seguridad de Autopilot de GKE. - Subrecursos: Policy Controller verifica las actualizaciones de Pods que agregan contenedores
efímeros. Para mantener esa cobertura, incluye el subrecurso
pods/ephemeralcontainersen tus reglas de recursos, como se hace en el ejemplo. - No hay auditoría de los recursos existentes: Una ValidatingAdmissionPolicy evalúa solo las solicitudes entrantes del servidor de la API. No informa los recursos existentes que incumplen una ValidatingAdmissionPolicy.
- Un mensaje para cada solicitud: Una ValidatingAdmissionPolicy informa la primera validación que falla, no cada incumplimiento.
Usa la admisión de seguridad de Pods para los paquetes de seguridad de Pods
Si usas los paquetes pss-baseline-v2022 o pss-restricted-v2022,
reemplaza el paquete por la admisión de seguridad de Pods en lugar de traducir cada
restricción. La admisión de seguridad de Pods usa el controlador de admisión PodSecurity
integrado de Kubernetes para aplicar reglas predefinidas de los
estándares de seguridad de Pods de Kubernetes
según las etiquetas de espacio de nombres. El paquete pss-baseline-v2022 corresponde al nivel baseline, y el paquete pss-restricted-v2022 corresponde al nivel restricted.
La admisión de seguridad de Pods no abarca todos los controles del paquete psp-v2022,
como las listas de entidades permitidas para rutas de host, usuarios, capacidades y sysctls. Usa
ValidatingAdmissionPolicies para esos controles. La admisión de seguridad de Pods tampoco
puede eximir imágenes específicas, como las restricciones de Policy Controller que usan el
parámetro exemptImages. GKE no admite la configuración de exenciones de la admisión de seguridad de Pods. Si necesitas excepciones, usa
ValidatingAdmissionPolicies para las políticas afectadas.
Para obtener más información sobre cómo configurar la admisión de seguridad de Pods, consulta Aplica políticas de seguridad predefinidas a nivel de Pods con PodSecurity.
Migra a OPA Gatekeeper autoadministrado
Elige Gatekeeper para las políticas que ValidatingAdmissionPolicies no puede expresar. Policy Controller se basa en Gatekeeper, por lo que tus ConstraintTemplates y restricciones usan las mismas APIs en Gatekeeper. Todas las plantillas de la biblioteca de plantillas de Policy Controller funcionan en Gatekeeper sin cambios en su lógica. Sin embargo, Gatekeeper usa un motor de Rego más nuevo y una validación más estricta que puede rechazar una ConstraintTemplate personalizada.
Cuando usas Gatekeeper autoadministrado, eres responsable de las tareas que Google Cloud realiza para Policy Controller, como instalar, actualizar, escalar y supervisar Gatekeeper en cada clúster. Atención al cliente no admite Gatekeeper de código abierto. Para obtener ayuda, usa la herramienta de seguimiento de errores de Gatekeeper en GitHub.
Gatekeeper no incluye la biblioteca de plantillas de Policy Controller ni los paquetes de políticas. Tus archivos de copia de seguridad contienen las ConstraintTemplates y las restricciones de tus clústeres. Para las plantillas que se originaron en la biblioteca de código abierto de Gatekeeper, puedes usar las plantillas de la biblioteca de políticas de Gatekeeper. Los nombres de las plantillas siguen siendo los mismos, pero los parámetros y los mensajes pueden variar entre las versiones.
Para mover las políticas a Gatekeeper, sigue estos pasos:
- Opcional: Si no puedes aceptar una brecha en la aplicación de políticas mientras reemplazas
Policy Controller, primero migra tus políticas más importantes a
ValidatingAdmissionPolicies. Asegúrate de que esos
ValidatingAdmissionPolicyBindings excluyan el espacio de nombres
gatekeeper-systempara que no bloqueen los trabajos de instalación de Gatekeeper. Después de quitar Policy Controller, tu clúster dejará de aplicar las políticas de Gatekeeper hasta que apliques las restricciones correspondientes de Gatekeeper. Los ValidatingAdmissionPolicies se siguen aplicando porque no dependen de Policy Controller ni de Gatekeeper. Si usas ConstraintTemplates personalizadas, prueba cada manifiesto de plantilla personalizada con la herramienta de línea de comandos de
gatorde la versión de Gatekeeper que planeas instalar:gator test --filename=TEMPLATE_FILEReemplaza
TEMPLATE_FILEpor la ruta de acceso al archivo de manifiesto de ConstraintTemplate. Antes de quitar Policy Controller, corrige cualquier ConstraintTemplate personalizada que Gatekeeper rechace.Si implementas restricciones desde un repositorio de Git con una herramienta de GitOps, prepara las ConstraintTemplates que usan tus restricciones y agrégalas al repositorio cuando instales Gatekeeper. De lo contrario, tus restricciones no se aplicarán después de quitar Policy Controller porque sus ConstraintTemplates ya no existen.
Quita Policy Controller siguiendo los pasos que se indican en Quita Policy Controller. No instales Gatekeeper en un clúster que aún ejecute Policy Controller. Ambos usan el espacio de nombres
gatekeeper-system, las mismas CustomResourceDefinitions y los mismos nombres de webhook.Instala Gatekeeper con Helm y la configuración que elijas de la tabla de la siguiente sección, Configuración de Gatekeeper que difiere de Policy Controller. Para obtener más información sobre cómo instalar Gatekeeper, consulta Instalación en la documentación de Gatekeeper.
En los clústeres de Autopilot, la instalación predeterminada del gráfico de Helm falla porque GKE rechaza las reglas de comodín en los webhooks de mutación. Establece el valor de Helm
disableMutation: trueo establece el valor de HelmmutatingWebhookCustomRulespara enumerar solo los recursos específicos a los que se orientan tus mutadores. No incluyas los recursosnodes,persistentvolumes,certificatesigningrequestsnitokenreviews.En tus archivos de copia de seguridad, quita los siguientes campos, etiquetas y anotaciones de cada recurso que planees volver a aplicar:
- El campo
status - Los campos
resourceVersion,uid,creationTimestamp,generation,managedFieldsyownerReferencesde la secciónmetadata. - La anotación
kubectl.kubernetes.io/last-applied-configuration - Es la etiqueta
app.kubernetes.io/managed-by: anthospolicycontroller.googleapis.com. Si Policy Controller se vuelve a habilitar en el clúster, por ejemplo, con una configuración predeterminada a nivel de la flota, administra los recursos que tienen esta etiqueta y puede modificarlos o borrarlos. - Etiquetas y anotaciones cuyas claves tienen el prefijo
policycontroller..
- El campo
Aplica las ConstraintTemplates que usan tus restricciones y, luego, verifica que Gatekeeper haya creado una CustomResourceDefinition para cada plantilla:
kubectl get constrainttemplates \ -o custom-columns='NAME:.metadata.name,CREATED:.status.created'Cuando cada plantilla muestre un valor
trueen la columnaCREATED, aplica tus restricciones.
Parámetros de configuración de Gatekeeper que difieren de Policy Controller
Antes de instalar Gatekeeper, revisa la configuración en la siguiente tabla, en la que los valores predeterminados del gráfico de Helm de Gatekeeper difieren de los de Policy Controller:
| Configuración | Configuración predeterminada de Policy Controller | Configuración predeterminada del gráfico de Helm de Gatekeeper | Recomendación |
|---|---|---|---|
| Mutación | Desactivado, a menos que lo hayas activado | Activado | Si no usas la mutación, establece el valor de Helm disableMutation: true. En los clústeres de Autopilot, debes establecer el valor de Helm disableMutation: true
o configurar el valor de Helm mutatingWebhookCustomRules
sin comodines ni recursos restringidos. Si no especificas uno de
estos valores, GKE rechazará la instalación. |
| Exime espacios de nombres | El espacio de nombres gatekeeper-system y los espacios de nombres de
tu lista exemptableNamespaces |
Es el espacio de nombres en el que se instala Gatekeeper. | Agrega tus espacios de nombres exentos al
valor de Helm controllerManager.exemptNamespaces. Gatekeeper
rechaza los cambios en los espacios de nombres que tienen la
etiqueta admission.gatekeeper.sh/ignore, a menos que esos espacios de nombres
estén exentos. |
| Datos de referencia | Se sincronizan automáticamente para los paquetes de referencia. | No sincronizada | Crea un Config o SyncSet de Gatekeeper que enumere los tipos que leen tus
plantillas de referencia. Hasta que esos tipos se sincronicen con el
objeto data.inventory, las verificaciones de conflictos permiten las solicitudes
infractoras, y las verificaciones de existencia, como la
ConstraintTemplate K8sRequireNamespaceNetworkPolicies, rechazan
todas las solicitudes coincidentes, incluso cuando existe el recurso requerido. |
| Generación de ValidatingAdmissionPolicy | No disponible | Activado para las plantillas que contienen código CEL | Las plantillas de Policy Controller solo contienen Rego, por lo que Gatekeeper
genera ValidatingAdmissionPolicies solo si agregas CEL a tus
ConstraintTemplates. Para mantener la aplicación de políticas en el webhook, configura los valores de Helm defaultCreateVAPForTemplates: false y defaultCreateVAPBindingForConstraints: false.
Para obtener más información, consulta
Integración en la política de admisión de validación de Kubernetes en la
documentación de Gatekeeper. |
| Réplicas y recursos | Una réplica para cada componente, con un límite de memoria de 1,024 MiB | Tres réplicas de webhook con diferentes límites de recursos | Configura el recuento de réplicas y los límites de recursos según tu uso actual. |
| Imágenes | Se extrae de un registro administrado por Google | Extraídas de Docker Hub (las imágenes openpolicyagent/gatekeeper,
openpolicyagent/gatekeeper-crds y
curlimages/curl) |
Para los clústeres privados o los clústeres que aplican la Autorización Binaria,
duplica las tres imágenes en Artifact Registry y anula sus valores de imagen
en el gráfico. Si no duplicas la imagen de curlimages/curl, inhabilita el trabajo de sondeo de webhook. |
De forma predeterminada, Gatekeeper solo expone las métricas de Prometheus, y sus nombres de métricas son diferentes de los nombres que Policy Controller envía a Cloud Monitoring. Actualiza los paneles y las alertas que usen métricas de Policy Controller.
Migra las políticas de mutación
Si habilitaste la mutación en Policy Controller, enumera tus mutadores:
kubectl get assign,assignmetadata,assignimage,modifyset
Para cada mutador, elige una de las siguientes opciones:
- MutatingAdmissionPolicy: Puedes usar una MutatingAdmissionPolicy en la versión 1.36 y posteriores de GKE. Al igual que una ValidatingAdmissionPolicy, una MutatingAdmissionPolicy usa expresiones de CEL y se ejecuta en el servidor de la API sin un webhook. Kubernetes ejecuta todas las MutatingAdmissionPolicies antes de las ValidatingAdmissionPolicies, por lo que debes probarlas juntas para asegurarte de que una mutación no haga que una ValidatingAdmissionPolicy rechace un manifiesto válido. En los clústeres de Autopilot, GKE excluye los espacios de nombres administrados de MutatingAdmissionPolicies. Para obtener más información sobre las políticas de mutación, consulta Política de admisión de mutación en la documentación de Kubernetes.
- Gatekeeper autoadministrado: En los clústeres de Standard, tus mutadores
funcionan sin cambios porque Gatekeeper activa la mutación de forma predeterminada. En
los clústeres de Autopilot, debes establecer el valor de Helm
mutatingWebhookCustomRulesen el gráfico de Gatekeeper para enumerar los recursos específicos a los que se dirigen tus mutadores en lugar de las reglas de comodín. Para obtener más información, consulta Medidas de seguridad de Autopilot de GKE. Después de instalar Gatekeeper, quita los metadatos de Policy Controller del archivo de copia de seguridad del mutador y vuelve a aplicar los mutadores, como lo haces con las restricciones.
Actualiza las verificaciones de políticas en las canalizaciones de compilación
Es posible que tu canalización de compilación verifique los manifiestos con las restricciones de Policy Controller
antes de la implementación. Por ejemplo, la canalización podría usar la
función gatekeeper en kpt o la herramienta de línea de comandos de gator. Para obtener más
información, consulta
Valida apps en función de las políticas de la empresa en una canalización de CI.
Si tu canalización verifica los manifiestos, actualízala para el reemplazo:
- Si usas Gatekeeper, puedes conservar tu canalización. Actualiza las rutas de acceso de archivos o
directorios en tu comando
gatorokptpara hacer referencia al repositorio o directorio que contiene los manifiestos de ConstraintTemplate y de restricción de Gatekeeper limpios. Si usas ValidatingAdmissionPolicies, esas herramientas no evalúan tus políticas. En su lugar, ejecuta una ejecución de prueba del servidor en un clúster de prueba que tenga tus ValidatingAdmissionPolicies y ValidatingAdmissionPolicyBindings que usen la acción
Deny:kubectl apply --dry-run=server -f MANIFEST_DIRECTORYReemplaza
MANIFEST_DIRECTORYpor el directorio que contiene tus manifiestos. El comando falla si una ValidatingAdmissionPolicy rechaza un manifiesto.
Reemplazar los informes de incumplimientos
Una ValidatingAdmissionPolicy no incluye un panel y no audita los recursos que ya existen en tu clúster. En su lugar, usa los siguientes métodos:
- Advertencias: Si un ValidatingAdmissionPolicyBinding usa la acción
Warn, el servidor de la API devuelve una advertencia al cliente que envió la solicitud, como la herramienta de línea de comandoskubectl. En el caso de los Pods que crea un controlador, como los Pods de un Deployment, el controlador recibe la advertencia. Registros de auditoría: Si un ValidatingAdmissionPolicyBinding usa la acción
Audit, el servidor de la API anota la entrada de registro de auditoría para cada validación con errores. GKE escribe solicitudes de creación, actualización y eliminación en los registros de auditoría de actividad del administrador en Cloud Logging. Para encontrar las validaciones con errores, ejecuta la siguiente consulta en el Explorador de registros:resource.type="k8s_cluster" logName:"cloudaudit.googleapis.com%2Factivity" labels."validation.policy.admission.k8s.io/validation_failure":*
Si usas restricciones que tienen la dryrun medida por incumplimiento como un informe de cumplimiento de los recursos existentes, ValidatingAdmissionPolicies no puede reemplazar ese informe. Mantén esas políticas en el Gatekeeper autoadministrado, cuyo
controlador de auditoría verifica los recursos existentes según un programa.
Quita Policy Controller
Antes de quitar Policy Controller de un clúster, completa las siguientes tareas:
- Confirma que se apliquen las políticas que migraste a ValidatingAdmissionPolicies o a la admisión de seguridad de Pods, y que tengas una copia de seguridad de tus ConstraintTemplates, restricciones y mutadores. Si quitas Policy Controller, se borrarán sus CustomResourceDefinitions, lo que borrará todas las ConstraintTemplates, restricciones y mutadores del clúster, incluidos los que creaste.
- Si implementas restricciones desde un repositorio de Git con una herramienta de GitOps, como el Sincronizador de configuración o Argo CD, quita las restricciones reemplazadas del repositorio. Confirma que se quitaron las restricciones de tus clústeres.
- Opcional: Para confirmar que nada depende del webhook de Policy Controller, suspende Policy Controller primero. La suspensión solo quita las configuraciones de webhook, y puedes restablecerlas.
Para quitar Policy Controller, sigue estos pasos:
Desinstala Policy Controller de tus clústeres:
gcloud container fleet policycontroller disable \ --memberships=MEMBERSHIP_NAME \ --project=PROJECT_IDReemplaza lo siguiente:
MEMBERSHIP_NAME: Es el nombre de la membresía del clúster registrado del que deseas desinstalar Policy Controller. Para desinstalar Policy Controller de varios clústeres, especifica una lista de nombres de membresía separados por comas o reemplaza la marca--memberships=MEMBERSHIP_NAMEpor la marca--all-memberships.PROJECT_ID: el ID del proyecto host de tu flota.
Confirma que Policy Controller haya terminado de desinstalarse de tus clústeres:
gcloud container fleet policycontroller describe \ --memberships=MEMBERSHIP_NAME \ --project=PROJECT_ID \ --format="yaml(membershipStates)"Espera hasta que el valor del campo
policycontroller.statede nivel superior de cada membresía seaNOT_INSTALLED, noDECOMMISSIONING. Las entradas individuales decomponentStatesalcanzan el estadoNOT_INSTALLEDantes de que finalice la limpieza de CustomResourceDefinition.Si planeas instalar Gatekeeper autoadministrado, confirma que el espacio de nombres
gatekeeper-systemya no exista:kubectl get namespace gatekeeper-systemEspera hasta que el resultado informe que no se encuentra el espacio de nombres
gatekeeper-system.Opcional: Para evitar que los clústeres que registres más adelante obtengan Policy Controller, quita la configuración predeterminada a nivel de la flota:
gcloud container fleet policycontroller enable \ --no-fleet-default-member-config \ --project=PROJECT_IDEste comando solo quita la configuración predeterminada. No instala Policy Controller en ningún clúster.
Quita Policy Controller de los clústeres fuera de una flota
El comando gcloud container fleet policycontroller disable quita
Policy Controller solo de los clústeres que administra la flota. Un clúster puede ejecutar
Policy Controller sin administración de flotas en los siguientes casos:
- Instalaste Policy Controller con el operador de ConfigManagement.
- Cancelaste el registro del clúster de su flota o ejecutaste el
comando
gcloud container fleet policycontroller detachantes de que Policy Controller terminara de desinstalarse.
Para quitar Policy Controller de estos clústeres, colócalos en la administración de flotas y, luego, desinstala Policy Controller:
- Crea una copia de seguridad de tus ConstraintTemplates, restricciones, configuración de sincronización y
mutadores, como se describe en
Crea un inventario y clasifica tus políticas. Cuando
limpies los metadatos de las copias de seguridad tomadas de una instalación del operador de ConfigManagement,
también quita las etiquetas
configmanagement.gke.io/*yk8s-app: kubernetes-config-management, además del campoownerReferencesy los metadatospolicycontroller.*. Si instalaste Policy Controller con el operador de ConfigManagement, quita el campo
policyControllerdel recurso personalizado de ConfigManagement en el clúster. Espera hasta que se complete la conciliación. La conciliación puede tardar alrededor de dos minutos. Luego, verifica si el espacio de nombresgatekeeper-systemaún existe:kubectl get namespace gatekeeper-systemEn la versión 1.17 y anteriores del operador de ConfigManagement, quitar el campo
policyControllerdesinstala Policy Controller automáticamente. Si no se encuentra el espacio de nombresgatekeeper-system, omite los pasos restantes de esta sección. En la versión 1.18 y posteriores del operador de ConfigManagement, el espacio de nombresgatekeeper-systempermanece en el clúster, por lo que debes continuar con el siguiente paso.Si el clúster no está registrado en una flota, regístralo. Para obtener más información, consulta Registra un clúster en Google Cloud en tu flota.
Verifica si la mutación está habilitada en el clúster:
kubectl get mutatingwebhookconfiguration \ gatekeeper-mutating-webhook-configurationHabilita Policy Controller en la membresía del clúster para que la flota asuma la administración de la instalación existente. Si el comando anterior devolvió el recurso
gatekeeper-mutating-webhook-configuration, incluye la marca--mutationpara que la flota adopte y, luego, quite los recursos de mutación con alcance de clúster:gcloud container fleet policycontroller enable \ --memberships=MEMBERSHIP_NAME \ --project=PROJECT_IDReemplaza lo siguiente:
MEMBERSHIP_NAME: Es el nombre de la membresía de tu clúster registrado.PROJECT_ID: el ID del proyecto host de tu flota.
Espera hasta que el valor del campo
policycontroller.statede la membresía seaACTIVE:gcloud container fleet policycontroller describe \ --memberships=MEMBERSHIP_NAME \ --project=PROJECT_ID \ --format="yaml(membershipStates)"Desinstala Policy Controller siguiendo los pasos que se indican en Quita Policy Controller. Si no instalas Gatekeeper autoadministrado, borra cualquier CustomResourceDefinition de restricción restante después de que se quite el espacio de nombres
gatekeeper-system:kubectl get crd -o name \ | grep '\.constraints\.gatekeeper\.sh$' \ | xargs -r kubectl deleteOpcional: Si registraste el clúster solo para completar este procedimiento, cancela el registro después de que el comando
describemuestre el estadoNOT_INSTALLEDpara la membresía. Para los clústeres que registraste con la marca--enable-fleet, ejecuta el comandogcloud container clusters updatecon la marca--clear-fleet-projecten lugar del comandogcloud container fleet memberships unregister. Para obtener más información, consulta Anula el registro de un clúster.
¿Qué sigue?
- Obtén información sobre la política de admisión de validación en la documentación de Kubernetes.
- Aprende a aplicar políticas de seguridad predefinidas a nivel de los Pods con PodSecurity.
- Lee la documentación de Gatekeeper.