14. 서비스 매시 환경 모니터링 도구 istio 시작하기
이 문서는 인프런 강의 "데브옵스를 위한 쿠버네티스 마스터"을 듣고 작성되었습니다. 최대한 요약해서 강의 내용을 최소로 하는데 목표를 두고 있어서, 더 친절하고 정확한 내용을 원하신다면 강의를 구매하시는 것을 추천드립니다. => 강의 링크
istio란 무엇인가
쿠버네티스는 도커를 편리하게 컨트롤할 수 있으며 다양한 이점을 제공한다. 하지만 다수의 컨테이너가 동작할 때 컨테이너의 트래픽을 관찰하고 정상 동작하는지 모니터링하는 것은 매우 어렵다. 이를 해결하는 것이 서비스 매쉬
란 개념이고 이에 대한 구현체 중 하나가 istio
이다.
istio
를 사용하면 다음과 같은 장점이 생긴다.
- 쿠버네티스의 복잡성을 감소시킬 수 있다.
- 트러블 슈팅과 디버깅이 매우 쉬워져서 운영하는데 큰 도움을 준다.
하지만 각 Pod
당 Sidecar
형태로 컨테이너가 1개씩 더 붙기 때문에 성능이 떨어진다는 단점도 있다. istio
의 대표적인 기능은 다음과 같다.
- Connect: 서비스 간 트래픽 및 API 호출 흐름을 지능적으로 제어, 다양한 테스트를 수행하며 Red/Black 배포를 통해 점진적으로 업그레이드가 가능하다.
- Secure: 관리 인증, 권한 부여 및 서비스 간 통신 암호화를 통해 서비스를 자동 보호
- Control: 정책을 제어하고 실행, 소비자에게 공정하게 분배
- Observe: 모든 서비스의 풍부한 자동 추적, 모니터링 및 로깅으로 발생 상황 확인
여기서는 4번째 "Observe"에 관한 내용을 주로 살펴본다.
istio 설치와 적용
"공식 문서" 에 따르면 다음 명령어들을 통해서 istio
를 설치할 수 있다. 먼저 istioctl
을 설치한다.
$ curl -L https://istio.io/downloadIstio | sh -
...
$ cd istio-1.11.1
$ export PATH=$PWD/bin:$PATH
$ istioctl version
no running Istio pods in "istio-system"
1.11.1
그 후 istio
를 다음과 같이 설치할 수 있다. 이 때 "profile"별로 구성할 수 있다. 아래 명령어는 "demo" 프로파일로 istio
를 설치한 것이다.
$ istioctl install --set profile=demo -y
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Egress gateways installed
✔ Installation complete
Thank you for installing Istio 1.11. Please take a few minutes to tell us about your install/upgrade experience! https://forms.gle/kWULBRjUv7hHci7T6
이제 터미널에 다음을 입력해보자. istio
를 위한 리소스가 생성됨을 확인할 수 있다.
$ kubectl get all -n istio-system
NAME READY STATUS RESTARTS AGE
pod/istio-egressgateway-865bcd8956-k52pp 1/1 Running 0 115s
pod/istio-ingressgateway-645fcd9bb6-b9tvd 1/1 Running 0 115s
pod/istiod-85c46bfbbf-z5hz4 1/1 Running 0 2m12s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/istio-egressgateway ClusterIP 10.36.15.167 <none> 80/TCP,443/TCP 114s
service/istio-ingressgateway LoadBalancer 10.36.6.224 34.64.80.39 15021:31681/TCP,80:31704/TCP,443:31298/TCP,31400:30106/TCP,15443:31013/TCP 114s
service/istiod ClusterIP 10.36.6.12 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 2m11s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/istio-egressgateway 1/1 1 1 116s
deployment.apps/istio-ingressgateway 1/1 1 1 116s
deployment.apps/istiod 1/1 1 1 2m13s
NAME DESIRED CURRENT READY AGE
replicaset.apps/istio-egressgateway-865bcd8956 1 1 1 116s
replicaset.apps/istio-ingressgateway-645fcd9bb6 1 1 1 116s
replicaset.apps/istiod-85c46bfbbf 1 1 1 2m13s
이제 쿠버네티스 클러스터의 원하는 Namespace
에 istio
를 적용하면 된다. 여기선 default
에 구성한다.
$ kubectl label namespace default istio-injection=enabled
namespace/default labeled
샘플 프로젝트 구성
이제 샘플 프로젝트를 구성해보자. 터미널에 다음을 입력한다.
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
service/details created
serviceaccount/bookinfo-details created
deployment.apps/details-v1 created
service/ratings created
serviceaccount/bookinfo-ratings created
deployment.apps/ratings-v1 created
service/reviews created
serviceaccount/bookinfo-reviews created
deployment.apps/reviews-v1 created
deployment.apps/reviews-v2 created
deployment.apps/reviews-v3 created
service/productpage created
serviceaccount/bookinfo-productpage created
deployment.apps/productpage-v1 created
이제 얼마 정도 시간이 지난 후, Pod
를 살펴보자.
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
details-v1-79f774bdb9-5kvbl 2/2 Running 0 98s
productpage-v1-6b746f74dc-t9p7q 2/2 Running 0 96s
ratings-v1-b6994bb9-fcfmp 2/2 Running 0 97s
reviews-v1-545db77b95-64884 2/2 Running 0 97s
reviews-v2-7bf8c9648f-dm8z6 2/2 Running 0 97s
reviews-v3-84779c7bbc-jbmw7 2/2 Running 0 96s
모든 Pod
이 2개의 컨테이너가 실행된 것을 확인할 수 있다. 이 Pod
에 붙은 Sidecar
를 통해서 네트워크 모니터링 등을 할 수 있다. 여기서는 Kiali
로 모니터링을 해보자.
먼저 현재 배포된 애플리케이션은 외부에서 액세스할 수가 없다. 이를 해결하려면 istio Ingress Gateway
를 생성해야 한다.
$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created
그 후 구성에 문제가 없는지 확인한다.
$ istioctl analyze
✔ No validation issues found when analyzing namespace: default.
이제 터미널에 다음을 입력해서 수신 IP 및 포트를 설정한다.
$ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
$ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
$ export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}')
이제 해당 IP, PORT에 방화벽을 오픈해준다.
$ gcloud compute firewall-rules create allow-gateway-http --allow "tcp:$INGRESS_PORT"
$ gcloud compute firewall-rules create allow-gateway-https --allow "tcp:$SECURE_INGRESS_PORT"
이제 게이트웨이 URL을 환경 변수로 등록한다.
$ export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
$ echo $GATEWAY_URL
34.64.80.39:80
이제 해당 "GATEWAY_URL/productpage"로 접속해보자. 다음 화면이 뜨면 성공이다.
Kiali 대시보드로 트래픽 관찰하기
이제 Kiali
대시보드를 생성해보자. 터미널에 다음을 입력한다.
$ kubectl apply -f samples/addons
serviceaccount/grafana created
configmap/grafana created
service/grafana created
deployment.apps/grafana created
configmap/istio-grafana-dashboards created
configmap/istio-services-grafana-dashboards created
deployment.apps/jaeger created
service/tracing created
service/zipkin created
service/jaeger-collector created
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
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
$ kubectl rollout status deployment/kiali -n istio-system
Waiting for deployment "kiali" rollout to finish: 0 of 1 updated replicas are available...
deployment "kiali" successfully rolled out
이제 Kiali
대시보드에 액세스한다.
$ istioctl dashboard kiali
http://localhost:20001/kiali
Failed to open browser; open http://localhost:20001/kiali in your browser.
클라우드 쉘에서 실행했을 경우 "http://localhost:20001/kiali"를 클릭한다. 그럼 다음 화면이 보인다.
트래픽이 발생하지 않아서 별로 볼게 없다. 일부러 트래픽을 발생시켜보자. 새로운 터미널에서 다음을 실행한다.
$ for i in $(seq 1 100); do curl -s -o /dev/null "http://$GATEWAY_URL/productpage"; done
얼마 간의 시간이 지나면 다음 화면을 확인할 수 있다.
그리고 kiali
의 장점은 네트워크 트래픽을 모니터링할 수 있다는 것이다. 왼쪽 탭에 "Graph"를 클릭한다. 그 후 상단에 패털을 몇 개 조작하면 다음과 같은 그림을 얻을 수 있다.
약간 분산 트레이싱과 그림이 비슷한데 조금 더 정형화되어있다. 다음과 같은 정보를 확인할 수 있다.
- rps
- 각 서비스간 응답
- inbound/outbound
- 통신 유량