Solucionar problemas de webhooks de Google Distributed Cloud

En esta página se explica cómo solucionar problemas con webhooks problemáticos o no seguros en Google Distributed Cloud.

Tipos de webhooks problemáticos

Los webhooks de admisión, o webhooks en Kubernetes, son un tipo de controlador de admisión que se puede usar en clústeres de Kubernetes para validar o mutar solicitudes al plano de control antes de que se conserven. Es habitual que las aplicaciones de terceros usen webhooks que operan en recursos y espacios de nombres críticos para el sistema. Los webhooks configurados incorrectamente pueden afectar al rendimiento y la fiabilidad del plano de control. Por ejemplo, un webhook configurado incorrectamente creado por una aplicación de terceros podría impedir que Google Distributed Cloud cree y modifique recursos en el espacio de nombres kube-system gestionado, lo que podría reducir la funcionalidad del clúster.

Entre los webhooks problemáticos se incluyen los siguientes tipos:

Webhooks que no tienen endpoints disponibles

Si un webhook no tiene ningún endpoint disponible, el servicio que lo respalda tiene uno o varios pods que no se están ejecutando. Para que los endpoints de webhook estén disponibles, sigue las instrucciones para encontrar y solucionar problemas con los pods del servicio que respalda este endpoint de webhook:

  1. Busca los pods de servicio del servicio asociado al webhook. Ejecuta el siguiente comando para describir el servicio:

    kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
    

    Haz los cambios siguientes:

    • SERVICE_NAME con el nombre del Servicio.
    • SERVICE_NAMESPACE con el nombre del espacio de nombres.

    Si no encuentras el nombre del servicio en el webhook, es posible que el endpoint no esté disponible debido a una discrepancia entre el nombre que aparece en la configuración y el nombre real del servicio. Para solucionar el problema de disponibilidad del endpoint, actualiza el nombre del servicio en la configuración del webhook para que coincida con el objeto de servicio correcto.

  2. Inspecciona los pods de servicio de este servicio. Identifica qué pods no están en ejecución mostrando el Deployment:

    kubectl get deployment -n SERVICE_NAMESPACE
    

    También puedes ejecutar el siguiente comando para enumerar los pods:

    kubectl get pods -n SERVICE_NAMESPACE -o wide
    

    En el caso de los pods que no se estén ejecutando, inspecciona los registros de los pods para ver por qué no se están ejecutando.

Webhooks que se consideran no seguros

Si un webhook intercepta algún recurso de espacios de nombres gestionados por el sistema, te recomendamos que actualices los webhooks para evitar que intercepten estos recursos.

  1. Inspecciona la configuración del webhook. Ejecuta el siguiente comando kubectl para obtener la configuración del webhook:

    kubectl get validatingwebhookconfigurations CONFIGURATION_NAME -o yaml
    

    Sustituye CONFIGURATION_NAME por el nombre de la configuración del webhook.

    Si este comando no devuelve nada, vuelve a ejecutarlo y sustituye validatingwebhookconfigurations por mutatingwebhookconfigurations.

    En la sección webhooks del resultado, se muestran uno o varios webhooks.

  2. Edita la configuración en función del motivo por el que se considera que el webhook no es seguro:

    Excluir los espacios de nombres kube-system y kube-node-lease

    Un webhook se considera inseguro si scope es * o si el ámbito es Namespaced y se cumple alguna de las siguientes condiciones:

    • La condición operator es NotIn y values omite kube-system y kube-node-lease, como en el siguiente ejemplo:

      webhooks:
      - admissionReviewVersions:
        ...
        namespaceSelector:
          matchExpressions:
          - key: kubernetes.io/metadata.name
            operator: NotIn
            values:
            - blue-system # add 'kube-system' and 'kube-node-lease' if `NotIn`
        objectSelector: {}
        rules:
        - apiGroups:
          ...
          scope: '*' # 'Namespaced'
        sideEffects: None
        timeoutSeconds: 3
      

      Asegúrate de que scope esté configurado como Namespaced y no como * para que el webhook solo funcione en espacios de nombres específicos. Asegúrate de que, si operator es NotIn, kube-system y kube-node-lease se incluyan en values.

    • La condición operator es In y values incluye kube-system y kube-node-lease, como en el siguiente ejemplo:

      namespaceSelector:
          matchExpressions:
          - key: kubernetes.io/metadata.name
            operator: In
            values:
            - blue-system
            - kube-system # remove as operator is `In`
            - kube-node-lease # remove as operator is `In`
      

      Asegúrate de que scope esté configurado como Namespaced y no como * para que el webhook solo funcione en espacios de nombres específicos. Asegúrate de que, si operator es In, kube-system y kube-node-lease no se incluyan en values.

    Excluir recursos coincidentes

    Un webhook también se considera no seguro si nodes, tokenreviews, subjectaccessreviews o certificatesigningrequests se incluyen en resources, como en el siguiente ejemplo:

    - admissionReviewVersions:
    ...
        resources:
        - 'pods' # keep, remove everything else
        - 'nodes'
        - 'tokenreviews'
        - 'subjectacessreviews'
        - 'certificatesigningrequests'
        scope: '*'
      sideEffects: None
      timeoutSeconds: 3
    

    Quita nodes, tokenreviews, subjectaccessreviews y certificatesigningrequests de la sección de recursos.

Siguientes pasos

Si necesitas más ayuda, ponte en contacto con el servicio de atención al cliente de Cloud. También puedes consultar la sección Obtener asistencia para obtener más información sobre los recursos de asistencia, incluidos los siguientes:

  • Requisitos para abrir un caso de asistencia.
  • Herramientas para ayudarte a solucionar problemas, como la configuración de tu entorno, los registros y las métricas.
  • Componentes admitidos.