Istio Hands-on Study [1기]

[6주차] 데이터 플레인 문제 해결 : 데이터 플레인 문제 식별

구구달스 2025. 4. 22. 10:31

🚀 Istio 데이터 플레인 문제 식별 및 해결

  • Istio를 운영하다 보면 데이터 플레인에서 발생하는 문제가 가장 흔히 마주치는 이슈입니다. 문제 해결을 위해 바로 데이터 플레인 디버깅에 뛰어들기 쉽지만, 먼저 컨트롤 플레인 문제를 배제하는 것이 중요합니다.
  • 데이터 플레인 문제를 식별하고, 컨트롤 플레인과 데이터 플레인이 최신 설정과 동기화되었는지 확인하는 방법을 설명합니다.

🛠️ 데이터 플레인 문제의 중요성과 컨트롤 플레인 점검

  • 일상적인 운영에서 데이터 플레인 문제는 자주 발생합니다. 하지만 디버깅을 시작하기 전에, 컨트롤 플레인이 제대로 작동하는지 확인하는 것이 필수적입니다. 컨트롤 플레인의 주요 역할은 데이터 플레인을 최신 설정과 동기화하는 것입니다. 따라서 문제의 원인이 컨트롤 플레인에 있는지, 아니면 데이터 플레인 자체에 있는지 빠르게 파악해야 합니다.
  • 컨트롤 플레인과 데이터 플레인이 동기화되지 않았다면, 데이터 플레인이 최신 설정을 반영하지 못해 문제가 발생할 수 있습니다. 이를 확인하는 첫 번째 단계는 데이터 플레인의 동기화 상태를 점검하는 것입니다.

데이터 플레인 문제를 디버깅하기 전에,
컨트롤 플레인이 데이터 플레인을 최신 설정과 동기화했는지 확인하는 것이 중요합니다.


🔄 데이터 플레인 동기화 확인 방법

  • Istio의 데이터 플레인 설정은 eventually consistent 방식으로 동작합니다. 즉, 환경(서비스, 엔드포인트, 헬스 상태)이나 설정이 변경되더라도, 컨트롤 플레인과 데이터 플레인이 즉시 동기화되지 않고 일정 시간이 걸립니다. 예를 들어, 서비스의 특정 엔드포인트(예: Pod의 IP 주소)가 비정상 상태가 되면, Kubernetes가 이를 감지하고 Pod를 비정상으로 표시합니다. 이후 컨트롤 플레인이 이를 인식해 데이터 플레인에서 해당 엔드포인트를 제거합니다. 이 과정을 통해 데이터 플레인은 최신 설정과 다시 일치하게 됩니다.
  • 아래 그림은 워크로드가 비정상 상태가 되었을 때 데이터 플레인 설정이 업데이트되는 과정을 보여줍니다.

  • 데이터 플레인이 최신 설정과 동기화되었는지 확인하려면 istioctl proxy-status 명령어를 사용합니다. 다음은 실행 예시입니다:
$ docker exec -it myk8s-control-plane istioctl proxy-status
NAME                                                   CLUSTER        CDS        LDS        EDS        RDS          ECDS         ISTIOD                    VERSION
catalog-6cf4b97d-56jm5.istioinaction                   Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED       NOT SENT     istiod-8d74787f-6f5g6     1.17.8
catalog-v2-56c97f6db-244cd.istioinaction               Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED       NOT SENT     istiod-8d74787f-6f5g6     1.17.8
catalog-v2-56c97f6db-rw7r8.istioinaction               Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED       NOT SENT     istiod-8d74787f-6f5g6     1.17.8
istio-egressgateway-85df6b84b7-ns5f9.istio-system      Kubernetes     SYNCED     SYNCED     SYNCED     NOT SENT     NOT SENT     istiod-8d74787f-6f5g6     1.17.8
istio-ingressgateway-6bb8fb6549-kmx69.istio-system     Kubernetes     SYNCED     SYNCED     SYNCED     SYNCED       NOT SENT     istiod-8d74787f-6f5g6     1.17.8

 

  • 출력은 각 워크로드의 xDS API(CDS, LDS, RDS 등)에 대한 동기화 상태를 보여줍니다. 상태는 다음과 같이 해석됩니다:
    • SYNCED: Envoy가 컨트롤 플레인에서 보낸 최신 설정을 수신하고 적용했습니다.
    • NOT SENT: 컨트롤 플레인이 Envoy에 설정을 보내지 않았습니다. 예를 들어, istio-egressgateway의 RDS는 설정이 필요 없는 경우입니다.
    • STALE: 컨트롤 플레인이 업데이트를 보냈지만 Envoy가 이를 확인하지 못했습니다. 이는 컨트롤 플레인 과부하, Envoy와 컨트롤 플레인 간 연결 문제, 또는 Istio 버그일 가능성을 나타냅니다.
  • 위 출력에서는 모든 워크로드가 SYNCED 또는 NOT SENT 상태로, STALE 상태가 없으므로 컨트롤 플레인 문제가 아닌 데이터 플레인 문제를 조사해야 함을 알 수 있습니다.

istioctl proxy-status 명령어로 데이터 플레인의 동기화 상태를 확인하며,
SYNCED 또는 NOT SENT 상태라면 컨트롤 플레인 문제는 없고 데이터 플레인 문제를 조사해야 합니다.


🕵️ 데이터 플레인 문제의 주요 원인

  • 컨트롤 플레인 문제가 배제되었다면, 데이터 플레인 문제의 원인을 찾아야 합니다. 데이터 플레인 문제는 주로 워크로드 설정 오류로 인해 발생합니다. 예를 들어, VirtualService나 DestinationRule이 잘못 설정되면 트래픽 라우팅이 실패할 수 있습니다.
  • 이런 문제를 빠르게 확인하려면 Kiali 같은 Istio 관찰 도구를 사용할 수 있습니다. Kiali는 설정을 시각적으로 검증하고, 잘못된 부분을 쉽게 식별할 수 있도록 도와줍니다. 이를 통해 데이터 플레인의 설정 오류를 신속히 파악하고 수정할 수 있습니다.

데이터 플레인 문제는 주로 워크로드 설정 오류로 발생하며,
Kiali를 사용해 설정을 검증하면 문제를 빠르게 해결할 수 있습니다.


📌 핵심 요약

  • 데이터 플레인 문제의 우선순위: 데이터 플레인 문제는 운영 중 자주 발생하며, 디버깅 전에 컨트롤 플레인 문제를 배제해야 합니다.
  • 동기화 확인: 데이터 플레인은 eventually consistent 방식으로 동기화되며, istioctl proxy-status 명령어로 SYNCED, NOT SENT, STALE 상태를 확인할 수 있습니다.
  • 상태 해석: SYNCED 또는 NOT SENT 상태라면 컨트롤 플레인 문제는 없으며, STALE 상태는 컨트롤 플레인 과부하 또는 연결 문제를 나타냅니다.
  • 데이터 플레인 문제 해결: 워크로드 설정 오류가 주요 원인이며, Kiali를 활용해 설정을 검증하고 문제를 해결할 수 있습니다.

🚀 Kiali를 활용한 Istio 설정 오류 탐지

  • Istio 환경에서 설정 오류는 워크로드가 예상대로 동작하지 않는 주요 원인 중 하나입니다.
  • Kiali는 Istio의 설정 문제를 시각적으로 탐지하고 해결 방법을 제시하는 강력한 도구입니다.

🛠️ Kiali로 잘못된 설정 탐지하기

  • Kiali는 Istio 환경의 설정 상태를 한눈에 파악할 수 있는 대시보드를 제공합니다.
    Kiali는 VirtualService, DestinationRule 같은 Istio 리소스의 설정 오류를 자동으로 감지합니다. 이를 통해 워크로드 문제를 빠르게 진단하고 해결할 수 있습니다.
  • 대시보드는 istioinaction 네임스페이스에서 발생한 오류를 경고 아이콘으로 표시합니다.

Kiali 대시보드는 Istio 설정 오류를 시각적으로 표시니다.


🔍 설정 오류 상세 확인

Kiali 대시보드에서 istioinaction 네임스페이스의 경고 아이콘을 클릭하면 Istio Config 뷰로 이동합니다. 이 뷰는 선택한 네임스페이스에 적용된 모든 Istio 설정을 목록으로 보여줍니다. 여기서 catalog-v1-v2 VirtualService 리소스에 경고 아이콘이 표시된 것을 확인할 수 있습니다.

  • 경고 아이콘을 클릭하면 VirtualService의 YAML 뷰로 이동합니다. 이 뷰에서는 설정 오류가 발생한 부분이 강조 표시됩니다. 예를 들어, Kiali는 KIA1107 Subset not found 경고를 표시합니다.

  • 경고 아이콘에 마우스를 올리면 KIA1107 Subset not found 메시지가 나타납니다. 이 경고는 VirtualService에서 참조한 서브셋이 DestinationRule에 정의되지 않았음을 나타냅니다.

Kiali의 Istio Config 뷰는 설정 오류를 목록으로 보여주며,
YAML 뷰에서 오류 섹션을 강조 표시해 문제를 쉽게 파악할 수 있습니다.


🛠️ Kiali 경고 메시지 해석 및 해결

  • Kiali는 설정 오류에 대한 자세한 정보를 제공합니다. KIA1107 Subset not found 경고의 경우, Kiali 공식 문서(Kiali validations page)에서 다음과 같은 정보를 확인할 수 있습니다:
    • 설명: VirtualService에서 참조한 서브셋이 DestinationRule에 정의되지 않음.
    • 심각도: 오류의 영향 범위를 나타냄.
    • 해결 방법: 잘못된 서브셋 이름을 수정하거나, 누락된 서브셋을 DestinationRule에 정의.
  • KIA1107 경고의 해결 방법은 다음과 같습니다:

  • 이 설명은 서브셋이 누락되었음을 정확히 지적하며, DestinationRule 리소스를 추가해 서브셋을 정의하면 문제를 해결할 수 있음을 알려줍니다.

Kiali는 KIA1107 Subset not found 같은 경고를 통해 설정 오류의 원인을 명확히 제시하며,
DestinationRule을 추가해 문제를 해결할 수 있도록 안내합니다.


📌 핵심 요약

  • Kiali의 역할: Kiali는 Istio 설정 오류를 시각적으로 탐지하며, istioctl dashboard kiali 명령어로 대시보드를 열 수 있습니다.
  • 오류 탐지: Istio Config 뷰에서 VirtualService의 설정 오류를 확인하고, YAML 뷰에서 KIA1107 Subset not found 같은 경고를 통해 문제를 파악합니다.
  • 해결 방법: Kiali 문서와 경고 메시지를 참고해 서브셋 이름 수정 또는 DestinationRule 추가로 문제를 해결할 수 있습니다.
  • 추가 검증: Kiali로 오류를 탐지한 후, istioctl로 프록시 설정을 추가 검증해 문제를 완전히 해결합니다.

🚀 istioctl로 Istio 설정 오류 탐지 및 해결

  • Istio 환경에서 설정 오류를 빠르게 탐지하고 해결하려면 istioctl 명령어가 필수적입니다. 특히 istioctl analyze istioctl describe 명령어는 설정 문제를 자동으로 진단하고 워크로드별 설정 상태를 확인하는 데 유용합니다.
  • 두 명령어를 사용해 설정 오류를 탐지하고 수정하는 방법을설명합니다.

🛠️ istioctl로 설정 오류 자동 진단

  • istioctl은 Istio 설정을 분석하고 문제를 진단하는 강력한 도구입니다. istioctl analyze istioctl describe는 설정 오류를 자동으로 탐지해 워크로드 문제를 해결하는 데 큰 도움을 줍니다. 이 명령어들은 설정을 적용하기 전에 검증하거나, 이미 문제가 발생한 클러스터에서 원인을 파악하는 데 사용할 수 있습니다.
  • 이 두 명령어를 통해 VirtualService, DestinationRule 같은 리소스의 설정 오류를 빠르게 찾아낼 수 있습니다. 특히, 초보자라도 명령어 출력 결과를 통해 어떤 부분이 잘못되었는지 쉽게 이해할 수 있습니다.

istioctl analyze와 istioctl describe는 설정 오류를 자동으로 탐지하며,
문제를 해결하기 위한 첫 단계로 적합합니다.


🔍 istioctl analyze로 전체 설정 분석

  • istioctl analyzeIstio 설정을 분석해 잠재적인 문제를 찾아내는 명령어입니다. 이 명령어는 다양한 analyzer를 실행해 특정 문제(예: 누락된 서브셋, 잘못된 호스트 참조 등)를 감지합니다. 또한, 확장 가능한 구조로 Istio의 발전에 따라 새로운 진단 기능이 추가됩니다.
  • istioinaction 네임스페이스의 설정 문제를 확인하기 위해 다음 명령어를 실행합니다:
$ docker exec -it myk8s-control-plane istioctl analyze -n istioinaction
Error [IST0101] (VirtualService istioinaction/catalog-v1-v2) Referenced host+subset in destinationrule not found: "catalog.istioinaction.svc.cluster.local+version-v1"
Error [IST0101] (VirtualService istioinaction/catalog-v1-v2) Referenced host+subset in destinationrule not found: "catalog.istioinaction.svc.cluster.local+version-v2"
Error: Analyzers found issues when analyzing namespace: istioinaction.
See https://istio.io/v1.17/docs/reference/config/analysis for more information about causes and resolutions.
  • 출력은 catalog-v1-v2 VirtualService에서 version-v1과 version-v2 서브셋이 DestinationRule에 정의되지 않았음을 나타냅니다. 오류 코드 IST0101은 Istio 공식 문서(Istio analysis documentation)에서 자세한 원인과 해결 방법을 확인할 수 있습니다.

istioctl analyze는 네임스페이스 전체의 설정 오류를 탐지하며,
IST0101 오류는 DestinationRule에 서브셋이 누락되었음을 나타냅니다.


🕵️ istioctl describe로 워크로드별 설정 확인

  • istioctl describe특정 워크로드에 적용된 Istio 설정을 분석하고 요약 정보를 제공합니다. 이 명령어는 워크로드가 서비스 메쉬에 포함되어 있는지, 어떤 VirtualService나 DestinationRule이 적용되었는지, 상호 인증(mTLS)이 필요한지 등의 질문에 답합니다.
  • catalog 워크로드의 설정을 확인하려면 다음 명령어를 실행합니다:
    • 출력은 version-v1과 version-v2 서브셋으로의 라우팅이 설정되었지만, DestinationRule에 서브셋이 정의되지 않아 오류가 발생했음을 보여줍니다.
$ CATALOG_POD1=$(kubectl get pod -n istioinaction -l app=catalog -o jsonpath='{.items[0].metadata.name}')ms[0].metadata.name}')

$ docker exec -it myk8s-control-plane istioctl x des pod -n istioinaction $CATALOG_POD1
Pod: catalog-6cf4b97d-56jm5
   Pod Revision: default
   Pod Ports: 3000 (catalog), 15090 (istio-proxy)
--------------------
Service: catalog
   Port: http 80/HTTP targets pod port 3000
--------------------
Effective PeerAuthentication:
   Workload mTLS mode: PERMISSIVE


Exposed on Ingress Gateway http://172.18.0.2
VirtualService: catalog-v1-v2
   WARNING: No destinations match pod subsets (checked 1 HTTP routes)
      Warning: Route to subset version-v1 but NO DESTINATION RULE defining subsets!
      Warning: Route to subset version-v2 but NO DESTINATION RULE defining subsets!

 

  • 문제 해결 후 확인 합니다.:
    • 이 출력은 DestinationRule에 서브셋이 정의되어 있으며, 트래픽이 정상적으로 라우팅되고 있음을 보여줍니다.
$ kubectl apply -f ch10/catalog-destinationrule-v1-v2.yaml
destinationrule.networking.istio.io/catalog created

$ docker exec -it myk8s-control-plane istioctl x des pod -n istioinaction $CATALOG_POD1
Pod: catalog-6cf4b97d-56jm5
   Pod Revision: default
   Pod Ports: 3000 (catalog), 15090 (istio-proxy)
--------------------
Service: catalog
   Port: http 80/HTTP targets pod port 3000
DestinationRule: catalog for "catalog.istioinaction.svc.cluster.local"
   Matching subsets: version-v1
      (Non-matching subsets version-v2)
   No Traffic Policy
--------------------
Effective PeerAuthentication:
   Workload mTLS mode: PERMISSIVE


Exposed on Ingress Gateway http://172.18.0.2
VirtualService: catalog-v1-v2
   Weight 20%

istioctl describe는 워크로드별 설정을 분석해 서브셋 누락 같은 오류를 탐지하며,
올바른 설정에서는 DestinationRule과 매칭된 서브셋을 확인할 수 있습니다.


🔄 다음 단계: 심층 디버깅

  • istioctl analyzeistioctl describe는 대부분의 설정 오류를 탐지하고 해결 방법을 제시합니다. 하지만 이 명령어들로 문제가 드러나지 않거나 해결 방법이 충분히 명확하지 않은 경우, 더 깊은 디버깅이 필요합니다. 예를 들어, 프록시 로그를 확인하거나 Kiali와 같은 도구를 추가로 활용해 문제를 추적할 수 있습니다.

istioctl 명령어로 해결되지 않는 문제는
프록시 로그 분석이나 Kiali를 통해 심층적으로 디버깅해야 합니다.


📌 핵심 요약

  • istioctl의 역할: istioctl analyzeistioctl describe는 Istio 설정 오류를 자동으로 탐지하는 강력한 도구입니다.
  • istioctl analyze: 네임스페이스 전체의 설정을 분석해 IST0101 같은 오류(예: DestinationRule에 서브셋 누락)를 탐지합니다.
  • istioctl describe: 특정 워크로드의 설정을 요약하며, VirtualService에서 참조한 서브셋이 DestinationRule에 없는 경우 경고를 표시합니다.
  • 해결 및 심층 분석: 대부분의 오류는 이 명령어들로 해결 가능하며, 복잡한 문제는 프록시 로그나 Kiali로 추가 디버깅을 진행합니다.