IBM Cloud Kubernetes 클러스터에서 웹훅 오류 해결
IBM Cloud Kubernetes 클러스터에서 문제가 되는 웹훅을 파악하고 디버깅하여 웹훅 관련 문제를 해결하십시오.
oc 명령을 실행할 때 다음 예제와 유사한 오류 메시지가 표시됩니다.
Error from server (InternalError): error when creating "testjob.yaml": Internal error occurred: failed calling webhook "mywebhook.test.io": Post https://admission-webhook.default.svc:443/validate?timeout=30s: dial tcp 172.21.189.228:443: connect: connection timed out
error creating namespace "test": Internal error occurred: admission plugin "MutatingAdmissionWebhook" failed to complete mutation in 13s
웹훅이 실패하면 다음 문제와 유사한 문제점이 발생할 수도 있습니다.
- 팟 (Pod), 시크릿 또는 네임스페이스를 작성하거나 수정할 수 없습니다.
- 작업자 노드를 클러스터에 추가하거나 LUKS 암호화 키를 보유하는 시크릿을 작성할 수 없습니다.
- 패치, 업데이트 또는 업그레이드를 수행할 수 없으며 기본 실패는 클러스터에서 리소스를 작성하는 것과 관련되어 있습니다.
호출된 서비스 또는 보안 터널의 문제점으로 인해 제한시간 초과로 인해 요청이 실패할 수 있습니다. 이러한 상황이 발생할 때까지 허가 제어 웹훅이 설치되어 있는지 알지 못할 수 있습니다.
허가 제어 웹훅은 Kubernetes API 요청을 유효성 검증, 수정 또는 변형하는 기능을 제공합니다. 이러한 웹훅은 클러스터 apiserver 또는 openshift-apiserver 에서 호출되며 일반적으로 클러스터에서 실행 중인 서비스를 호출합니다. 어드민 제어 웹훅에는 포드, 네임스페이스 등의 리소스 종류와 생성, 검색, 업데이트 또는 삭제와 같이 호출되는 작업을 정의하는 규칙이
있습니다.
웹훅에는 Kubernetes 가 웹훅을 호출할 때 연결 오류를 무시할 수 있는지 여부 또는 연결 오류가 조작에 실패해야 하는지 여부를 표시하는 실패 정책이 있습니다. MutatingWebhookConfiguration 자원이 처리되기 전에 요청 데이터를 수정하는 동안 ValidatingWebhookConfiguration 자원이 요청을 검사합니다.
웹훅은 정상 조작의 일부로 요청을 거부할 수도 있습니다. 웹훅은 보안 정책을 위반하는 요청을 거부하거나 다른 데이터 유효성 검증을 수행할 수 있습니다. 이러한 경우 실패 정보에는 문제점을 표시하는 이유와 함께 denied the request 응답이 포함됩니다.
admission webhook "mutate.configuration.upsert.appconnect.ibm.com" denied the request: version is not supported
Red Hat OpenShift on IBM Cloud에서, 클러스터에서 실행 중인 서비스를 호출하는 웹훅은 IBM Cloud 계정의 클러스터 제어 플레인을 고객 계정의 클러스터 작업자 노드에 연결하는 보안 터널을 사용하여 이를 수행합니다.
문제의 원인이 되는 웹훅을 식별하려면 다음 단계를 완료하십시오. 그런 다음 관련 서비스를 디버그하고 필요한 경우 웹훅을 제거하거나 다시 작성하십시오.
-
다음 명령을 실행하여 VPN팟 (Pod) 로그를 가져오십시오. VPN 로그를 가져올 수 없는 경우 공통 CLI 문제 디버그 에 대한 단계를 수행하고 로그를 검색할 수 있을 때 이 페이지로 돌아오십시오. 명령이 성공하고 로그를 가져올 수 있는 경우 VPN 터널이 작동 중이며 다음 단계를 계속할 수 있습니다.
oc get pods -n kube-system -l app=vpnoc logs -n kube-system -l app=vpn -
허가 제어 웹훅을 설명하고 출력을
webhooks.txt라는 파일에 저장하십시오.kubectl describe mutatingwebhookconfigurations,validatingwebhookconfigurations > webhooks.txt -
webhooks.txt파일에서 오류 메시지를 검토하십시오. oc를 포함하여 애플리케이션의 웹훅 관련 오류 메시지는 웹훅을 식별하는 데 도움이 될 수 있습니다. -
apiserver 지표에서 거부 유형, 개수 및 거부 코드를 검토하십시오. 다음 명령어를 사용하면 지표에 대한 개요를 확인할 수 있습니다.
kubectl get --raw /metrics | grep apiserver_admission_webhook_rejection_countapiserver_admission_webhook_rejection_count{error_type="calling_webhook_error",name="check-ignore-label.gatekeeper.sh",operation="UPDATE",rejection_code="0",type="validating"} 16rejection_code값이 0이면 웹훅을 호출할 때 오류가 발생했음을 표시합니다. 0이 아닌rejection_code값은 웹훅이 요청을 거부했음을 표시합니다.3개의 apiserver 인스턴스가 있습니다. oc 명령은 메트릭 중 하나에서 메트릭을 가져오고 해당 메트릭에서 활동을 반영합니다. 각 apiserver는 서로 다른 데이터를 리턴합니다. 실패한 요청을 처리하지 않은 인스턴스는 이 지표를 리턴하지 않을 수 있습니다.
-
이전 단계의 명령 출력을 검토하고 특정
MutatingWebhookConfiguration또는ValidatingWebhookConfiguration값을 식별하기 위한 웹훅 설명을 찾으십시오. 오류, 로그 또는 메트릭이 도움이 되지 않으면 이전에 검색한 웹훅 설명을 검토하십시오. 각 웹훅 구성에는 웹훅이 호출되는 자원 및 조치의 종류를 지정하는 규칙 세트가 있습니다. 이 정보를 사용하여 관련될 수 있는 웹훅을 식별할 수 있습니다.-
웹훅을 호출하는 중에 오류가 발생하면 해당 서비스에 대한 문서에서 제품별 디버깅 단계를 검토하십시오.
-
웹훅이 요청을 거부하는 경우 웹훅에 대한 정책 및 구성 옵션을 확인하십시오. 요청을 허용하도록 조정할 수 있습니다. 또는 요청이 정책 및 요청을 위반하거나 요청을 작성하는 애플리케이션을 변경해야 할 수 있습니다. 자세한 정보는 웹훅 사용에 대한 우수 사례 를 참조하십시오.
-
웹훅이 호출하는 서비스 검토
-
서비스 및 해당 엔드포인트의 세부사항을 가져오십시오.
kubectl get svc NAME -n NAMESPACEkubectl get ep NAME -n NAMESPACE-
웹 후크가 존재하지 않는 서비스를 호출하는 경우, 웹 후크는 불완전하거나 부적절한 애플리케이션 제거에서 남아 있을 수 있습니다. 이 경우, 서비스 특정 문서를 찾아 서비스를 설치 제거하는 단계를 따르십시오.
-
서비스를 설치 제거할 수 없는 경우 웹훅 구성을 삭제하십시오.
kubectl delete validatingwebhookconfiguration NAME ``` ```sh {: pre} kubectl delete mutatingwebhookconfiguration NAME ``` -
-
서비스가 있지만 엔드포인트가 없는 경우 팟 (Pod) 의 상태를 확인하십시오. 먼저 서비스에서 팟 (Pod) 레이블을 가져오십시오.
kubectl describe svc NAME -n NAMESPACE출력 예
Selector: app=my-webhook -
레이블을 사용 중인 팟 (Pod) 을 나열하십시오. 예를 들어, 다음 명령의 레이블은
app=mywebhook입니다.kubectl get pods -n NAMESPACE -l app=my-webhook -
명령 출력을 검토하십시오. 포드가 정상 상태가 아닌 경우, 포드 이벤트, 로그, 워커 노드 상태 및 기타 구성 요소를 확인하여 문제를 해결하십시오. 자세한 정보는 앱 배치 디버깅을 참조하십시오.
웹훅 사용 안함 또는 제거
-
실패 정책을
Ignore로 설정하여 연결 및 제한시간을 일시적으로 무시하십시오. 다음 명령어를 실행하여 웹훅을 편집하십시오.kubectl edit validatingwebhookconfiguration NAMEkubectl edit mutatingwebhookconfiguration NAME -
failurePolicy를 검색하고 값을Ignore로 변경하십시오. -
설정을 저장하고 편집기를 종료합니다. 실패 정책을 조정해도 문제가 해결되지 않으면 이전 단계를 반복하고 값을 다시
Fail로 변경하십시오. -
웹훅을 임시로 제거하십시오. 기존 웹훅 구성을 삭제하기 전에 파일에 저장하십시오.
kubectl get validatingwebhookconfiguration NAME -o yaml > webhook-config.yamlkubectl get mutatingwebhookconfiguration NAME -o yaml > webhook-config.yaml -
웹훅 구성을 삭제하십시오.
kubectl delete validatingwebhookconfiguration NAMEkubectl delete mutatingwebhookconfiguration NAME -
몇 분 동안 기다린 후 실패한
kubectl명령을 재시도하여 문제점이 해결되었는지 확인하십시오. -
웹훅을 다시 작성하십시오.
kubectl apply -f webhook-config.yaml -
문제가 계속되면 지원에 문의하십시오. 지원 케이스 열기 케이스 세부사항에는 관련 로그 파일, 오류 메시지 또는 명령 출력이 포함되어야 합니다.