Solucionar problemas de webhook de GKE en AWS

Esta página le muestra cómo resolver problemas con webhooks problemáticos o inseguros en GKE en AWS.

Si necesita ayuda adicional, comuníquese con Atención al cliente de 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 modificar solicitudes al plano de control antes de que se persistan. Es común que las aplicaciones de terceros usen webhooks que operan en recursos y espacios de nombres críticos para el sistema. Los webhooks mal configurados pueden afectar el rendimiento y la confiabilidad del plano de control. Por ejemplo, un webhook mal configurado creado por una aplicación de terceros podría impedir que GKE en AWS cree y modifique recursos en el espacio de nombres kube-system administrado, lo que podría degradar la funcionalidad del clúster.

Los webhooks problemáticos incluyen los siguientes tipos:

Webhooks que no tienen puntos finales disponibles

Si un webhook no tiene puntos de conexión disponibles, el servicio que lo respalda tiene uno o más pods que no se están ejecutando. Para que los puntos de conexión del webhook estén disponibles, siga las instrucciones para encontrar y solucionar los problemas de los pods del servicio que lo respalda:

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

    kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
    

    Reemplace lo siguiente:

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

    Si no encuentra el nombre del servicio en el webhook, la indisponibilidad del punto de conexión podría deberse a una discrepancia entre el nombre indicado en la configuración y el nombre real del servicio. Para solucionar la disponibilidad del punto de conexión, actualice el nombre del servicio en la configuración del webhook para que coincida con el objeto de servicio correcto.

  2. Inspeccione los pods que sirven este servicio. Identifique los pods que no se están ejecutando enumerando la implementación:

    kubectl get deployment -n SERVICE_NAMESPACE
    

    O bien, ejecute el siguiente comando para enumerar los Pods:

    kubectl get pods -n SERVICE_NAMESPACE -o wide
    

    Para cualquier Pod que no se esté ejecutando, inspeccione los registros del Pod para ver por qué no se está ejecutando.

Webhooks que se consideran inseguros

Si un webhook intercepta algún recurso en los espacios de nombres administrados por el sistema, le recomendamos que actualice los webhooks para evitar interceptar estos recursos.

  1. Inspeccione la configuración del webhook. Ejecute el siguiente comando kubectl para obtener la configuración del webhook:

    kubectl get validatingwebhookconfigurations CONFIGURATION_NAME -o yaml
    

    Reemplace CONFIGURATION_NAME con el nombre de la configuración del webhook.

    Si este comando no devuelve nada, ejecútelo nuevamente y reemplace validatingwebhookconfigurations con mutatingwebhookconfigurations .

    En la sección webhooks de la salida, se enumeran uno o más webhooks.

  2. Edite la configuración, dependiendo del motivo por el cual el webhook se considera inseguro:

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

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

    • La condición operator es NotIn y values omiten 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úrese de que el scope esté configurado como Namespaced y no * para que el webhook solo funcione en espacios de nombres específicos. Asegúrese de que, si operator es NotIn , kube-system y kube-node-lease estén incluidos en values .

    • La condición operator es In y values incluyen 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úrese de que el scope esté configurado como Namespaced y no como * para que el webhook solo funcione en espacios de nombres específicos. Asegúrese 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 inseguro si nodes , tokenreviews , subjectaccessreviews o certificatesigningrequests se enumeran en recursos, como en el siguiente ejemplo:

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

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

¿Qué sigue?

Si necesita ayuda adicional, comuníquese con Atención al cliente de Cloud .