•
Service Mesh의 오픈소스
•
기존의 응용프로그램 위에 레이어링되어 다양한 동작들을 수행
Istio가 제공하는 기능들
•
클러스터 내부에서 TLS암호화를 이용한 서비스간 안전한 통신 제공
•
HTTP, gRPC, WebSocket 및 TCP 트래픽에 대한 로드 밸런싱
•
재시도, 다양한 라우팅 규칙, fault injection 등을 통해 세부 트래픽 동작을 제어
Components of App Mesh
•
Service mesh
•
Virtual services
•
Virtual nodes
•
Envoy Proxy
•
Virtual Routers
•
Routes
트래픽 관리
트래픽 관리는 로드 밸런싱, 서킷 브레이크, 커스텀 HTTP 헤더 추가 등을 지원합니다.
A 서비스와 B 서비스가 있고, B 서비스는 2개 인스턴스로 스케일링되어 있습니다. 이 때, A, B 서비스는 Istio 네트워크에 있습니다.
Istio는 A 서비스 -> B 서비스로 로드 밸런싱 할 때 마음대로 비율을 정할 수 있습니다. 아래 그림은 2:8비율로 로드 밸런싱을 했습니다.
옵저빌리티
옵저빌리티는 istio 네트워크 안에서 발생하는 트래픽을 추적하고 분석하며 시각화합니다. 어느 구간에서 지연이 발생하는지, 장애가 발생하는지 등을 쉽게 발견할 수 있습니다.
•
추적하고 분석한 결과는 아래 그림처럼 시각화됩니다.
보안
보안은 istio 네트워크에서 발생하는 트래픽을 보호하고 트래픽을 승인/거부할 수 있습니다. TLS 또는 mTLS를 적용하며 istio 네트워크에서 발생하는 모든 트래픽을 암호화합니다. 그리고 원치 않은 트래픽은 거부할 수 있도록 트래픽 권한을 설정할 수 있습니다.
Architecture
Data Plane
•
마이크로서비스간 네트워킹 통신을 담당
•
마이크로서비스는 직접 통신하지 않고 사이드카 패턴으로 설치된 Enovy와 통신
◦
마이크로서비스로 요청하면 Enovy Proxy가 대신 받아 전달하고 응답도 전달 받아 전달을 진행
•
각 서비스를 Enovy Proxy와 함께 배포 (사이드카 패턴 방식)
•
서비스로 또는 서비스로부터 나가는 모든 네트워크 패킷을 변환, 전달 및 모니터링
Control Plane
•
회로 차단, 로드 밸런싱, 타임아웃 등의 기본 구성 정보를 저장
•
기본 구성 정보에 맞게 각 서비스의 프록시를 동작
Istio Proxy의 작동원리
•
istio는 Kubernetes 클러스터 내에서 네트워크 흐름을 통제하는 오픈소스입니다.
•
Istio는 Envoy Proxy를 사이드카 형태로 배포하여 트래픽을 관리합니다. 프록시 컨테이너는 iptable을 조작하여 네트워크 패킷을 중간에 가로채며 가로채는 과정은 로그를 확인하기 어려워서 Istio 사용 시 트래픽 흐름을 이해하지 못하는 경우가 많습니다.
Istio envoy를 동적으로 설정하는 원리
Istio에서는 사이드카로 설치된 Proxy를 동적으로 설정 변경이 필요합니다. Enovy Proxy에서는 동적으로 변경할 수 있는 XDS프로토콜을 지원합니다. Kubernetes환경에서 Istio는 Aggregated Discovery Service (ADS)를 사용하고 istiod가 동적 설정을 담당합니다.
사이드카 주입과 init 컨테이너
Kubernetes Namespace에 istio-injection=enabled라벨을 붙이면 webhook을 통해 istiod에 /inject API를 호출합니다. istiod는 파드에 프록시 컨테이너와 init 컨테이너를 주입합니다. init 컨테이너의 이름은 istio-init 입니다. init 컨테이너는 서비스 컨테이너가 생성되기 전에 먼저 작업을 수행하며 작업의 내용은 istio-iptables 명령어입니다. istio-iptables는 네트워크 트래픽을 제어하기 위한 iptable 작업을 수행
Istio Profile
•
Default
◦
이 프로필은 IstioOperator API의 기본 설정에 따라 구성 요소를 활성화합니다. 이 프로필은 프로덕션 배포 및 다중 클러스터 메시의 기본 클러스터에 권장됩니다.
•
Demo
◦
이 구성은 적당한 리소스 요구 사항으로 Istio 기능을 시연하도록 설계되었습니다. Bookinfo 애플리케이션(Istio가 제공하는 샘플 애플리케이션 - Bookinfo 애플리케이션을 사용하여 Istio 서비스 메시 구축) 및 관련 작업을 실행하는 데 적합합니다. 이 프로필은 높은 수준의 추적 및 액세스 로깅을 지원하므로 성능 테스트에는 적합하지 않습니다.
•
Minimal
◦
기본 프로필과 동일하지만, 제어 플레인 구성 요소만 설치됩니다. 이를 통해 별도의 프로필을 사용하여 제어 플레인 및 데이터 플레인 구성 요소(예: 게이트웨이)를 구성할 수 있습니다.
•
Remote
◦
이는 외부 제어 평면이나 멀티 클러스터 메시의 기본 클러스터에 있는 제어 평면에서 관리하는 원격 클러스터를 구성하는 데 사용됩니다.
•
Empty
◦
아무것도 배포하지 않습니다. 이는 사용자 지정 구성의 기본 프로필로 유용할 수 있습니다.
•
Preview
◦
미리보기 프로필에는 실험적인 기능이 포함되어 있습니다. 이는 Istio에 추가될 새로운 기능을 살펴보기 위한 것입니다. 안정성, 보안 및 성능은 보장되지 않으며, 사용에 따른 모든 책임은 사용자에게 있습니다.
istioctl profile list
Shell
복사
Istio Operator
운영을 할때는 설정을 파일로 관리하는 편이 장점이 더 많습니다. 예를 들어서 kubectl apply -f <yaml> 처럼 말이죠. istioctl도 istio 설정을 파일로 관리하는 기능을 제공하고있습니다. 그게 바로 Istio Operator입니다.
Istio Operator를 이용하면 Kubernetes CRD로 Istio를 설정할 수 있습니다.
istioctl operator init
Shell
복사
kubectl apply -f - <<EOF
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
namespace: istio-system
name: example-istiocontrolplane
spec:
profile: demo
EOF
Shell
복사
Istio Injection
•
istio가 sidecar를 배포할지 결정하는 방법
모든 파드에 Enovy Proxy를 설치하지 않고 특정 파드에만 Enovy Proxy를 설치하고 싶은 상황이 발생했습니다. 객체지향 DI처럼 Istio에서도 Sidecar Injection을 지원합니다.
Istio Injection은 두가지 방법이 존재하며 명령어로 수동으로 하는 방법과 라벨로 설정하는 방법이 있습니다.
Namespace에 속한 모든 pod Injection
namespace라벨을 설정하여 namespace에 속한 모든 pod에 envoy proxy를 injection할 수 있습니다. namespace라벨을 "istio-injection=enabled"로 하면 설정 끝입니다.
kubectl label namespace default istio-injection=enabled --overwrite
Shell
복사
•
istio-injection이 허용된 namespace를 조회
kubectl get namespace -L istio-injection
Shell
복사
특정 pod에 injection 제외
•
pod라벨에 "sidecar.istio.io/inject: False"로 설정하면 됩니다.
kubectl edit deploy sleep
# pod라벨 추가
sidecar.istio.io/inject: "false"
Shell
복사
트래픽 흐름
istio가 관리하는 서비스 메시영역은 ingress gateway로 접근이 가능합니다. ingress gateway를 거치지 않으면 일반 쿠버네티스 통신을 따릅니다. ingress gateway는 sidecar로 설치된 istio-proxy(envoy)로 트래픽을 전달합니다. pod에 쿠버네티스 service가 설정되어 있으면, service가 가리키는 endpoints pod정보를 조회합니다. 그리고 서비스를 거치지 않고 다이렉트로 pod로 트래픽을 전달합니다.
Ingress gateway
Ingress gateway는 istio가 관리하는 서비스 메시로 들어오는 관문(gateway)역할을 합니다. 쿠버네티스 CRD로 설정되어 있습니다. gateway의 동작은 proxy에게 위임하는데, 보통 istio-sytsem namespace에 설치된 envoy-proxy를 사용합니다.
•
selector는 gateway동작을 담당하게 될 proxy를 설정합니다. nginx, envoy등 proxy를 설정할 수 있습니다. 보통 envoy proxy를 사용합니다. ingress gateway는 1개 이상 존재해야 합니다.
•
proxy로 접근 주소와 프로토콜을 설정합니다.
•
proxy가 관리하는 주소를 설정합니다.
Virtual Service
virtualservice는 ingress gateway의 라우팅 설정을 담당합니다. 즉, ingress gateway 역할을 하는 proxy설정을 정의합니다. 최소 설정은 ingress gateway이름, host범위, 라우팅 설정입니다. 이외에 로드밸런싱 비율 등을 설정할 수 있습니다.
istio-proxy 컨테이너 로그 레벨 변경방법
# istio-proxy 컨테이너 쉘 접속
kubectl -n {namespace} exec -it {pod 이름} -c istio-proxy -- /bin/sh
# 로그 레벨을 debug로 수정
curl -XPOST http://localhost:15000/logging?level=debug
Shell
복사
istiod 관리자 대시보드 여는 방법
istioctl dashboard controlz deployment/istiod.istio-system
Shell
복사
•
istioctl 명령어가 없는 경우 수동으로 istiod pod에 port-foward
kubectl port-forward -n istio-system deploy/istiod 15000:15000
Shell
복사
book application
istio는 istio를 잘 이해할 수 있도록 book application 샘플을 제공합니다. 마이크로서비스로 개발되어 있어서 다양한 언어로 개발되어 있습니다.
book application을 istio에 적용하면 아래와 같습니다.
1.
사용자는 Ingress gateway를 통해 Product page 애플리케이션에 접근합니다. Product Page는 상품소개 페이지입니다.
2.
Product Page는 Review(상품 리뷰), Detail(상품 설명)애플리케이션을 호출하여 응답결과를 한 페이지 보여줍니다.
3.
Review는 버전이 버전 1, 2, 3이 존재하고 Product Page는 Review버전을 로드밸런싱 합니다.
4.
Review 버전 2,3은 Rating(상품평점)애플리케이선을 호출하여 응답결과를 화면에 출력합니다.
kubectl label namespace default istio-injection=enabled
Shell
복사
git clone https://github.com/istio/istio.git
Shell
복사
cd istio
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
Shell
복사
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml
Shell
복사
kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml
Shell
복사