Google Distributed Cloud 웹훅 문제 해결

이 페이지에서는 Google Distributed Cloud에서 문제가 있거나 안전하지 않은 웹훅 관련 문제를 해결하는 방법을 보여줍니다.

추가 지원이 필요하면 Cloud Customer Care에 문의하세요.

문제가 있는 웹훅 유형

Kubernetes의 허용 웹훅 또는 웹훅은 컨트롤 플레인에 대한 요청을 유지하기 전에 Kubernetes 클러스터에서 요청을 검증하거나 변형하는 데 사용할 수 있는 허용 컨트롤러의 한 유형입니다. 서드 파티 애플리케이션은 일반적으로 시스템에 중요한 리소스 및 네임스페이스에서 작동하는 웹훅을 사용합니다. 잘못 구성된 웹훅은 컨트롤 플레인 성능과 신뢰성에 영향을 줄 수 있습니다. 예를 들어 서드 파티 애플리케이션에서 만든 웹훅이 잘못 구성된 경우 Google Distributed Cloud에서 관리형 kube-system 네임스페이스에 리소스를 만들고 수정하지 못할 수 있으며 이로 인해 클러스터 기능이 저하될 수 있습니다.

문제가 있는 웹훅에는 다음 유형이 포함됩니다.

사용 가능한 엔드포인트가 없는 웹훅

웹훅에 사용 가능한 엔드포인트가 없으면 웹훅 엔드포인트를 지원하는 서비스에 실행되지 않고 있는 포드가 하나 이상 있습니다. 웹훅 엔드포인트를 사용하려면 안내에 따라 이 웹훅 엔드포인트를 지원하는 서비스의 포드를 찾아 문제를 해결합니다.

  1. 웹훅과 연결된 서비스의 서빙 포드를 찾습니다. 다음 명령어를 실행하여 서비스를 설명합니다.

    kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
    

    다음을 바꿉니다.

    • SERVICE_NAME: 서비스 이름
    • SERVICE_NAMESPACE: 네임스페이스 이름

    웹훅에 나열된 서비스 이름을 찾을 수 없는 경우 구성에 나열된 이름과 서비스의 실제 이름 간의 불일치로 인해 사용할 수 없는 엔드포인트가 생길 수 있습니다. 엔드포인트 가용성을 수정하려면 웹훅 구성의 서비스 이름이 올바른 서비스 객체와 일치하도록 업데이트합니다.

  2. 이 서비스의 서빙 포드를 검사합니다. 배포를 나열하여 실행되지 않고 있는 포드를 식별합니다.

    kubectl get deployment -n SERVICE_NAMESPACE
    

    또는 다음 명령어를 실행하여 포드를 나열합니다.

    kubectl get pods -n SERVICE_NAMESPACE -o wide
    

    실행되지 않고 있는 포드의 경우 포드 로그를 검사하여 포드가 실행되지 않고 있는 이유를 확인합니다.

안전하지 않다고 간주되는 웹훅

웹훅이 시스템 관리형 네임스페이스의 리소스를 가로채는 경우에는 이러한 리소스가 가로채기되지 않도록 웹훅을 업데이트하는 것이 좋습니다.

  1. 웹훅 구성을 검사합니다. 다음 kubectl 명령어를 실행하여 웹훅 구성을 가져옵니다.

    kubectl get validatingwebhookconfigurations CONFIGURATION_NAME -o yaml
    

    CONFIGURATION_NAME을 웹훅 구성 이름으로 바꿉니다.

    이 명령어에서 아무것도 반환하지 않으면 validatingwebhookconfigurationsmutatingwebhookconfigurations로 바꿔 명령어를 다시 실행합니다.

    출력의 webhooks 섹션에 웹훅이 하나 이상 나열됩니다.

  2. 웹훅이 안전하지 않다고 간주되는 이유에 따라 구성을 수정합니다.

    kube-system 및 kube-node-lease 네임스페이스 제외

    scope*이거나 범위가 Namespaced이고 다음 조건 중 하나가 해당되는 경우에 웹훅이 안전하지 않다고 간주됩니다.

    • 다음 예시와 같이 operator 조건은 NotIn이고 valueskube-systemkube-node-lease를 생략합니다.

      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
      

      웹훅이 특정 네임스페이스에서만 작동하도록 scope*가 아닌 Namespaced로 설정되어 있는지 확인합니다. operatorNotIn이면 kube-systemkube-node-leasevalues에 포함되어 있는지 확인합니다.

    • 다음 예시와 같이 operator 조건은 In이고 valueskube-systemkube-node-lease를 포함합니다.

      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`
      

      웹훅이 특정 네임스페이스에서만 작동하도록 scope*가 아닌 Namespaced로 설정되어 있는지 확인합니다. operatorIn이면 kube-systemkube-node-leasevalues에 포함되지 않아야 합니다.

    일치하는 리소스 제외

    다음 예시와 같이 nodes, tokenreviews, subjectaccessreviews 또는 certificatesigningrequests가 리소스 아래에 나열되면 웹훅이 안전하지 않다고 간주됩니다.

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

    리소스 섹션에서 nodes, tokenreviews, subjectaccessreviews, certificatesigningrequests를 삭제하세요.

다음 단계

추가 지원이 필요하면 Cloud Customer Care에 문의하세요.