Kubernetes API 서버 문제 해결

이 페이지에서는 베어메탈용 Google Distributed Cloud Virtual의 Kubernetes API 서버(kube-apiserver) 문제를 해결하는 방법을 설명합니다.

추가 지원이 필요하면 Cloud Customer Care에 연락합니다.

웹훅 시간 제한 및 웹훅 호출 실패

이러한 오류는 몇 가지 다른 방법으로 확인할 수 있습니다. 다음과 같은 증상이 발생하면 웹훅 호출이 잘못되었을 수 있습니다.

  • 연결이 거부됨: kube-apiserver가 웹훅 호출의 제한 시간 오류를 보고하는 경우 로그에 다음 오류가 보고됩니다.

    failed calling webhook "server.system.private.gdc.goog":
    failed to call webhook: Post "https://root-admin-webhook.gpc-system.svc:443/mutate-system-private-gdc-goog-v1alpha1-server?timeout=10s":
    dial tcp 10.202.1.18:443: connect: connection refused
    
  • 컨텍스트 기한 초과: 로그에 다음과 같은 오류가 보고될 수도 있습니다.

    failed calling webhook "namespaces.hnc.x-k8s.io": failed to call webhook: Post
    "https://hnc-webhook-service.hnc-system.svc:443/validate-v1-namespace?timeout=10s\":
    context deadline exceeded"
    

웹훅 시간 초과 또는 웹훅 호출 실패가 발생한다고 생각되면 다음 방법 중 하나를 사용하여 문제를 확인합니다.

  • API 서버 로그에 네트워크 문제가 있는지 확인합니다.

    • 로그에서 TLS handshake error와 같은 네트워크 관련 오류를 확인합니다.
    • IP/포트가 응답하도록 구성된 API 서버와 일치하는지 확인합니다.
  • 다음 단계를 따라 웹훅 지연 시간을 모니터링합니다.

    1. 콘솔에서 Cloud Monitoring 페이지로 이동합니다.

      Cloud Monitoring 페이지로 이동

    2. 측정항목 탐색기를 선택합니다.

    3. apiserver_admission_webhook_admission_duration_seconds 측정항목을 선택합니다.

이 문제를 해결하려면 다음을 제안을 검토하세요.

  • 웹훅에 추가 방화벽 규칙이 필요할 수 있습니다. 자세한 내용은 특정 사용 사례에 대한 방화벽 규칙 추가 방법을 참조하세요.

  • 웹훅에 추가 완료 시간이 필요하면 커스텀 제한 시간 값을 구성할 수 있습니다. 웹훅 지연 시간은 API 요청 지연 시간에 추가되므로 가능한 한 빨리 평가해야 합니다.

  • 웹훅 오류가 클러스터 가용성을 차단하거나 웹훅이 상황을 해소 및 완화할 수 있는 경우 일시적으로 failurePolicyIgnore로 설정하거나 문제가 있는 웹훅을 삭제할 수 있는지 확인합니다.

API 서버 dial 실패 또는 지연 시간

이 오류는 몇 가지 다른 방법으로 확인할 수 있습니다.

  • 외부 이름 변환 오류: 다음과 같이 메시지에 lookup이 포함된 오류가 외부 클라이언트에서 반환될 수 있습니다.

    dial tcp: lookup kubernetes.example.com on 127.0.0.1:53: no such host
    

    이 오류는 클러스터 내에서 실행 중인 클라이언트에 적용되지 않습니다. Kubernetes 서비스 IP가 삽입되었으면 변환이 필요하지 않습니다.

  • 네트워크 오류: 다음 예시와 같이 API 서버에 dial을 시도할 때 클라이언트에서 일반적인 네트워크 오류가 출력될 수 있습니다.

    dial tcp 10.96.0.1:443: connect: no route to host
    dial tcp 10.96.0.1:443: connect: connection refused
    dial tcp 10.96.0.1:443: connect: i/o timeout
    
  • API 서버 연결 지연 시간이 김: API 서버에 대한 연결은 성공할 수 있지만 클라이언트 측에서는 요청 시간이 초과됩니다. 이 시나리오에서 클라이언트는 일반적으로 context deadline exceeded가 포함된 오류 메시지를 출력합니다.

API 서버 연결이 완전히 실패하면 클라이언트가 오류를 보고하는 것과 동일한 환경 내에서 연결을 시도합니다. 다음과 같이 Kubernetes 임시 컨테이너를 사용해서 기존 네임스페이스에 디버깅 컨테이너를 삽입할 수 있습니다.

  1. 문제가 있는 클라이언트가 실행되는 위치에서 kubectl을 사용하여 세부정보 수준이 높은 요청을 수행합니다. 예를 들어 /healthz에 대한 GET 요청에는 일반적으로 인증이 필요하지 않습니다.

    kubectl get -v999 --raw /healthz
    
  2. 요청이 실패하거나 kubectl을 사용할 수 없으면 출력에서 URL을 가져오고 curl을 사용해서 요청을 수동으로 수행할 수 있습니다. 예를 들어 이전 출력에서 가져온 서비스 호스트가 https://192.0.2.1:36917/인 경우 다음과 같이 비슷한 요청을 전송할 수 있습니다.

    # Replace "--ca-cert /path/to/ca.pem" to "--insecure" if you are accessing
    # a local cluster and you trust the connection cannot be tampered.
    # The output is always "ok" and thus contains no sensentive information.
    
    curl -v --cacert /path/to/ca.pem https://192.0.2.1:36917/healthz
    

    이 명령어의 출력은 일반적으로 실패한 연결의 근본 원인을 나타냅니다.

    연결에 성공했지만 느리거나 시간이 초과되면 API 서버가 과부하되었음을 나타냅니다. 확인하려면 콘솔에서 API Server Request Rate를 확인하고 Cloud Kubernetes > Anthos > Cluster > K8s Control Plane에서 지연 시간 측정항목을 요청합니다.

이러한 연결 실패 또는 지연 시간 문제를 확인하려면 다음 해결 옵션을 검토합니다.

  • 클러스터 내에서 네트워크 오류가 발생하면 컨테이너 네트워크 인터페이스(CNI) 플러그인에 문제가 있을 수 있습니다. 이 문제는 일반적으로 일시적이며 포드 재생성 또는 일정 변경 후 자동으로 해결됩니다.

  • 네트워크 오류가 클러스터 외부에서 비롯된 경우 클라이언트가 클러스터에 액세스하도록 올바르게 구성되었는지 확인하거나 클라이언트 구성을 다시 생성합니다. 연결이 프록시 또는 게이트웨이를 통과하는 경우 동일한 메커니즘을 통과하는 다른 연결이 작동하는지 확인합니다.

  • API 서버가 과부하되었으면 일반적으로 많은 클라이언트가 동시에 API 서버에 액세스하고 있음을 나타냅니다. 단일 클라이언트는 제한과 우선순위 및 공정성 기능으로 인해 API 서버에 과부하를 일으키지 않습니다. 다음 영역의 워크로드를 검토합니다.

    • 포드 수준에서 작동합니다. 상위 수준의 리소스보다 실수로 포드를 만들고 잊는 경우가 더 많습니다.
    • 잘못된 계산을 통한 복제본 수를 조정합니다.
    • 요청을 자체적으로 루프백하거나 처리하는 것보다 더 많은 요청을 생성하여 부하를 증폭시키는 웹훅입니다.

다음 단계

추가 지원이 필요하면 Cloud Customer Care에 연락합니다.