ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 14. 서비스 매시 환경 모니터링 도구 istio 시작하기
    개발 스터디/데브옵스(DevOps)를 위한 쿠버네티스 마스터 2021. 8. 31. 20:11
    반응형

    이 문서는 인프런 강의 "데브옵스를 위한 쿠버네티스 마스터"을 듣고 작성되었습니다. 최대한 요약해서 강의 내용을 최소로 하는데 목표를 두고 있어서, 더 친절하고 정확한 내용을 원하신다면 강의를 구매하시는 것을 추천드립니다. => 강의 링크

    istio란 무엇인가

    쿠버네티스는 도커를 편리하게 컨트롤할 수 있으며 다양한 이점을 제공한다. 하지만 다수의 컨테이너가 동작할 때 컨테이너의 트래픽을 관찰하고 정상 동작하는지 모니터링하는 것은 매우 어렵다. 이를 해결하는 것이 서비스 매쉬란 개념이고 이에 대한 구현체 중 하나가 istio이다.

     

    istio를 사용하면 다음과 같은 장점이 생긴다.

    1. 쿠버네티스의 복잡성을 감소시킬 수 있다.
    2. 트러블 슈팅과 디버깅이 매우 쉬워져서 운영하는데 큰 도움을 준다.

    하지만 각 PodSidecar 형태로 컨테이너가 1개씩 더 붙기 때문에 성능이 떨어진다는 단점도 있다. istio의 대표적인 기능은 다음과 같다.

    1. Connect: 서비스 간 트래픽 및 API 호출 흐름을 지능적으로 제어, 다양한 테스트를 수행하며 Red/Black 배포를 통해 점진적으로 업그레이드가 가능하다.
    2. Secure: 관리 인증, 권한 부여 및 서비스 간 통신 암호화를 통해 서비스를 자동 보호
    3. Control: 정책을 제어하고 실행, 소비자에게 공정하게 분배
    4. 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

     

    이제 쿠버네티스 클러스터의 원하는 Namespaceistio를 적용하면 된다. 여기선 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
    • 통신 유량
Designed by Tistory.