개발강의정리/DevOps

[데브옵스를 위한 쿠버네티스 마스터] 서비스 매쉬 환경 모니터링 도구 isio 시작하기

nineDeveloper 2021. 1. 19.
728x90

쿠버네티스 Istio 네트워크 메시 환경 모니터링

https://istio.io/docs/concepts/what-is-istio/


1. Istio는 무엇인가?

쿠버네티스는 도커를 편리하게 컨트롤할 수 있게 하고 다양한 이점을 제공한다

그러나 다수의 컨테이너가 동작하는 경우에는 각 컨테이너의 트래픽을 관찰하고 정상 동작하는지 모니터링하기가 어렵기 때문에 DevOps 팀에 부담이 될 수 있다

개발자는 이식성을 위해 마이크로서비스를 사용하여 아키텍처를 설계하고 운영자는 이 컨테이너들을 다양한 클러스터에 배포하고 관리한다
서비스 메시의 크기와 복잡성이 커짐에 따라 이해하고 관리하기가 더 어려워진다(예: 로드 밸런싱, 장애 복구, 메트릭 및 모니터링)

Istio는 이런 쿠버네티스 환경의 네트워크 메시 이슈를 보다 간편하게 해결하기 위해 지원하는 환경이다

서비스 메시란?
응용 프로그램과 이들 간의 상호 작용을 구성하는 마이크로 서비스 네트워크 구조


2. 왜 Istio를 사용해야 하나요?

Istio를 도입하면 쿠버네티스의 복잡성을 감소시킬 수 있다
쿠버네티스를 빗롯한 다양한 플랫폼에서 사용하는 서비스메시 환경을 돕는 프로젝트다
Istio를 사용하면 서비스의 연결, 보안, 제어 및 관찰 기능을 구현할 수 있다
이 기능으로 복잡성을 줄여 개발 팀의 부담 감소시키고 모든 컨테이너를 로깅하거나 원격 측정, 정책 시스템을 통합할 수 있는 API 플랫폼이다
Istio의 다양한 기능을 사용하면 서비스 매시 환경을 보다 효율적으로 관리할 수 있다

Istio의 매력은 서비스의 코드를 거의 변경하지 않고도 로드 밸런싱, 서비스 간 인증, 모니터링 등을 통해 배포 된 서비스 네트워크를 쉽게 생성 가능하든 점에 있다
별다른 수정 없이 네임스페이스에 설정 옵션을 주고 바로 컨테이너를 배포하면 관찰된다
마이크로서비스 간의 모든 네트워크 통신을 관찰하는 특수 사이드카 프록시를 배치해 각 포드에 istio-proxy 사이드카를 통해 모니터링할 수 있다


3. Istio의 기능

Istio 메인 화면 https://istio.io/

기능 설명
연결 서비스 간의 트래픽 및 API 호출 흐름을 지능적으로 제어하고 다양한 테스트를 수행하며
Red/Black 배포를 통해 점진적으로 업그레이드
보안 관리 인증, 권한 부여 및 서비스 간 통신 암호화를 통해 서비스를 자동으로 보호
제어 정책을 제어하고 실행, 소비자에게 공정하게 분배
관찰 모든 서비스의 풍부한 자동 추적, 모니터링 및 로깅으로 발생 상황 확인

4. Istioctl 최신 버전 다운로드 및 설치

$ curl -L https://istio.io/downloadIstio | sh -
$ cd istio-1.8.2
$ export PATH=$PWD/bin:$PATH
$ istioctl
Istio configuration command line utility for service operators to
debug and diagnose their Istio mesh.

Usage:
  istioctl [command]

Available Commands:
  analyze         Analyze Istio configuration and print validation messages
  authz           (authz is experimental. Use `istioctl experimental authz`)
  bug-report      Cluster information and log capture support tool.
  convert-ingress Convert Ingress configuration into Istio VirtualService configuration [Deprecated, it will be removed in Istio 1.9]
  dashboard       Access to Istio web UIs
  deregister      De-registers a service instance [Deprecated, it will be removed in Istio 1.9]
  experimental    Experimental commands that may be modified or deprecated
  help            Help about any command
  install         Applies an Istio manifest, installing or reconfiguring Istio on a cluster.
  kube-inject     Inject Envoy sidecar into Kubernetes pod resources
  manifest        Commands related to Istio manifests
  operator        Commands related to Istio operator controller.
  profile         Commands related to Istio configuration profiles
  proxy-config    Retrieve information about proxy configuration from Envoy [kube only]
  proxy-status    Retrieves the synchronization status of each Envoy in the mesh [kube only]
  register        Registers a service instance (e.g. VM) joining the mesh [Deprecated, it will be removed in Istio 1.9]
  upgrade         Upgrade Istio control plane in-place
  validate        Validate Istio policy and rules files
  verify-install  Verifies Istio Installation Status
  version         Prints out build version information

Flags:
      --context string          The name of the kubeconfig context to use
  -h, --help                    help for istioctl
  -i, --istioNamespace string   Istio system namespace (default "istio-system")
  -c, --kubeconfig string       Kubernetes configuration file
  -n, --namespace string        Config namespace

Additional help topics:
  istioctl options         Displays istioctl global options

Use "istioctl [command] --help" for more information about a command.

5. Istio 설치 프로파일

Istio를 설치할 때 원하는 프로파일을 지정하여 원하는 구성의 istio를 설치할 수 있다
X가 포함돼 있다는 체크 표시다

설치 구성 프로파일 https://istio.io/docs/setup/additional-setup/config-profiles/

default

IstioOperator API

의 기본 설정에 따라 컴포넌트를 사용한다 (실제 서비스 환경에 권장)
명령을 실행하여 기본 설정을 표시 할 수 있습니다

istioctl profile dump

demo

적당한 리소스 요구 사항으로 Istio 기능을 보여 주도록 설계된 구성됐다
모든 구성을 설치해 높은 수준의 추적 및 액세스 로깅을 가능하게 한다
그러나 성능 테스트에 적합하지는 않다

현재 istioctl로 설치가능한 리스트를 살펴보자

$ istioctl profile list
Istio configuration profiles:
    default
    demo
    empty
    minimal
    openshift
    preview
    remote

원하는 컴포넌트와 애드온만 설치하기 원하는 경우에는 설치 후 원하는 컴포넌트를 다음 링크를 참고하기 바란다

https://istio.io/docs/setup/install/istioctl/#customizing-the-configuration


6. istioctl을 활용한 istio 설치

istio 설치를 수행해보자
다음 명령으로 간단히 설치할 수 있다
컨테이너를 직접 배치하기 때문에 5분 정도의 시간이 소요된다
원하는 프로파일이 다른 경우에는 profile=<프로파일 명>을 바꿔주면 된다

$ istioctl install --set profile=demo -y
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Egress gateways installed
✔ Installation complete

※ 디폴트 프로파일 설치 후 다음 명령을 사용하면 컴포넌트와 애드온을 추가로 설치할 수 있다
demo를 설치하는 경우에는 모든 것들이 설치된다


7. 샘플 프로젝트에 Istio 적용하기

설치가 완료되면 네임스페이스마다 istio를 사용할지 설정할 수 있다
istio-injection 레이블을 추가하면 배포되는 네임스페이스의 포드에 istio가 함께 설치된다

$ kubectl label namespace default istio-injection=enabled
namespace/default labeled

미리 준비된 샘플 프로젝트인 bookinfo 배포를 수행한다
그리고 포드가 정상 동작하는지 확인한다

$ 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-79c697d759-7szjp       2/2     Running   0          4m3s
productpage-v1-65576bb7bf-kllvw   2/2     Running   0          4m2s
ratings-v1-7d99676f7f-twdbf       2/2     Running   0          4m3s
reviews-v1-987d495c-r9f85         2/2     Running   0          4m2s
reviews-v2-6c5bf657cf-w795h       2/2     Running   0          4m2s
reviews-v3-5f7b9f4f77-zhbr4       2/2     Running   0          4m2s

bookinfo MSA 아키텍처
그림 출처: https://istio.io/docs/examples/bookinfo/


8 게이트웨이 설치와 관찰

애플리케이션을 생성했지만 게이트웨이를 추가로 생성해야 외부로 접근이 가능해진다
gateway는 istio가 배포한 커스텀된 오브젝트다
마치 쿠버네티스에서 제공되는 Ingress처럼 동작한다

$ kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
gateway.networking.istio.io/bookinfo-gateway created
virtualservice.networking.istio.io/bookinfo created

다음 명령을 실행해 gateway가 잘 설정됐는지 확인한다

$ kubectl get gateways
NAME               AGE
bookinfo-gateway   12m

이 gateway는 istio-system의 레이블이 istio=ingressgateway인 svc에 설정을 추가한다

# samples/bookinfo/networking/bookinfo-gateway.yaml
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

셀렉터로 연결된 istio=ingressgateway svc를 찾아보면 istio 디폴트 컨트롤러를 확인할 수 있다
여기서는 80:32148 포트를 사용하고 있다

$ kubectl get svc -n istio-system -l istio=ingressgateway --all-namespaces
NAMESPACE      NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                                                                                      AGE
istio-system   istio-ingressgateway   LoadBalancer   10.96.248.127   <pending>     15020:31660/TCP,80:32148/TCP,443:31794/TCP,15029:30815/TCP,15030:30286/TCP,15031:31728/TCP,15032:31331/TCP,31400:30437/TCP,15443:31420/TCP   3h6m

애플리케이션으로 접속해보자
노드의 IP를 적고 32148포트로 접속한다
로드밸런서가 만들어지는 클라우드환경이라면 로드밸런서를 이용해도 괜찮다

productpage에 접속된 화면

뒤 따라오는 설정인 VirtualService는 bookinfo-gateway와 연결돼 있다
/productpage 등의 경로를 접근하면 productpage라는 서비스의 9080포트로 연결한다

# samples/bookinfo/networking/bookinfo-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-gateway
  http:
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080

연결된 구조를 보면 다음과 같다
외부 트래픽은 istio-ingress로부터 들어와서 게이트웨이를 통해 실제 서비스하는 포드로 연결된다

외부에서 실제 서비스 중인 포드에 연결되기까지


9 Istio 대시보드: Kiali

istioctl의 dashboard 명령을 사용하면 다양한 서비스에 접근할 수 있다
이중에 원하는 서비스를 선택하면 된다

$ istioctl dashboard
Access to Istio web UIs
<중략>

Available Commands:
  controlz    Open ControlZ web UI
  envoy       Open Envoy admin web UI
  grafana     Open Grafana web UI
  jaeger      Open Jaeger web UI
  kiali       Open Kiali web UI
  prometheus  Open Prometheus web UI
  zipkin      Open Zipkin web UI

kiali를 사용하면 현재 사용하는 애플리케이션의 트래픽 구조를 확인할 수 있다
다음 명령을 실행하면 자동으로 브라우저가 실행된다

istioctl dashboard kiali

왼쪽 메뉴에서 Graph를 선택하고 default 네임스페이스를 선택하면 다음과 같은 그림을 볼 수 있다
내부에 사용되는 proxy를 통해 관찰하기 때문에 클라이언트 요청이 없거나 충분하지 않으면 그래프가 일부 그려지지 않을 수 있다
watch 명령을 사용하면 2초에 한 번 씩 url로 계속 접근한다

watch curl http://127.0.0.1:32148/productpage

그래프의 모양은 앞서 살펴본 MSA 아키텍처와 거의 동일하다

(왼쪽)Kiali에서 모니터링하는 화면, (오른쪽)bookinfo MSA 아키텍처

728x90

댓글

💲 추천 글