[DevOps] Istio Traffic Tracing : Kiali

안녕하세요? 정리하는 개발자 워니즈입니다. 이번시간에는 Kiali라는 툴에 대해서 정리를 해보려고 합니다. DevOps 엔지니어로서 가장 중점을 두는 부분은 모니터링영역입니다. (물론 개인적인 생각입니다.) 모니터링을 잘 구성해두고 철저히 관찰하고 이상유무를 체크하게 된다면, 사이트의 신뢰도 자연스럽게 유지가 될 것입니다.

필자가 운영하는 프로젝트에서는 80-90 여개의 MSA 구조 어플리케이션들이 얽히고 섥혀서 연결이 되어있습니다. 마치 사슬 구조처럼 연결이 외어있는데 Istio는 이러한 서비스 메시 구조에서 네트웤영역을 담당해주는 오픈소스 입니다.

istio관련된 시리즈는 아래에서 확인이 가능합니다.

Istio는 어플리케이션 pod에 side-car 형태로 붙어서 모든 네트워크의 입/출을 통제하고 관리하고 모니터링합니다. 여기서 수집된 정보들을 기반으로 Tracing을 해줄 수 있는것이 오늘 소개드리고자 하는 Kiali입니다.

1. Kiali 설치 과정

Kiali를 설치하기 이전에 Traffic정보를 수집할 수 있는 Prometheus가 필요합니다. 또한, Traffic Trace를 위해서는 Jaeger가 필요합니다.

Istio Addon을 통해서 설치

#istio를 다운로드 후, 설치
kubectl apply -f ${ISTIO_HOME}/samples/addons/kiali.yaml

Helm을 통해서 설치

helm install \
  --namespace istio-system \
  --set auth.strategy="anonymous" \
  --repo https://kiali.org/helm-charts \
  kiali-server \
  kiali-server

Nodeport로 서비스 변경

spec:
  ports:
    - name: http
      nodePort: 32763
      port: 20001
      protocol: TCP
      targetPort: 20001
    - name: http-metrics
      nodePort: 32762
      port: 9090
      protocol: TCP
      targetPort: 9090
  selector:
    app.kubernetes.io/instance: kiali-server
    app.kubernetes.io/name: kiali
  sessionAffinity: None
  type: NodePort

필자는 위의 내용을 간단하게 helm chart로 커스텀 구성을 완료 했습니다.

.
├── Chart.yaml
├── values.yaml
└── templates
    ├── crds
    │   └── crds.yaml
    └── templates
        ├── configmap.yaml
        ├── dashboards
        │   ├── envoy.yaml
        │   ├── go.yaml
        │   ├── kiali.yaml
        │   ├── micrometer-1.1-jvm.yaml
        │   ├── micrometer-jvm-pool.yaml
        │   ├── micrometer-jvm.yaml
        │   ├── microprofile-1.1.yaml
        │   ├── microprofile-x.y.yaml
        │   ├── nodejs.yaml
        │   ├── quarkus.yaml
        │   ├── springboot-jvm-pool.yaml
        │   ├── springboot-jvm.yaml
        │   ├── springboot-tomcat.yaml
        │   ├── thorntail.yaml
        │   ├── tomcat.yaml
        │   ├── vertx-client.yaml
        │   ├── vertx-eventbus.yaml
        │   ├── vertx-jvm.yaml
        │   ├── vertx-pool.yaml
        │   └── vertx-server.yaml
        ├── deployment.yaml
        ├── rolebinding-controlplane.yaml
        ├── rolebinding.yaml
        ├── role-controlplane.yaml
        ├── role-viewer.yaml
        ├── role.yaml
        ├── serviceaccount.yaml
        └── service.yaml

1) 기본 구성 파일

  • configmap.yaml : kiali의 설정 파일
  • deployment.yaml : kiali의 배포 파일
  • service.yaml : kiali 서비스 구성 파일

2) 권한 제어

  • Rolebinding-controlplane.yaml :
  • rolebinding.yaml
  • role-controlplane.yaml
  • role.yaml
  • role-viewer.yaml
  • serviceaccount.yaml : k8s 클러스터내에 모든 영역에 대해서 조회가 가능한 계정

3) 대시보드 파일

  • 대시보드에 대한 내용들을 yaml 파일로 관리합니다.
  • 기본적으로 제공되는 대시보드들에 대해서 helmchart로 구성

2. Kiali 기본

인증 전략

Kiali의 인증전략은 여러가지가 존재합니다. 아래에서 참고 가능하지만, 아쉽게도 ID/PW를 적용하기 위해서는 오픈아이디커넥트(ex. Keycloak)를 적용해야 가능합니다. 따라서 필자는 token방식으로 설정을 해두었고, 토큰값으로 접근제어가 되도록 설정을 하였습니다.

인증 전략

spec:
  auth:
    strategy: token

설정을 하게 되면 최초 로그인시에 Token을 요구하게 됩니다. 이 token의 상단의 serviceaccount에서 생성된 secret 값으로 그대로 복사하여 사용을 하면 됩니다.

기본 네임스페이스 선택

기본적으로 Kiali에 처음 액세스할 떄 대부분의 Kiali 페이지에서 사용자는 네임스페이스 드롭다운을 사용하여 데이터를 보려는 NS를 선택해야 합니다. 이러한 부분을 미리 정의된 네임스페이스 선택을 구성할 수 있습니다.

spec:
  kiali_feature_flags:
    ui_defaults:
      namespaces:
      - istio-system

프로메테우스 구성

Kiali에서는 Prometheus가 토폴로지 그래프를 생성하고, 메트릭을 표시하고, 상태를 계산하고, 기타 기능들을 수행하기 위해 필요합니다.

기본적으로 Kiali는 Prometheus가 istio 추가 기능을 http://prometheus.:9090을 사용하고 있습니다. 만약 Prometheus가 다른 서비스 이름이 있거나 다른 네임스페이스에 있다면 아래와 같이 설정을 변경해야 합니다.

spec:
  external_services:
    prometheus:
      # Prometheus service name is "metrics" and is in the "telemetry" namespace
      url: "http://metrics.telemetry:9090/"

예거 구성

Kiali는 여러 기능에 대해 분산 추적 데이터를 사용하여 향상된 경험을 제공하기 떄문에 Jaeger는 적극 권장 되는 서비스 입니다.

기본적으로 Kiali는 Jaeger Istio 추가 기능을 http://tracing.:16685/jaeger를 사용합니다. 만약 다른 서비스 이름이 있거나 다른 네임스페이스에 설치된 경우 다음 예와 같이 변경을 해야 합니다.

spec:
  external_services:
    tracing:
      # Enabled by default. Kiali will anyway fallback to disabled if
      # Jaeger is unreachable.
      enabled: true
      # Jaeger service name is "tracing" and is in the "telemetry" namespace.
      # Make sure the URL you provide corresponds to the non-GRPC enabled endpoint
      # if you set "use_grpc" to false.
      in_cluster_url: 'http://tracing.telemetry:16685/jaeger'
      use_grpc: true
      # Public facing URL of Jaeger
      url: 'http://my-jaeger-host/jaeger'

Traffic Health

Health

아래 예시처럼, 예를들어 에러 율이 0.1% 이상이면 Degraded상태를 10%이상이면 Failure상태를 표기합니다.

# ...
  health_config:
    rate:
      - namespace: ".*"
        kind: ".*"
        name: ".*"
        tolerance:
          - code: "^5\\d\\d$"
            direction: ".*"
            protocol: "http"
            degraded: 0
            failure: 10
          - code: "^4\\d\\d$"
            direction: ".*"
            protocol: "http"
            degraded: 10
            failure: 20
          - code: "^[1-9]$|^1[0-6]$"
            direction: ".*"
            protocol: "grpc"
            degraded: 0
            failure: 10
# ...
Priority Rule (value=% matching requests) Status
1 value >= FAILURE threshold imgFAILURE
2 value >= DEGRADED threshold AND value < FAILURE threshold imgDEGRADED
3 value > 0 AND value < DEGRADED threshold imgHEALTHY
4 value = 0 imgHEALTHY
5 No traffic imgNo Health Information

3. Kiali 기능 정리

서비스 작업

Traffic management : 라우팅 요청

  • 모든 규칙은 요청에 대해서 일치하는 경우와 라우팅 대상으로 구성이 됩니다.
  • 요청 일치 부분은 Header, Uri, Scheme, Method를 사용하여 여러 필터를 추가 할 수 있습니다.
  • 요청 일치 부분은 비어있을 수 있습니다. 이 경우 모든 HTTP 요청이 규칙에 적용됩니다.
  • 라우팅 대상은 라우팅 되는 트래픽의 비율을 지정할 수 있습니다.

Traffic management : 오류 주입

고의적으로 결함을 주입하여, 서비스의 탄력성을 테스트할 수 있습니다.

  • HTTP 지연 사양은 요청 전달 경로에 대기 시간을 주입한은데 사용됩니다.
  • HTTP 중단 사양은 요청을 즉시 중단하고 미리 지정된 상태 코드를 반환하는 데 사용합니다.

Traffic management : 트래픽 이동

추후 canary 배포 혹은 blue/green 이용시 활용할 수 있는 부분으로 트래픽을 설정을 통해서 Weight를 줄 수 있습니다.

Traffic management : 요청 시간 초과

Istio를 사용하여 Timeout 설정을 지정할 수 있습니다.

  • HTTP 시간 초과는 요청에 대한 시간 초과를 정의합니다.
  • HTTP 재시도는 HTTP 요청이 실패할 때 사용할 재시도 정책을 설명합니다.

Traffic management : 회로 차단기

  • 연결 풀은 업스트림 호스트에 대한 연결 제한을 정의합니다.
  • 이상값 감지는 보고된 연속 오류를 기반으로 회로 차단기를 구현합니다.

4. Tracing 이란

Kiali는 Jaeger for Distributed Tracing과의 기본 통합을 제공합니다. 따라서 사용자는 Jaeger의 추적 시각화에 액세스 할 수 있습니다.

워크로드 세부 정보

워크로드를 조사할 때 추적 탭을 클릭하여 차트에서 추적을 시각화 합니다. 추적을 선택하면 Kiali는 추적 세부 정보에 대한 탭과 범위 세부 정보데 대한 탭을 제공합니다. Kiali는 히트맵 접근 방식을 사용하여 사용자가 문제 추적 또는 범위를 식별하는데 도움을 줍니다.

히트맵

워크로드의 추적 탭에 표시되는 히트맵은 특정 추적의 요청 시간을 시간에 따라 집계된 기간 메트릭과 비교하는 메트릭입니다.

위의 히트맵의 오른쪽 상단 셀은 추적이 나타내는 요청 기간(5.96ms)이 지난 10분 이내에 워크로드에 대한 모든 인바운드 요청의 99번째 백분위수보다 17.5ms 더 빨랐음을 보여줍니다.

셀의 색상 범위는 빨간색과 녹색 사이입니다. 셀이 더 녹색이면 추적 기간이 집계 메트릭 데이터와 비교하여 더 빠릅니다. 빨간색 셀은 연결된 추적이 집계 메트릭 데이터에 비해 훨씬 느리므로 해당 추적을 검사하면 잠재적인 병목 현상이나 문제를 감지하는 데 도움이 될 수 있음을 나타냅니다.

메트릭 상관 관계

Kiali는 메트릭 차트에서 스팬 오버레이를 제공합니다. 사용자는 오버레이 생성 옵션을 활성화하여 spans 을 클릭한 뒤, 추적에 초첨을 맞춘 추적 탭으로 자동으로 이동 됩니다.

그래프 상관 관계

그래프에서 노드를 선택하면 측면에 패널이 나타납니다. 트레이스를 선택하면 그래프는 트레이스 범위에 대한 오버레이를 표시합니다. 그리고 측면 패널은 스팬 세부 정ㅈ보를 표시하고 추적 세부 정보 보기에 대한 링크를 제공합니다.

로그 상관 관계

Kiali는 로그 및 추적 정보에 대한 통합 보기를 제공할 수 있어 사용자가 관심 있는 추적을 식별하기 위해 로그를 사용할 수 있습니다. 옵션을 활성화하면 spansKiali는 워크로드 로그 보기에 추적 항목을 추가합니다. 아래에서 시간 정렬된 순서로 사용자에게 애플리케이션 로그(흰색), Envoy 프록시 로그(금색) 및 추적 공간(파란색)의 통합 보기가 표시됩니다. 관심 범위를 클릭하면 관심 추적에 대한 세부 정보 보기로 이동합니다.

5. 마치며..

kiali를 통해서 네트워크 트래픽에 대한 흐름을 한 눈에 확인 할 수 있었습니다. istio의 기능을 이용하여 트래픽 제어를 손쉽게 할 수 있을뿐 더러, MSA 구조의 복잡한 구조에서 트래픽이 어디서 어디로 흘러가는 지 바로 확인 할 수 있는 점이 너무 좋았습니다.

다음시간에는 istio의 기능들에 대해서 하나씩 정리를 해보도록 하겠습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다