MSA 인프라 구축하기 with Azure(9)-Istio 설치

SeungJu(하늘하늘)·2022년 10월 24일
0

1. Service Mesh란?

Service Mesh란 API 등을 사용하여 서비스 간 통신을 안전하고, 빠르고, 신뢰할 수 있게 설계된 전용 인프라 계층입니다. 서비스메시는 보통 Application 서비스에 경량화 Proxy를 사이드카 방식으로 배치하여 서비스 간 통신을 제어합니다.
MSA에서는 수십, 수백개의 마이크로 서비스가 동작할 수 있는데 이러한 인스턴스들을 관리하는 것은 굉장히 복잡합니다. 또한 인스턴스가 수행되는 네트워크 간의 레이턴시, 신뢰성, 안정성 또한 보장할 수 없다. 이러한 문제점은 Application 단에서 Hystrix와 같은 것을 이용해서 해결할 수 있지만 이 경우 Application 언어 및 런타임에 종속성이 생기는 단점이 발생합니다. 이와 반대로 서비스 매시는 인프라 레벨에서 안정적으로 관리할 수 있는 방식입니다.

2. Istio란?

Istio는 서비스 메시를 구현할 수 있는 오픈소스 솔루션입니다. 이를 통해 로드밸런싱, 모니터링, Circuit breaker 등을 통해 배포된 서비스 네트워크를 쉽게 생성 가능합니다. 서비스 간의 모든 네트워크 통신을 담당할 수 있는 프록시를 사이드카 패턴으로 각 Pod에 배포한 다음 프록시들의 설정 값 저장 및 관리/감독을 수행하고, 프록시들에 설정값을 전달하는 컨트롤러 역할을 수행합니다.
각 서비스에 배포된 프록시를 Data Plane이라 하고, Data Plane을 컨트롤 하는 부분을 Control Plane이라고 합니다.

Control Plane의 구성은 1.4버전까지는 Mixer, Pilot, Citadel, Galley로 구성되어 있었지만 1.5버전부터 통합되었습니다.
과거의 유산이지만 해당 기능들이 사라진 것은 아니니 각 요소들이 무엇을 담당했었는지 알아보겠습니다.

  • Mixer : 서비스 매시 엑세스 컨트롤 및 정책 관리 수행. 플러그인이 가능한 Adapter 구조로 운영하는 인프라에 맞춰서 로깅 및 모니터링 시스템을 손쉽게 변환이 가능합니다.
  • Citadel : 내부에서 사용하는 인증서의 발급, 교체를 담당합니다.
  • Pilot : 프록시 설정 관리를 수행하는 모듈로, 서비스 디스커버리, 서비스 트래픽 라우팅, Retry, Circuit Breaker, timeout 등의 기능을 제공합니다.
  • Galley : Istio의 구성 및 설정 검증, 배포관리를 수행합니다.

Istio 내부에서는 그림에서 보는 것과 같이 서비스간 직접 통신을 하는 것이 아닌 Proxy를 통해서 서로 통신을 하게 됩니다. 이를 통해 Pilot에서 프록시를 컨트롤 해서 Circuit Breaker와 같은 기능을 제공할 수 있습니다.

Circuit Breaker란 ?
마이크로 서비스의 기본 사상 중 하나는 장애가 날 수 있다는 것을 가정하는 것입니다. 하지만 서로 통신을 하는 과정에 있어서, 특히 동기식 호출과 같은 방식으로 통신을 진행할 때에는 한 서비스에서 발생한 장애가 다른 서비스로 전파가 될 수 있습니다. 예를 들어 A서비스에서 B서비스, B서비스에서 C서비스를 호출한다고 가정하였을 때, C 서비스에서 장애가 발생해서 현재 해당 호출을 받을 수 없는 상황이라고 가정해보겠습니다. B서비스에서 C서비스를 동기 호출 했는데 C 서비스에서 올바른 응답을 받을 수 없으므로 B는 다시 C서비스를 계속해서 호출하게 됩니다. 이렇게 되면 B서비스까지 C서비스로 인해 장애가 전파되고, 이로인해 A서비스까지 장애가 전파되는 상황이 발생하는 것입니다. 이러한 일을 막기 위해 특정 서비스에 장애가 발생했다고 판단이 되면 해당 서비스를 차단(회로 차단)하는 패턴을 circuit Breaker라고 합니다.

3. Istio 설치

Istio 설치
$ curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.11.3 TARGET_ARCH=x86_64 sh -
$ cd istio-1.11.3
$ export PATH=$PWD/bin:$PATH
Profile 설치

Profile을 이용해서 Istio 구성(Control Plane, Data Plane)을 Custom 할 수 있습니다.

$ istioctl profile list
Istio configuration profiles:
    default
    demo
    empty
    external
    minimal
    openshift
    preview
    remote
$ istioctl install --set profile=default --set hub=gcr.io/istio-release
This will install the Istio 1.11.3 default profile with 
["Istio core" "Istiod" "Ingress gateways"] 
components into the cluster. Proceed? (y/N) y
추가 오픈소스 설치

현재 예제에서는 addons에 있는 모든 서비스를 설치하도록 하였지만 필요없는 것이 있다면 개별로 하나씩 설치해도 됩니다.

$ cd istio-1.11.3/samples/addons
$ ll
total 292
drwxr-xr-x  3 root root   6144 Sep 21  2021 ./
drwxr-xr-x 21 root root   6144 Sep 21  2021 ../
-rw-r--r--  1 root root   5194 Sep 21  2021 README.md
drwxr-xr-x  2 root root   6144 Sep 21  2021 extras/
-rw-r--r--  1 root root 245502 Sep 21  2021 grafana.yaml
-rw-r--r--  1 root root   2533 Sep 21  2021 jaeger.yaml
-rw-r--r--  1 root root  11008 Sep 21  2021 kiali.yaml
-rw-r--r--  1 root root  13633 Sep 21  2021 prometheus.yaml

$ kubectl apply -f samples/addons

# istio-system namespace가 생성되었는지 확인
$ kubectl get namespace
NAME              STATUS   AGE
default           Active   3h6m
istio-system      Active   5m24s
kube-node-lease   Active   3h6m
kube-public       Active   3h6m
kube-system       Active   3h6m

# 배포된 서비스들 확인
$ kubectl get svc -n istio-system
$ kubectl edit svc kiali -n istio-system

#외부에서 접속이 가능하도록 Kiali, Jaeger, Grafana를 LoadBalancer로 변경
:%s/ClusterIP/LoadBalancer/g
:wq!
service/kiali edited

$ kubectl edit svc tracing -n istio-system
:%s/ClusterIP/LoadBalancer/g
:wq!
service/tracing edited

$ kubectl edit svc grafana -n istio-system
:%s/ClusterIP/LoadBalancer/g
:wq!
service/grafana edited

Kiali : Istio를 통해 구성한 서비스 메시를 모니터링 할 수 있는 툴로 각 서비스 간의 통신을 그래프를 통해 확인 가능
Jaeger : 서비스간 분산 추적이 가능한 모니터링 툴
Grafana : 매트릭 시각화 툴


다음 포스팅에는 Spring Cloud gateway로 구현한 인증/인가를 포스팅하겠습니다.

profile
나의 개발 세상

0개의 댓글