웹훅을 사용할 때 제어 영역 안정성 보장


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

Google Kubernetes Engine(GKE)은 클러스터를 모니터링하고 추천자 서비스를 사용하여 플랫폼 사용량을 최적화하는 방법을 안내합니다. 클러스터의 안정성과 성능을 유지하려면 다음 시나리오에 대한 GKE의 권장사항을 참조하세요.

  • 작동하지만 사용 가능한 엔드포인트가 없는 웹훅
  • 시스템 중요 리소스 및 네임스페이스에서 작동할 때 안전하지 않은 것으로 간주되는 웹훅

이 가이드에서는 잘못 구성된 웹훅을 확인하고 필요한 경우 업데이트하는 방법을 확인할 수 있습니다.

통계 및 추천을 관리하는 방법에 대한 자세한 내용은 통계 및 추천으로 GKE 사용 최적화를 참조하세요.

클러스터에 영향을 줄 수 있는 잘못 구성된 웹훅 식별

클러스터 성능 및 안정성에 영향을 미칠 수 있는 웹훅을 식별하는 통계를 가져오려면 안내 및 권장사항 보기 안내를 따르세요. 다음과 같은 방법으로 통계를 확인할 수 있습니다.

  • Google Cloud 콘솔 사용하기
  • Google Cloud CLI 또는 Recommender API를 사용하여 하위 유형 K8S_ADMISSION_WEBHOOK_UNSAFEK8S_ADMISSION_WEBHOOK_UNAVAILABLE으로 필터링하기

통계를 통해 웹훅을 식별한 후 안내에 따라 감지된 웹훅 문제 해결을 수행합니다.

GKE가 잘못 구성된 웹훅을 감지하는 경우

GKE는 다음 기준 중 하나가 클러스터에 대해 true이면 통계 및 권장사항을 생성합니다.

감지된 웹훅 문제 해결

다음 섹션에는 GKE가 잘못 구성되었을 수 있는 웹훅의 문제 해결을 위한 안내가 포함되어 있습니다.

안내를 구현하고 웹훅이 올바르게 구성되면 24시간 이내에 권장사항이 해소되어 더 이상 콘솔에 표시되지 않습니다. 권장사항의 안내를 구현하고 24시간이 지나지 않았으면 권장사항을 해결됨으로 표시할 수 있습니다. 권장사항을 구현하지 않으려면 무시하기를 선택하세요.

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

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

  1. 통계 및 권장사항 보기를 통해 한 번에 한 통계씩 선택하여 문제를 해결합니다. GKE는 클러스터당 하나의 통계를 생성하고 조사해야 하는 손상된 엔드포인트가 있는 하나 이상의 웹훅을 나열합니다. 이러한 웹훅마다 통계는 서비스 이름, 손상된 엔드포인트, 엔드포인트가 마지막으로 호출된 시간도 명시합니다.

  2. 웹훅과 연결된 서비스의 제공 포드를 찾으세요.

    콘솔

    통계의 사이드바 패널에서 잘못 구성된 웹훅 테이블을 참조하세요. 서비스 이름을 클릭합니다.

    kubectl

    다음 명령어를 실행하여 서비스를 설명합니다.

    kubectl describe svc SERVICE_NAME -n SERVICE_NAMESPACE
    

    SERVICE_NAMESERVICE_NAMESPACE를 각각 서비스의 이름과 네임스페이스로 바꿉니다.

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

  3. 이 서비스의 제공 포드를 검사합니다.

    콘솔

    서비스 세부정보제공 포드에서 이 서비스를 지원하는 포드 목록을 확인하세요.

    kubectl

    배포 또는 포드를 나열하여 실행 중이 아닌 포드를 식별합니다.

    kubectl get deployment -n SERVICE_NAMESPACE
    

    또는 다음 명령어를 실행합니다.

    kubectl get pods -n SERVICE_NAMESPACE -o wide
    

    실행 중이 아닌 포드의 경우 포드 로그를 검사하여 포드가 실행 중이 아닌 이유를 확인합니다. 포드와 관련된 일반적인 문제에 대한 안내는 배포된 워크로드 문제 해결을 참조하세요.

안전하지 않은 것으로 간주되는 웹훅

웹훅이 시스템 관리 네임스페이스의 리소스 또는 특정 유형의 리소스를 가로채는 경우 GKE는 이를 안전하지 않은 것으로 간주하여 이들 리소스를 가로채지 않도록 웹훅을 업데이트하도록 권장합니다.

  1. 안내에 따라 통계 및 권장사항 보기를 통해 한 번에 하나의 통계를 선택하여 문제를 해결합니다. GKE는 클러스터당 하나의 통계만 생성하며 이 통계는 하나 이상의 웹훅 구성을 나열하며 각 구성은 웹훅을 하나 이상 나열합니다. 통계는 나열된 각 웹훅 구성에 대해 구성이 플래그로 표시된 이유를 설명합니다.
  2. 웹훅 구성을 검사합니다.

    콘솔

    통계의 사이드바 패널에서 테이블을 참조하세요. 각 행에는 웹훅 구성의 이름과 이 구성이 플래그된 이유입니다.

    각 구성을 검사하려면 GKE 객체 브라우저 대시보드에서 이 구성으로 이동할 이름을 클릭합니다.

    kubectl

    다음 kubectl 명령어를 실행하여 웹훅 구성을 가져오고 CONFIGURATION_NAME을 웹훅 구성 이름으로 바꿉니다.

    kubectl get validatingwebhookconfigurations CONFIGURATION_NAME -o yaml
    

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

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

  3. 웹훅이 신고된 이유에 따라 구성을 수정합니다.

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

    scope*이면 웹훅이 신고됩니다. 또는 범위가 Namespaced이고 다음 조건 중 하나가 true인 경우 웹훅이 플래그 지정됩니다.

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

      webhooks:
      - admissionReviewVersions:
        ...
        namespaceSelector:
          matchExpressions:
          - key: kubernetes.io/metadata.name
            operator: NotIn
            values:
            - blue-system
        objectSelector: {}
        rules:
        - apiGroups:
          ...
          scope: '*'
        sideEffects: None
        timeoutSeconds: 3
      

      웹훅이 특정 네임스페이스에서만 작동하도록 scope*가 아닌 Namespaced로 설정되어 있는지 확인합니다. 또한 operatorNotIn이면 valueskube-systemkube-node-lease를 포함합니다(이 예시에서는 blue-system).

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

      namespaceSelector:
          matchExpressions:
          - key: kubernetes.io/metadata.name
            operator: In
            values:
            - blue-system
            - kube-system
            - kube-node-lease
      

      웹훅이 특정 네임스페이스에서만 작동하도록 scope*가 아닌 Namespaced로 설정되어 있는지 확인합니다. operatorIn이면 valueskube-systemkube-node-lease를 포함하지 마세요. 이 예시에서는 operatorIn이므로 blue-systemvalues에 있어야 합니다.

    일치하는 리소스 제외

    웹훅은 다음 예시와 같이 리소스에 nodes, tokenreviews, subjectaccessreviews 또는 certificatesigningrequests가 나열된 경우에도 신고됩니다.

    - admissionReviewVersions:
    ...
      resources:
      - 'pods'
      - 'nodes'
      - 'tokenreviews'
      - 'subjectacessreviews'
      - 'certificatesigningrequests'
      scope: '*'
    sideEffects: None
    timeoutSeconds: 3
    

    리소스 섹션에서 nodes, tokenreviews, subjectaccessreviews, certificatesigningrequests를 삭제하세요. podsresources로 유지할 수 있습니다.

다음 단계