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는 Istio Service Mesh의 시각화와 모니터링을 위한 오픈 소스 도구로, Service Mesh의 구성 요소를 쉽게 이해하고 모니터링할 수 있도록 도와줍니다. Kiali는 Istio의 다양한 기능을 시각적으로 표현하여 Service Mesh의 통합 관리를 지원합니다.
Kiali의 주요 기능:
- 그래프 시각화: Kiali는 서비스 간 통신 및 트래픽 흐름을 그래프 형식으로 시각화합니다. 이를 통해 서비스 간의 관계와 통신 패턴을 쉽게 파악할 수 있습니다.
- 트래픽 모니터링: Kiali는 Service Mesh에서 발생하는 트래픽을 실시간으로 모니터링하여 응답 시간, 오류 상태 및 다양한 지표를 제공합니다. 이를 통해 서비스의 성능을 실시간으로 파악할 수 있습니다.
- 서비스 맵: 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 서비스와의 연결을 확인합니다.


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에 대해 더 알고 싶으시면 아래 폼으로 문의해주세요.
댓글을 달려면 로그인해야 합니다.