Cloud Service Mesh에서 사이드카 프록시/웹훅 문제 해결

이 섹션에서는 일반적인 Cloud Service Mesh 문제와 해결 방법을 설명합니다. 추가 지원이 필요하면 지원 받기를 참조하세요.

Cloud Service Mesh에는 다음과 같은 웹훅 2개가 포함되어 있습니다.

  • 검증 웹훅은 적용된 Istio 구성이 올바른지 확인합니다.
  • 변형 웹훅은 새 포드에 자동 사이드카 삽입을 설정합니다.

이러한 웹훅 중 하나의 구성 문제로 인해 새 포드가 시작되지 않거나 kubectl apply이 오류 메시지를 생성할 수 있습니다.

사이드카 삽입 문제

관리형 Cloud Service Mesh를 프로비저닝한 경우 지원팀에 문의하세요.

사이드카 삽입이 올바르게 작동하지 않으면 다음 항목이 표시됩니다.

  • 사이드카 없이 예약되는 포드
  • 사이드카가 삽입되어야 하는 포드는 kubectl get pods를 사용할 때 표시되지 않지만 kubectl get replicaset에서 설정된 해당 복제본이 존재합니다.

다음 단계에 따라 사이드카 삽입을 문제 해결합니다.

  1. 네임스페이스 또는 포드의 올바른 삽입 라벨이 있는지 확인합니다.

    단일 버전 Istio(기본값)를 실행 중이면 네임스페이스 또는 포드에 istio-injection=enabled 라벨이 있는지 확인합니다.

    여러 버전의 Istio(다운타임이 없는 마이그레이션의 경우 여러 컨트롤 플레인 등)를 실행 중이면 네임스페이스나 포드 사양에 적절한 istio.io/rev=REVISION 라벨이 있는지 확인합니다. 여기서 REVISION은 선택한 Cloud Service Mesh 버전에 해당하는 istiod의 Cloud Service Mesh 버전 번호입니다. 버전 라벨에 대한 자세한 내용은 사이드카 프록시 삽입을 참조하세요.

  2. istio 사이드카 삽입 웹훅이 있고 CA 번들이 있는지 확인합니다.

    자동 사이드카 삽입에 사용되는 사이드카 인젝터 웹훅에는 CA 번들이 API 서버 및 istiod와의 보안 연결을 설정하도록 요구합니다. 이 CA 번들은 istiod의 구성에 패치되지만 경우에 따라 이를 덮어쓸 수도 있습니다(예: 웹훅 구성을 다시 적용하는 경우).

    다음 명령어를 사용하여 CA 번들이 있는지 확인할 수 있습니다. 이 명령어에는 이 버전의 Cloud Service Mesh와 관련된 istio-sidecar-injector-asm-1232-2이 포함되어 있습니다. 다른 경우 사용하는 현재 버전을 확인하세요.

    kubectl get mutatingwebhookconfigurations.admissionregistration.k8s.io istio-sidecar-injector-asm-1232-2 -o=jsonpath='{.webhooks[0].clientConfig.caBundle}'

    출력이 비어 있지 않으면 CA 번들이 구성된 것입니다. CA 번들이 없으면 istiod를 다시 시작하여 웹훅을 다시 스캔하도록 만들고 CA 번들을 다시 설치합니다.

  3. 사이드카 삽입 오류를 확인합니다.

    삽입이 사용 설정되었지만 포드 예약이 표시되지 않으면 다음 상위 수준의 추상화 상태를 확인합니다. 예를 들어 배포를 실행 중이지만 포드가 예약되지 않으면 다음 명령어를 사용하여 해당 복제본 집합의 상태를 확인합니다.

    kubectl -n my-namespace describe replicaset your-deployment-name

    복제본 집합이 있으면 설명 아래의 이벤트 로그에서 오류가 있는지 확인합니다. 오류가 사이드카 삽입과 관련된 경우 istiod 로그에서 오류 원인을 나타내는 항목이 있는지 확인합니다.

  4. 문제가 지속되면 문제 원인이 다음 중 하나일 수 있습니다.

    • 인젝터에 전달된 잘못된 구성
    • 방화벽 구성 문제
    • Istio 코드 자체의 문제

    추가 진단 단계는 Istio 문제 해결을 참조하세요.

Envoy 프록시가 istiod에서 구성을 수신하지 않음

프록시가 istiod에서 구성을 수신하지 못하도록 방해하는 문제는 몇 가지가 있습니다.

  1. 구성 리소스를 읽지 못하게 하는 RBAC 문제와 같은 문제가 발생하면 istiod는 구성을 envoy 프록시로 구성을 내보내지 않습니다.

  2. 검색 주소가 잘못됨('정상 업스트림 없음' 오류)

  3. 사이드카 인젝터에 제공된 검색 주소가 잘못되었습니다. gRPC config stream closed, no healthy upstream 로그가 표시되면 ProxyConfig 메시에 있는 검색 주소가 올바르고 istiod 서비스를 가리키는지 확인합니다.

  4. 프록시에 푸시되는 구성이 잘못되었습니다. 이 경우 구성이 프록시에 성공적으로 푸시되지만 구성이 유효하지 않습니다. 다음과 비슷한 메시지가 반복해서 표시됩니다.

    Envoy proxy is NOT ready: config not received from Pilot (is Pilot running?): cds updates: 1 successful, 0 rejected; lds updates: 0 successful, 1 rejected

    이 예시에서 cds는 클러스터 검색 서비스(istiod에서 내보낸 업데이트 1개 보고)이며 lds는 리스너 검색 서비스(istiod에서 거부된 업데이트 1개 보고)입니다. 일반적으로 envoy 구성에 대한 경고나 그와 비슷한 경고로 시작하는 거부 이유를 설명하는 앞의 오류 메시지가 표시되는 경우가 많습니다.

    이 문제를 해결하려면 거부된 구성의 원인을 조사합니다. 한 가지 일반적인 원인은 EnvoyFilter 리소스가 잘못된 경우입니다. 이유가 명확하지 않으면 프록시의 구성 덤프와 함께 버그 신고를 제출하세요.

포드 만들기 실패

포드가 생성되지 않으면 다음 명령어를 사용하여 루트 문제에 대한 단서를 제공할 수 있는 오류 메시지를 찾습니다.

kubectl describe replicaset YOUR_REPLICA_SET

일반적인 웹훅 오류 메시지

kubectl apply 명령어로 출력되는 오류 메시지는 해당 근본 원인에 대한 힌트를 제공할 수 있습니다. 다음 표에서 일반적인 오류 메시지, 원인, 잠재적인 해결 방법을 살펴보세요.

오류 메시지 원인 해결 방법
net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) 이 오류는 네트워크 연결 문제로 발생할 수 있습니다. 방화벽 규칙이 포트 15017에서 'Istiod'에 대한 연결을 제공하는지 확인합니다.
no endpoints available for service 'istiod' 이 오류는 'Istiod' 포드를 사용할 수 없거나 준비되는 않은 경우 발생할 수 있습니다. 'Istiod' 포드가 실행 중이거나 준비되었는지 확인합니다.
Service "istiod" not found 이 오류는 'Istiod' 서비스가 없는 경우 발생할 수 있습니다. Istio가 올바르게 설치되었는지 확인합니다.
x509: certificate signed by unknown authority 이 오류는 웹훅 인증서 문제로 발생할 수 있습니다. 웹훅에서 caBundle이 올바르게 설정되었는지 확인합니다.
Failed to update validatingwebhookconfiguration istio-validator-asm-[version-n]-istio-system (failurePolicy=Fail, resourceVersion=[version]): Operation cannot be fulfilled on validatingwebhookconfigurations.admissionregistration.k8s.io "istio-validator-asm-[version-n]-istio-system": the object has been modified; please apply your changes to the latest version and try again. 제거된 이전 버전의 Istio 또는 Cloud Service Mesh에서 검증 웹훅이 업그레이드나 설치를 방해할 수 있습니다. 여전히 모든 웹훅이 클러스터에 있는지 확인하고 더 이상 설치되지 않는 버전을 참조하는 웹훅을 삭제합니다.
Error from server (InternalError): Internal error occurred: failed calling webhook "rev.namespace.sidecar-injector.istio.io": Post "https://istiod-asm-1122-0.istio-system.svc:443/inject?timeout=10s": context deadline exceeded 비공개 클러스터의 경우 포트 15017이 열려 있어야 합니다. 이 오류 메시지는 포트 15017이 열려 있지 않을 수 있음을 나타냅니다. 방화벽 규칙이 포트 15017에서 Istiod에 대한 연결을 제공하는지 확인합니다. 자세한 내용은 비공개 클러스터에서 포트 열기를 참조하세요.