Soluciona problemas del controlador de políticas

En esta página, se muestra cómo resolver problemas con el controlador de políticas.

Sugerencias generales

En la siguiente sección, se proporcionan consejos generales para resolver problemas relacionados con Policy Controller.

Detener el controlador de políticas

Si el controlador de políticas causa problemas en el clúster, puedes detener el controlador de políticas mientras investigas el problema.

Examina métricas

Examinar las métricas del controlador de políticas puede ayudarte a diagnosticar problemas con el controlador de políticas.

Verifique la instalación

Puedes verificar si el controlador de políticas y la biblioteca de plantillas de restricciones se instalaron correctamente.

Desconectar Policy Controller

En casos excepcionales, es posible que debas desconectar Policy Controller de los clústeres. Esto inhabilita por completo la administración de Policy Controller. Intenta detener temporalmente el controlador de políticas para ver si puedes resolver los problemas antes de usar el comando detach.

  1. Desconecta el controlador de políticas de tu flota:

    gcloud container fleet policycontroller detach
    
  2. Vuelve a adjuntar Policy Controller:

    gcloud container fleet policycontroller enable
    

No se pudo crear una plantilla de restricción

Si ves un error que menciona un disallowed ref, confirma que habilitaste las restricciones referenciales. Por ejemplo, si usas data.inventory en una plantilla de restricción sin habilitar primero las restricciones referenciales, el error es similar al siguiente:

admission webhook "validation.gatekeeper.sh" denied the request: check refs failed on module {templates["admission.k8s.gatekeeper.sh"]["MyTemplate"]}: disallowed ref data.inventory...

No se aplicó la restricción

En la siguiente sección, se proporciona orientación para solucionar problemas si sospechas o sabes que no se aplican las restricciones.

Verifica si se aplica la restricción

Si te preocupa que no se aplique tu restricción, puedes verificar el spec.status de tu restricción y la plantilla de restricciones. Para verificar el estado, ejecuta el siguiente comando:

kubectl describe CONSTRAINT_TEMPLATE_NAME CONSTRAINT_NAME

Reemplaza lo siguiente:

  • CONSTRAINT_TEMPLATE_NAME: es el nombre de la plantilla de restricciones que deseas verificar. Por ejemplo, K8sNoExternalServices
  • CONSTRAINT_NAME: es el Name de la restricción que deseas verificar.

    Si es necesario, ejecuta kubectl get constraint para ver qué plantillas y restricciones de restricciones están instaladas en tu sistema.

En el resultado del comando kubectl describe, toma nota de los valores en los campos metadata.generation y status.byPod.observedGeneration. En el siguiente ejemplo, estos valores se muestran en negrita:

Name:         no-internet-services
Namespace:
API Version:  constraints.gatekeeper.sh/v1beta1
Kind:         K8sNoExternalServices
Metadata:
  Creation Timestamp:  2021-12-03T19:00:06Z
  Generation:          1
  Managed Fields:
    API Version:  constraints.gatekeeper.sh/v1beta1
    Fields Type:  FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          f:config.k8s.io/owning-inventory:
          f:configmanagement.gke.io/cluster-name:
          f:configmanagement.gke.io/managed:
          f:configmanagement.gke.io/source-path:
          f:configmanagement.gke.io/token:
          f:configsync.gke.io/declared-fields:
          f:configsync.gke.io/git-context:
          f:configsync.gke.io/manager:
          f:configsync.gke.io/resource-id:
        f:labels:
          f:app.kubernetes.io/managed-by:
          f:configsync.gke.io/declared-version:
      f:spec:
        f:parameters:
          f:internalCIDRs:
    Manager:      configsync.gke.io
    Operation:    Apply
    Time:         2022-02-15T17:13:20Z
    API Version:  constraints.gatekeeper.sh/v1beta1
    Fields Type:  FieldsV1
    fieldsV1:
      f:status:
    Manager:         gatekeeper
    Operation:       Update
    Time:            2021-12-03T19:00:08Z
  Resource Version:  41460953
  UID:               ac80849d-a644-4c5c-8787-f73e90b2c988
Spec:
  Parameters:
    Internal CID Rs:
Status:
  Audit Timestamp:  2022-02-15T17:21:51Z
  By Pod:
    Constraint UID:       ac80849d-a644-4c5c-8787-f73e90b2c988
    Enforced:             true
    Id:                   gatekeeper-audit-5d4d474f95-746x4
    Observed Generation:  1
    Operations:
      audit
      status
    Constraint UID:       ac80849d-a644-4c5c-8787-f73e90b2c988
    Enforced:             true
    Id:                   gatekeeper-controller-manager-76d777ddb8-g24dh
    Observed Generation:  1
    Operations:
      webhook
  Total Violations:  0
Events:              <none>

Si ves todos los Pods del controlador de políticas con un valor observedGeneration igual al valor metadata.generation (que es el caso del ejemplo anterior), es probable que se aplique tu restricción. Sin embargo, si estos valores coinciden, pero todavía tienes problemas con la restricción que se aplica, consulta la siguiente sección para obtener sugerencias. Si notas que solo hay algunos valores que coinciden o que algunos Pods no aparecen en la lista, se desconoce el estado de la restricción. Es posible que la restricción se aplique de forma incoherente en los Pods del controlador de políticas o no se aplique en absoluto. Si no hay valores que coincidan, no se aplica la restricción.

No se aplica la restricción, pero se informan los resultados de auditoría

Si la verificación observedGeneration descrita en la sección anterior tenía valores coincidentes y hay resultados de auditoría informados en la restricción que muestran incumplimientos esperados (para los objetos preexistentes, no para las solicitudes entrantes), pero la restricción aún no se aplica, es probable que el problema esté relacionado con el webhook. Es posible que el webhook experimente uno de los siguientes problemas:

  • Es posible que el Pod del webhook del controlador de políticas no esté en funcionamiento. Las técnicas de depuración de Kubernetes pueden ayudarte a resolver problemas con el Pod del webhook.
  • Puede haber un firewall entre el servidor de la API y el servicio del webhook. Consulta la documentación de tu proveedor de firewall para obtener detalles sobre cómo corregir el firewall.

No se aplicó la restricción referencial

Si tu restricción es una restricción referencial, asegúrate de que los recursos necesarios se almacenen en caché. Si deseas obtener detalles sobre cómo almacenar en caché los recursos, consulta Configura el controlador de políticas para restricciones referenciales.

Verifica la sintaxis de la plantilla de restricciones

Si escribiste tu propia plantilla de restricciones y no se aplica, es posible que haya un error en la sintaxis de la plantilla de restricciones.

Puedes revisar la plantilla mediante el siguiente comando:

kubectl describe constrainttemplate CONSTRAINT_TEMPLATE_NAME

Reemplaza CONSTRAINT_TEMPLATE_NAME por el nombre de la plantilla que deseas investigar. Los errores deben informarse en el campo status.

¿Qué sigue?