-
14. 서비스 매시 환경 모니터링 도구 istio 시작하기24년 11월 이전/데브옵스(DevOps)를 위한 쿠버네티스 마스터 2021. 8. 31. 20:11반응형
이 문서는 인프런 강의 "데브옵스를 위한 쿠버네티스 마스터"을 듣고 작성되었습니다. 최대한 요약해서 강의 내용을 최소로 하는데 목표를 두고 있어서, 더 친절하고 정확한 내용을 원하신다면 강의를 구매하시는 것을 추천드립니다. => 강의 링크
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
- 통신 유량
728x90'레거시 > 데브옵스(DevOps)를 위한 쿠버네티스 마스터' 카테고리의 다른 글
16. 클러스터 유지와 보안 트러블 슈팅 (2) (0) 2021.09.08 15. 클러스터 유지와 보안 트러블 슈팅 (1) (0) 2021.09.01 13. 리소스 로깅과 모니터링 (0) 2021.08.30 12. 애플리케이션 스케줄링과 라이프사이클 관리 (2) (0) 2021.08.20 11. 애플리케이션 스케줄링과 라이프사이클 관리 (1) (0) 2021.08.17