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 condiciones match 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 y kinds es una lista de tipos que coinciden. Mediante "*", se realizan coincidencias con todo. Si al menos una entrada apiGroup y una entrada kind coinciden, se cumple la condición kinds.
    • 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:

  1. En la consola de Google Cloud, ve a la página Política de GKE Enterprise en la sección Funciones.

    Ir a la política

  2. En la pestaña Configuración, en la tabla del clúster, selecciona Editar en la columna Editar configuración.

  3. Desplázate hacia abajo y expande el menú Edit Policy Controller configuration.

  4. Selecciona la casilla de verificación Habilitar plantillas de restricciones que hacen referencia a objetos distintos del objeto que se está evaluando.

  5. Selecciona Guardar cambios.

Controlador de políticas de gcloud

Para habilitar la compatibilidad con restricciones referenciales, ejecuta el siguiente comando:

gcloud alpha 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:

  1. En la consola de Google Cloud, ve a la página Política de GKE Enterprise en la sección Funciones.

    Ir a la política

  2. En la pestaña Configuración, en la tabla del clúster, selecciona Editar en la columna Editar configuración.

  3. Desplázate hacia abajo y expande el menú Edit Policy Controller configuration.

  4. Desmarca la casilla de verificación Habilitar plantillas de restricciones que hacen referencia a objetos distintos del objeto que se está evaluando.

  5. Selecciona Guardar cambios.

Controlador de políticas de gcloud

Para inhabilitar la compatibilidad con restricciones referenciales, ejecuta el siguiente comando:

gcloud alpha 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:

  1. En la consola de Google Cloud, ve a la página Política de GKE Enterprise en la sección Funciones.

    Ir a la política

  2. En la pestaña Configuración, en la tabla del clúster, selecciona Editar en la columna Editar configuración.

  3. En el menú Agregar o editar paquetes de políticas, desactiva la biblioteca de plantillas y todos los paquetes de políticas .

  4. Selecciona Guardar cambios.

Controlador de políticas de gcloud

Para inhabilitar la biblioteca de plantillas de restricciones, ejecuta el siguiente comando:

gcloud alpha 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:

  1. En la consola de Google Cloud, ve a la página Política de GKE Enterprise en la sección Funciones.

    Ir a la política

  2. En la pestaña Configuración, en la tabla del clúster, selecciona Editar en la columna Editar configuración.

  3. En el menú Agregar o editar paquetes de políticas, activa la biblioteca de plantillas en . También puedes habilitar cualquiera o todos los paquetes de políticas.

  4. Selecciona Guardar cambios.

Controlador de políticas de gcloud

Para restablecer la biblioteca de plantillas de restricciones, ejecuta el siguiente comando:

gcloud alpha 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?