Kiali 및 Prometheus를 활용한 Istio Service Mesh 시각화 방법

이 포스트에서는 Kiali, Prometheus 구성을 통해 Istio Service Mesh를 시각화하는 방법에 대해 다룹니다. Kiali는 Istio Service Mesh의 관리/모니터링에 필수적인 도구로, 복잡한 Service Mesh 환경을 시각적으로 이해하고 관리할 수 있도록 도와줍니다. 이를 통해 service mesh의 안정성과 성능을 향상하는 데 도움이 됩니다.

이 포스트에서는 Istio, NGINX Ingress Controller가 이미 구성된 환경에서, Kiali, Prometheus를 활용한 시각화 구성에 관련된 내용만을 다룹니다. Istio와 NGINX Ingress Controller의 구성에 관한 내용은 여기를 참고하세요.

목차

1. Kiali란?
2. Prometheus 구성하기
3. Kiali 구성하기

1. Kiali란?

Kiali logo

Kiali는 Istio Service Mesh의 시각화와 모니터링을 위한 오픈 소스 도구로, Service Mesh의 구성 요소를 쉽게 이해하고 모니터링할 수 있도록 도와줍니다. Kiali는 Istio의 다양한 기능을 시각적으로 표현하여 Service Mesh의 통합 관리를 지원합니다.

Kiali의 주요 기능:

  1. 그래프 시각화: Kiali는 서비스 간 통신 및 트래픽 흐름을 그래프 형식으로 시각화합니다. 이를 통해 서비스 간의 관계와 통신 패턴을 쉽게 파악할 수 있습니다.
  2. 트래픽 모니터링: Kiali는 Service Mesh에서 발생하는 트래픽을 실시간으로 모니터링하여 응답 시간, 오류 상태 및 다양한 지표를 제공합니다. 이를 통해 서비스의 성능을 실시간으로 파악할 수 있습니다.
  3. 서비스 맵: Kiali는 Service Mesh의 전반적인 구조를 시각적으로 표현하는 서비스 맵을 제공합니다. 이를 통해 서비스 간의 의존성 및 통신 경로를 파악할 수 있습니다.

2. Prometheus 구성하기

Kiali를 통한 기본적인 Istio service mesh 시각화를 위해서는 Prometheus가 사전 구성되어야 합니다.

Istio는 Prometheus, Kiali를 포함한 시각화에 필요한 애플리케이션의 yaml 파일을 GitHub에서 제공하고 있습니다. Istio 설치 파일을 다음 명령어를 통해 다운로드했다면, 해당 경로에 구성 파일이 포함되어 있습니다.

$ curl -L https://istio.io/downloadIstio | sh -

$ ls istio-1.21.2/samples/addons/

extras  grafana.yaml  jaeger.yaml  kiali.yaml  loki.yaml  prometheus.yaml  README.md

1. prometheus.yaml 파일을 통해 Prometheus를 배포합니다.

$ kubectl apply -f prometheus.yaml 

serviceaccount/prometheus created
configmap/prometheus created
clusterrole.rbac.authorization.k8s.io/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
service/prometheus created
deployment.apps/prometheus created

2. istio-system 네임스페이스에 배포된 것을 확인할 수 있습니다.

$ kubectl get pod -n istio-system

NAME                                    READY   STATUS    RESTARTS   AGE
istiod-6d79fdc756-xg8pk                 1/1     Running   0          24m
prometheus-7545dd48db-h6scr             2/2     Running   0          4m8s

$ kubectl get svc -n istio-system

NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                      AGE
istiod             ClusterIP   10.110.193.248   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP            24m
prometheus         ClusterIP   10.103.98.62     <none>        9090/TCP                                         26m    

3. Kiali 구성하기

Kiali의 yaml 파일도 Prometheus의 yaml 파일과 같은 경로에 존재합니다.

$ ls istio-1.21.2/samples/addons/

extras  grafana.yaml  jaeger.yaml  kiali.yaml  loki.yaml  prometheus.yaml  README.md

1. kiali.yaml 파일을 통해 Kubernetes 클러스터에 Kiali 구성 요소들을 배포합니다.

$ kubectl apply -f kiali.yaml 

serviceaccount/kiali created
configmap/kiali created
clusterrole.rbac.authorization.k8s.io/kiali-viewer created
clusterrole.rbac.authorization.k8s.io/kiali created
clusterrolebinding.rbac.authorization.k8s.io/kiali created
role.rbac.authorization.k8s.io/kiali-controlplane created
rolebinding.rbac.authorization.k8s.io/kiali-controlplane created
service/kiali created
deployment.apps/kiali created

Kiali 구성 요소들은 istio-system 네임스페이스에 배포됩니다.

$ kubectl get pod -n istio-system 

NAME                                    READY   STATUS    RESTARTS   AGE
istiod-6d79fdc756-z9qkk                 1/1     Running   0          17d
kiali-588bc98cd-97rld                   1/1     Running   0          49m
prometheus-7545dd48db-h6scr             2/2     Running   0           1h

$ kubectl get svc -n istio-system 

NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                      AGE
istiod                 ClusterIP      10.110.193.248   <none>        15010/TCP,15012/TCP,443/TCP,15014/TCP        31d
kiali                  ClusterIP      10.103.6.70      <none>        20001/TCP                                    50m
prometheus         ClusterIP   10.103.98.62     <none>        9090/TCP                                         1h    

Kiali의 서비스는 20001번 포트에서 실행 중임을 확인할 수 있습니다.

2. NGINX Ingress Controller를 통해 Kiali의 서비스에 연결하기 위해 VirtualServer를 배포합니다.

# kiali-vs.yaml

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
  name: kiali
  namespace: istio-system
spec:
  host: test.kiali.com
  upstreams:
  - name: kiali
    service: kiali
    port: 20001
  routes:
  - path: /
    action:
      pass: kiali

테스트를 위해 임의의 호스트 명(test.kiali.com)을 사용하고, hosts 파일을 수정하여 해당 호스트 명을 추가했습니다.

3. 외부에서 Kiali서비스에 접근하기 위해 NGINX Ingress Controller을 NodePort 서비스로 배포하고, 포트 번호를 확인합니다.

$ kubectl get svc -n nginx-ingress

NAME            TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
nginx-ingress   NodePort   10.111.26.1   <none>        80:30318/TCP,443:30588/TCP   16h

4. test.kiali.com:30348 주소로 접속하여, Kiali 서비스와의 연결을 확인합니다.

kiali graph

Graph 메뉴에서 지정된 네임스페이스(istio, nginx-ingress)에 배포된 파드와 서비스를 확인할 수 있습니다.

$ kubectl get pod,svc -n istio

NAME                          READY   STATUS    RESTARTS      AGE
pod/coffee-6b8b6d6486-2gml9   2/2     Running   2 (92m ago)   155m
pod/coffee-6b8b6d6486-6cpvm   2/2     Running   2 (92m ago)   155m
pod/tea-9d8868bb4-vbbx2       2/2     Running   2 (92m ago)   155m

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/coffee-svc   ClusterIP   10.105.99.144   <none>        80/TCP    20h
service/tea-svc      ClusterIP   10.100.190.74   <none>        80/TCP    20h

$ kubectl get pod,svc -n nginx-ingress

NAME                                 READY   STATUS    RESTARTS      AGE
pod/nginx-ingress-5454497bb7-dsrhc   2/2     Running   2 (13m ago)   13m

NAME                    TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)                      AGE
service/nginx-ingress   NodePort   10.111.26.1   <none>        80:30318/TCP,443:30588/TCP   19h

4. istio 네임스페이스의 tea, coffee 서비스에 요청을 보내면, Graph 메뉴에서 트래픽의 경로를 확인할 수 있습니다.

Kiali와 Prometheus 구성을 통해 Istio service mesh를 시각화하기 위한 기초적인 구성이 완료됐습니다.

Istio Service Mesh에 대해 더 알고 싶으시면 아래 폼으로 문의해주세요.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required