istio 왜 쓰는가? 즉, 서비스메쉬 왜 쓰는가?
(image source : https://medium.com/dtevangelist/service-mesh-%EB%9E%80-8dfafb56fc07)
서비스메쉬하면 떠오르는 구조입니다. 서비스메쉬의 필요성은 사실 피부로 와닿진 않습니다. 까나리 배포를 지원한다는 점 정도입니다. 추후에 공부해보는 걸로 하고 넘어가보겠습니다. istio는 서비스 메쉬 개념을 구현한 오픈소스입니다.
istio 아키텍쳐
k8s와 유사하게 컨트롤 플레인과 데이터 플레인으로 나눠진다.
각 envoy 프록시는 istiod라는 컨트롤 플레인의 관리를 받습니다.
istio 궁금증1) deployment.yaml에 istio envoy 컨테이너 spec이 없는데 envoy 컨테이너가 자동으로 생성되는 이유
Istio는 “자동 사이드카 주입(auto sidecar injection)”이라는 메커니즘을 사용합니다. 이는 Istio의 컨트롤 플레인에서 이루어지며, Istio의 istio-sidecar-injector
라는 구성 요소가 이를 담당합니다.
자동 사이드카 주입 메커니즘
- 네임스페이스 라벨링:
- 특정 네임스페이스에 Istio 사이드카를 자동으로 주입하려면, 해당 네임스페이스에 라벨을 추가해야 합니다.
- 예시:
1
kubectl label namespace <namespace> istio-injection=enabled
- Webhook 구성:
- Istio는 Kubernetes의
MutatingAdmissionWebhook
기능을 사용하여 파드가 생성될 때 자동으로 사이드카 프록시를 주입합니다. istio-sidecar-injector
라는 MutatingAdmissionWebhook이 파드 생성 요청을 가로채고, 파드 스펙에 Envoy 사이드카 컨테이너를 추가합니다.
- Istio는 Kubernetes의
- 파드 생성 시 사이드카 주입:
- 새로운 파드가 생성될 때,
istio-sidecar-injector
가 파드의 정의를 수정하여 Envoy 사이드카 컨테이너를 추가합니다.
- 새로운 파드가 생성될 때,
istio 궁금증2) envoy가 트래픽을 가로채는 방법
트래픽 가로채기 메커니즘
- IP 테이블 설정:
- Envoy 사이드카는 iptables 규칙을 사용하여 네트워크 트래픽을 가로챕니다. iptables는 Linux 커널에서 패킷 필터링 및 네트워크 주소 변환(NAT)을 수행하는 유틸리티입니다.
- 파드의 초기화 컨테이너(Init Container)는 iptables 규칙을 설정하여, 파드의 모든 인바운드 및 아웃바운드 트래픽이 Envoy 프록시를 경유하도록 합니다.
네임스페이스 라벨링
1
kubectl label namespace default istio-injection=enabled
파드 정의 예시
파드 정의에는 Envoy 프록시가 명시되지 않지만, 파드 생성 시 자동으로 주입됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: myimage:latest
ports:
- containerPort: 8080
iptables 규칙 설정 예시
Envoy 프록시는 초기화 컨테이너를 통해 다음과 같은 iptables 규칙을 설정합니다:
1
2
3
4
5
# Redirect all outbound traffic to Envoy
iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-port 15001
# Redirect inbound traffic to Envoy
iptables -t nat -A PREROUTING -p tcp -j REDIRECT --to-port 15001
Istio의 주요 컴포넌트: istiod, IngressGateway, Envoy
1. Istiod
Istiod는 Istio의 통합된 컨트롤 플레인 컴포넌트입니다. 이전에는 Pilot, Galley, Citadel, 사이드카 주입기(Sidecar Injector) 등의 개별적인 컴포넌트로 구성되었으나, Istio 1.5부터 istiod
라는 단일 바이너리로 통합되었습니다.
- 기능:
- 서비스 디스커버리: 클러스터 내에서 실행 중인 서비스들을 발견하고 추적합니다.
- 트래픽 관리: 트래픽 라우팅 규칙과 정책을 설정하고, 이를 Envoy 프록시에 전달합니다.
2. IngressGateway
IngressGateway는 외부 트래픽을 서비스 메쉬 내부로 라우팅하는 역할을 합니다. 이는 Kubernetes의 Ingress와 유사하지만, Istio의 고급 트래픽 관리 기능을 활용할 수 있습니다.
- 기능:
- 트래픽 제어: 트래픽 정책, 라우팅 규칙 등을 적용하여 외부 트래픽을 세밀하게 제어합니다. ex) 까나리 배포
3. Envoy 오픈소스 envoy
Envoy는 Istio의 데이터 플레인 컴포넌트로, 각 서비스마다 사이드카 패턴으로 배포됩니다. 모든 서비스 간의 통신을 가로채고 관리하는 역할을 합니다.
- 기능:
- 트래픽 라우팅: 서비스 간의 트래픽을 라우팅하고, 설정된 정책에 따라 트래픽을 관리합니다.
- mTLS 통신: 서비스 간의 통신을 암호화하여 보안을 강화합니다.