Usa la biblioteca de plantillas de restricciones
En esta página, se muestra cómo definir las restricciones del controlador de políticas mediante las plantillas de restricciones preexistentes que proporciona Google.
El controlador de políticas te permite aplicar una política para un clúster de Kubernetes mediante la definición de uno o más objetos de restricción. Después de instalar una restricción, las solicitudes al servidor de la API se comparan con la restricción y se rechazan si no la cumplen. Los recursos preexistentes que no cumplan con esta se informarán en el tiempo de auditoría.
Cada restricción está respaldada por una plantilla de restricciones que define el esquema y la lógica de la restricción. Las plantillas de restricciones se pueden obtener de Google y de terceros, o bien puedes escribirlas por tu cuenta. Para obtener más información sobre la creación de plantillas nuevas, consulta Escribe una plantilla de restricciones.
Antes de comenzar
Examina la biblioteca de plantillas de restricciones
Cuando defines una restricción, debes especificar la plantilla de restricciones que extiende. Una biblioteca de plantillas de restricciones comunes desarrolladas por Google se instala de forma predeterminada, y muchas organizaciones no necesitan crear plantillas de restricciones personalizadas directamente en Rego. Las plantillas de restricciones proporcionadas por Google tienen la etiqueta configmanagement.gke.io/configmanagement
.
Para enumerar las restricciones, usa el siguiente comando:
kubectl get constrainttemplates \ -l="configmanagement.gke.io/configmanagement=config-management"
Para describir una plantilla de restricciones y verificar los parámetros que requiere, usa el siguiente comando:
kubectl describe constrainttemplate CONSTRAINT_TEMPLATE_NAME
También puedes ver todas las plantillas de restricciones en la biblioteca.
Define una restricción
Debes definir una restricción con YAML y no necesitas comprender ni escribir Rego. En cambio, una restricción invoca una plantilla de restricciones y le proporciona parámetros específicos de la restricción.
Si usas un repositorio estructurado, te recomendamos crear las restricciones en el directorio cluster/
.
Las restricciones tienen los siguientes campos:
- El
kind
en minúsculas coincide con el nombre de una plantilla de restricciones. - El campo
metadata.name
es el nombre de la restricción. - El campo
match
define a qué objetos se aplica la restricción. Todas las condiciones especificadas deben coincidir antes de que un objeto esté dentro del alcance de una restricción. Las condicionesmatch
se definen mediante los siguientes subcampos:kinds
son los tipos de recursos a los que se aplica la restricción, determinados por dos campos:apiGroups
es una lista de grupos de API de Kubernetes que coinciden ykinds
es una lista de tipos que coinciden. Mediante "*", se realizan coincidencias con todo. Si al menos una entradaapiGroup
y una entradakind
coinciden, se cumple la condiciónkinds
.scope
acepta *, clúster o espacio de nombres, lo que determina si se seleccionan los recursos con alcance de clúster o espacio de nombres (el valor predeterminado es *).namespaces
es una lista de nombres de los espacios de nombres a los que puede pertenecer el objeto. El objeto debe pertenecer al menos a uno de estos espacios de nombres. Los recursos del espacio de nombres se tratan como si pertenecieran a sí mismos.excludedNamespaces
es una lista de espacios de nombres a los que el objeto no puede pertenecer.labelSelector
es un selector de etiquetas de Kubernetes con el que el objeto debe cumplir.namespaceSelector
es un selector de etiquetas en el espacio de nombres al que pertenece el objeto. Si el espacio de nombres no satisface el objeto, no coincidirá. Los recursos del espacio de nombres se tratan como si pertenecieran a sí mismos.
- El campo
parameters
define los argumentos para la restricción, en función de lo que espera la plantilla de restricciones.
La siguiente restricción, llamada ns-must-have-geo
, invoca una plantilla de restricciones llamada K8sRequiredLabels
, que se incluye en la biblioteca de plantillas de restricciones proporcionada por Google. La restricción define los parámetros que la plantilla de restricciones usa para evaluar si los espacios de nombres tienen la etiqueta geo
establecida en algún valor.
# ns-must-have-geo.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
name: ns-must-have-geo
spec:
match:
kinds:
- apiGroups: [""]
kinds: ["Namespace"]
parameters:
labels:
- key: "geo"
Para crear la restricción, usa kubectl apply -f
:
kubectl apply -f ns-must-have-geo.yaml
Audita una restricción
Si la restricción se configura y se instala de forma adecuada, su campo status.byPod[].enforced
se establece en true
, ya sea que la restricción esté configurada para aplicar o solo auditar la restricción.
Las restricciones se aplican de forma predeterminada y el incumplimiento de una restricción impide una operación de clúster determinada. Puedes establecer la spec.enforcementAction
de una restricción en dryrun
para informar los incumplimientos en el campo status.violations
sin impedir la operación.
Para obtener más información sobre cómo auditar, consulta Audita mediante el uso de restricciones.
Advertencias durante la sincronización de restricciones
Si sincronizas tus restricciones con una fuente de confianza con el Sincronizador de configuración o con otra herramienta de estilo GitOps, ten en cuenta las siguientes advertencias cuando sincronices restricciones.
Coherencia eventual
Puedes confirmar restricciones a una fuente de información, como un repositorio de Git, y limitar sus efectos con ClusterSelectors o NamespaceSelectors. Debido a que la sincronización es finalmente coherente, ten en cuenta las siguientes advertencias:
- Si una operación de clúster desencadena una restricción cuyo NamespaceSelector hace referencia a un espacio de nombres que no se haya sincronizado, la restricción se aplicará y se evitará la operación. En otras palabras, un espacio de nombres faltante “se cerrará en falla”.
- Si cambias las etiquetas de un espacio de nombres, puede que la memoria caché contenga datos desactualizados por un tiempo breve.
Minimiza la necesidad de cambiar el nombre de un espacio de nombres o sus etiquetas, y prueba las restricciones que afectan a un espacio de nombres con un cambio de nombre o de etiquetas para garantizar que funcionen como se espera.
Configura el controlador de políticas para restricciones referenciales
Antes de habilitar las restricciones referenciales, debes crear una configuración que le indique al controlador de políticas qué tipos de objetos mirar, como los espacios de nombres.
Guarda el siguiente manifiesto YAML en un archivo y aplícalo con kubectl
. El manifiesto configura el controlador de políticas para que supervise los espacios de nombres y los ingresos.
Crea una entrada con group
, version
y kind
en spec.sync.syncOnly
, con los valores de cada tipo de objeto que deseas ver.
apiVersion: config.gatekeeper.sh/v1alpha1
kind: Config
metadata:
name: config
namespace: "gatekeeper-system"
spec:
sync:
syncOnly:
- group: ""
version: "v1"
kind: "Namespace"
- group: "extensions"
version: "v1beta1"
kind: "Ingress"
Habilita las restricciones referenciales
Una restricción referencial hace referencia a otro objeto en su definición. Por ejemplo, podrías crear una restricción que requiera que los objetos de entrada en un clúster tengan nombres de host únicos. La restricción es referencial si tu plantilla de restricciones contiene la string data.inventory
en su Rego.
Las restricciones de referencia están habilitadas de forma predeterminada si instalas el controlador de políticas mediante Google Cloud Console. Si instalas el controlador de políticas con Google Cloud CLI, puedes elegir si deseas habilitar las restricciones referenciales cuando instalas el controlador de políticas. Solo se garantiza que las restricciones de referencia sean eventualmente coherentes, y esto crea riesgos:
En un servidor de API sobrecargado, el contenido de la memoria caché del controlador de políticas puede volverse obsoleto, lo que causaría una restricción referencial para "abrirse con errores", lo que significa que la acción de aplicación forzosa parece estar funcionando cuando no lo está. Por ejemplo, puedes crear entradas con nombres de host duplicados demasiado rápido como para permitir que el controlador de admisión detecte los duplicados.
El orden en el que se instalan las restricciones y el orden en el que se actualiza la memoria caché son aleatorios.
Puedes actualizar un clúster existente para permitir restricciones referenciales.
Console
Para inhabilitar las restricciones referenciales, completa los siguientes pasos:
- En la consola de Google Cloud, ve a la página Política de GKE Enterprise en la sección Administración de posturas.
- En la pestaña Configuración, en la tabla del clúster, selecciona Editar edit en la columna Editar configuración.
- Expande el menú Edit Policy Controller configuration.
- Selecciona la casilla de verificación Habilitar plantillas de restricciones que hacen referencia a objetos distintos del objeto que se está evaluando.
- Selecciona Guardar cambios.
Controlador de políticas de gcloud
Para habilitar la compatibilidad con restricciones referenciales, ejecuta el siguiente comando:
gcloud container fleet policycontroller update \
--memberships=MEMBERSHIP_NAME \
--referential-rules
Reemplaza MEMBERSHIP_NAME
por el nombre de la membresía del clúster registrado para habilitar las reglas referenciales. Puedes especificar varias membresías separadas por comas.
gcloud ConfigManagement
Para habilitar la compatibilidad con restricciones referenciales, establece policyController.referentialRulesEnabled
en true
en tu archivo config-management.yaml
:
apiVersion: configmanagement.gke.io/v1
kind: ConfigManagement
metadata:
name: config-management
namespace: config-management-system
spec:
clusterName: my-cluster
channel: dev
policyController:
enabled: true
referentialRulesEnabled: true
Inhabilitar restricciones referenciales
Cuando inhabilitas las restricciones referenciales, las plantillas que usan estas restricciones también se quitan del clúster, junto con las restricciones que usan esas plantillas.
Console
Las restricciones de referencia están habilitadas de forma predeterminada cuando instalas el controlador de políticas con la consola de Google Cloud. Para inhabilitar las restricciones referenciales, completa los siguientes pasos:
- En la consola de Google Cloud, ve a la página Política de GKE Enterprise en la sección Administración de posturas.
- En la pestaña Configuración, en la tabla del clúster, selecciona Editar edit en la columna Editar configuración.
- Expande el menú Edit Policy Controller configuration.
- Desmarca la casilla de verificación Habilitar plantillas de restricciones que hacen referencia a objetos distintos del objeto que se está evaluando.
- Selecciona Guardar cambios.
Controlador de políticas de gcloud
Para inhabilitar la compatibilidad con restricciones referenciales, ejecuta el siguiente comando:
gcloud container fleet policycontroller update \
--memberships=MEMBERSHIP_NAME \
--no-referential-rules
Reemplaza MEMBERSHIP_NAME
por el nombre de la membresía del clúster registrado para habilitar las reglas referenciales. Puedes especificar varias membresías separadas por comas.
gcloud ConfigManagement
Para inhabilitar las restricciones referenciales en un clúster, establece policyController.referentialRulesEnabled
en false
en el archivo config-management.yaml
:
apiVersion: configmanagement.gke.io/v1
kind: ConfigManagement
metadata:
name: config-management
namespace: config-management-system
spec:
clusterName: my-cluster
channel: dev
policyController:
enabled: true
referentialRulesEnabled: false
Enumera todas las restricciones
Para enumerar todas las restricciones instaladas en un clúster, usa el siguiente comando:
kubectl get constraint
También puedes ver una descripción general de las restricciones aplicadas en la consola de Google Cloud. Para obtener más información, consulta las métricas del controlador de políticas.
Quita una restricción
Si deseas encontrar todas las restricciones que usan una plantilla de restricciones, usa el siguiente comando para enumerar todos los objetos con el mismo kind
que metadata.name
de la plantilla de restricciones:
kubectl get CONSTRAINT_TEMPLATE_NAME
Para quitar una restricción, especifica su kind
y su name
:
kubectl delete CONSTRAINT_TEMPLATE_NAME CONSTRAINT_NAME
Cuando quitas una restricción, deja de aplicarse tan pronto como el servidor de API la marca como eliminada.
Quita todas las plantillas de restricciones
Console
Para inhabilitar la biblioteca de plantillas de restricciones, completa los siguientes pasos:
- En la consola de Google Cloud, ve a la página Política de GKE Enterprise en la sección Administración de posturas.
- En la pestaña Configuración, en la tabla del clúster, selecciona Editar edit en la columna Editar configuración.
- En el menú Agregar o editar paquetes de políticas, desactiva la biblioteca de plantillas y todos los paquetes de políticas do_not_disturb_on.
- Selecciona Guardar cambios.
Controlador de políticas de gcloud
Para inhabilitar la biblioteca de plantillas de restricciones, ejecuta el siguiente comando:
gcloud container fleet policycontroller content templates disable \
--memberships=MEMBERSHIP_NAME
Reemplaza MEMBERSHIP_NAME
por el nombre de la membresía del clúster registrado para inhabilitar la biblioteca de plantillas de restricciones. Puedes especificar varias membresías separadas por comas.
gcloud ConfigManagement
Establece spec.policyController.templateLibraryInstalled
en false
. Esto evita que el controlador de políticas, el Sincronizador de configuración y el controlador de configuración reinstalen automáticamente la biblioteca.
Para quitar todas las plantillas de restricciones y todas las restricciones, usa el siguiente comando:
kubectl delete constrainttemplate --all
Restablece la biblioteca de plantillas de restricciones
Console
Para habilitar la biblioteca de plantillas de restricciones, completa los siguientes pasos:
- En la consola de Google Cloud, ve a la página Política de GKE Enterprise en la sección Administración de posturas.
- En la pestaña Configuración, en la tabla del clúster, selecciona Editar edit en la columna Editar configuración.
- En el menú Agregar o editar paquetes de políticas, activa la biblioteca de plantillas en check_circle. También puedes habilitar cualquiera o todos los paquetes de políticas.
- Selecciona Guardar cambios.
Controlador de políticas de gcloud
Para restablecer la biblioteca de plantillas de restricciones, ejecuta el siguiente comando:
gcloud container fleet policycontroller content templates enable \
--memberships=MEMBERSHIP_NAME
Reemplaza MEMBERSHIP_NAME
por el nombre de la membresía del clúster registrado para habilitar la biblioteca de plantillas de restricciones. Puedes especificar varias membresías separadas por comas.
gcloud ConfigManagement
Si inhabilitaste la biblioteca de plantillas de restricciones o desinstalaste todas las plantillas de restricciones, puedes restablecerla si configuras spec.policyController.templateLibraryInstalled
como true
en la configuración del controlador de políticas, del Sincronizador de configuración y del controlador de configuración.
Para reiniciar el Pod del operador, usa el siguiente comando:
kubectl delete pod -n config-management-system -l k8s-app=config-management-operator
¿Qué sigue?
- Obtén más información sobre los paquetes de Policy Controller.
- Consulta la documentación de referencia de la biblioteca de plantillas de restricciones.
- Obtén más información sobre cómo crear restricciones personalizadas.
- Soluciona problemas del controlador de políticas.