istio(이스티오) 이란 무엇인가

seoyeon hwang
7 min readJun 12, 2022

kubeflow는 내부적으로 istio를 사용하여 k8s 위에 올라간 서비스들을 연결하고 있다. 관련 디버깅을 하다보니 어떤 놈인지 자세히 알고싶어져서 istio에 대해 정리하게 되었다.

이번 글에서는 istio 정의와 동작 방식을 살펴보고, minikube 환경에 istio를 설치한 후 간단한 어플리케이션을 배포하는 튜토리얼을 진행한다 :)

service mesh

service mesh는 MSA에서 마이크로 서비스간 통신을 제어하고 관리할 수 있는 인프라 계층으로 service discovery, load balancing, failure recovery, monitoring 등을 지원한다.

MSA 시스템의 규모가 커질수록 관리가 복잡해지고, 많은 인스턴스가 수행되면서 네트워크 안정성도 보장할 수 없다. 이러한 문제점을 service mesh를 통해 어플리케이션 계층에서 해결하지 않고, 코드 수정없이 인프라 레벨에서 해결할 수 있다.

mesh network

service mesh는 마이크로 서비스마다 경량화 프록시를 서비스 내부가 아닌 sidecar 방식으로 배치하며 서비스 간 통신을 제어한다. 이러한 sidecar proxy들이 모여서 mesh network를 형성한다.

istio 정의

istio는 service mesh를 구현할 수 있는 오픈소스다. 즉, istio를 사용하면 코드 변경없이 마이크로 서비스들끼리 안전하게 통신하고, 모니터링 할 수 있는 효율적이고 일관된 방법을 제공할 수 있다.

쿠버네티스 환경에 구축된 어플리케이션이 복잡해져서 기본 쿠버네티스 컨트롤러만으로는 커버하기 힘들어질 때 많은 경우 istio를 도입하여 해결한다고 한다. istio를 통해 쿠버네티스에 올려진 서비스들의 연결 관리를 더 유연하게 할 수 있기 때문이다.

istio 사용 전과 후 아키텍쳐 차이를 보면 확실히 서비스가 많을수록 관리가 편해질 것을 예상해볼 수 있다.

istio 동작 방식

istio는 data plane과 control plane 2가지 컴포넌트로 구성되어있다.

data plane

data plane은 서비스와 사이드카로 배포된 envoy proxy의 집합이다. 각각의 envoy proxy는 서비스로 들어오고 나가는 모든 트래픽을 통제하고 관리한다.

control plane

envoy를 컨트롤하는 부분이다. 1.4 버젼까지는 pilot, mixer, citadel, galley로 구성되어있었고, 1.5 버젼부터는 istiod라는 하나의 모듈로 통합되었다. istiod는 envoy 설정을 변경하여 트래픽을 세부 제어하거나 인증 관리를 통해 서비스 간 또는 사용자 인증 기능을 지원한다.

튜토리얼

이번 튜토리얼에서는 minikube 환경에 istio를 설치하고 어플리케이션을 배포해본다. 추가적으로 kiali 대시보드를 통해 서비스간 연결이나 트래픽을 확인해볼 것이다. (공식 문서 튜토리얼)

1) istio 다운로드

# latest 버젼 istio 설치
curl -L https://istio.io/downloadIstio | sh -
cd istio-1.14.1
export PATH=$PWD/bin:$PATH

2) istio 설치

# istio 설치
istioctl install --set profile=demo -y
# istio가 자동으로 envoy sidecar를 추가하도록 설정
kubectl label namespace default istio-injection=enabled

3) 예제 어플리케이션 Bookinfo 배포

해당 어플리케이션의 각 파드가 준비되면 istio sidecar가 따라서 배포된다.

# 어플리케이션 bookinfo 배포
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

4) 외부 접근 설정

외부에서 bookinfo 어플리케이션에 접근하기 위해서는 istio ingess gateway를 생성해서 path를 mesh의 끝에 맵핑해줘야한다.

# ingress-gateway 생성
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

ingress host와 ingess port를 설정해서 외부 접근이 가능한지 테스트해보자.

# 새 터미널 창을 열고 아래 명령어 실행
minikube tunnel
# ingress host, post 설정
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}')# 접근 url 설정
export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

웹 화면에서 http://$GATEWAY_URL/productpage (ex. http://127.0.0.1:80/productpage) 로 접근하면 bookinfo 화면을 볼 수 있다.

bookinfo 화면

5) kiali를 통한 모니터링

kiali를 설치하면 서비스들의 상태, 연결 흐름을 대시보드를 통해 확인할 수 있다. 트래픽을 시각화할 수 있는 필터 또한 제공한다.

# kiali 설치
kubectl apply -f samples/addons
kubectl rollout status deployment/kiali -n istio-system
# kiali 대시보드 접근
istioctl dashboard kiali

웹에서 http://$GATEWAY_URL/productpage로 외부에서 접근하면 위와 같이 istio-ingessgateway에서 productpage로 트래픽이 생기는 것을 볼 수 있다.

istio에 대해 공부하다보니 생각보다 유명한(??) 기술이어서 재밌게 공부했다. 회사에서 쿠버네티스 환경을 많이 쓰고있는데 기회되면 istio를 도입해보고싶다 :)

--

--