1️⃣ 개요
StatefulSet 기반 애플리케이션(데이터베이스, 메시지 브로커, 캐시 시스템 등)을 운영할 때, 서비스 간 트래픽 제어, 보안, 모니터링 기능을 강화하기 위해 Service Mesh(Istio, Linkerd)를 활용하는 경우가 많습니다.
그러나 StatefulSet은 일반적인 Deployment와는 다르게 고유한 네트워크 아이덴티티(Pod 이름, Headless Service)를 가지므로, Service Mesh와 연동할 때 고려해야 할 사항이 있습니다.
이번 글에서는 StatefulSet을 Istio 및 Linkerd와 연동하는 방법과 적용 시 고려해야 할 사항을 정리하겠습니다. 🚀
2️⃣ StatefulSet에서 Service Mesh를 활용하는 이유
📌 StatefulSet과 Service Mesh(Istio, Linkerd) 연동의 주요 장점
기능 | 설명 |
mTLS를 통한 보안 강화 | StatefulSet 간의 통신을 암호화하여 보안성 향상 |
트래픽 제어 및 라우팅 | Canary Deployment, Blue-Green 배포 등 적용 가능 |
네트워크 장애 감지 및 복구 | Circuit Breaker 및 자동 재시도(Retry) 기능 활용 |
모니터링 및 로깅 | Prometheus, Grafana, Kiali 등과 연동하여 네트워크 상태 분석 |
✅ StatefulSet에서도 Service Mesh를 활용하면 네트워크 보안과 트래픽 관리를 효과적으로 운영할 수 있습니다.
3️⃣ StatefulSet과 Istio 연동 방법
✅ 1. StatefulSet이 Istio에 정상적으로 포함되었는지 확인
📌 Istio가 설치되어 있는지 확인
kubectl get ns istio-system
📌 StatefulSet이 Istio 사이드카 프록시를 자동으로 주입받는지 확인
kubectl label namespace default istio-injection=enabled
📌 StatefulSet Pod에 Istio 사이드카가 주입되었는지 확인
kubectl get pod -l app=mysql -o jsonpath='{.items[*].spec.containers[*].name}'
출력 예시:
["mysql", "istio-proxy"]
✅ Istio 사이드카(istio-proxy)가 정상적으로 주입되었으면 Istio가 적용된 것입니다.
✅ 2. StatefulSet의 Headless Service 설정 (Istio 서비스 디스커버리 활성화)
📌 StatefulSet에서 Istio가 정상적으로 Pod를 감지하려면 Headless Service를 활용해야 합니다.
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
clusterIP: None # Headless Service 설정
selector:
app: mysql
ports:
- name: mysql
port: 3306
targetPort: 3306
✅ 이제 Istio가 StatefulSet의 Pod를 개별적으로 감지할 수 있습니다.
✅ 3. Istio VirtualService를 활용한 트래픽 제어
📌 MySQL StatefulSet 트래픽을 제어하는 Istio VirtualService 설정
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: mysql
spec:
hosts:
- mysql.default.svc.cluster.local
tcp:
- match:
- port: 3306
route:
- destination:
host: mysql.default.svc.cluster.local
subset: v1
📌 DestinationRule을 활용하여 mTLS 및 라우팅 설정
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mysql
spec:
host: mysql.default.svc.cluster.local
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
✅ 이제 StatefulSet 트래픽이 Istio를 통해 제어되며, mTLS가 적용됩니다.
4️⃣ StatefulSet과 Linkerd 연동 방법
✅ 1. StatefulSet이 Linkerd에 정상적으로 포함되었는지 확인
📌 Linkerd가 설치되어 있는지 확인
linkerd check
📌 StatefulSet이 Linkerd의 프록시를 주입받도록 설정
kubectl annotate namespace default linkerd.io/inject=enabled
📌 StatefulSet Pod에 Linkerd 프록시가 주입되었는지 확인
kubectl get pod -l app=mysql -o jsonpath='{.items[*].spec.containers[*].name}'
출력 예시:
["mysql", "linkerd-proxy"]
✅ Linkerd 사이드카(linkerd-proxy)가 정상적으로 주입되었으면 적용이 완료된 것입니다.
✅ 2. StatefulSet의 ServiceProfile 설정 (Linkerd 트래픽 최적화)
📌 StatefulSet을 위한 Linkerd ServiceProfile 생성
apiVersion: linkerd.io/v1alpha2
kind: ServiceProfile
metadata:
name: mysql.default.svc.cluster.local
spec:
routes:
- condition:
method: GET
pathRegex: "/health"
name: "mysql-health-check"
isRetryable: true
✅ 이제 Linkerd가 StatefulSet의 요청을 감지하고, 장애 발생 시 자동으로 재시도할 수 있습니다.
✅ 3. Linkerd를 활용한 트래픽 미러링 및 부하 분산
📌 기존 트래픽을 새로운 StatefulSet으로 미러링하여 테스트할 수 있음
linkerd viz stat ts deploy/mysql
📌 트래픽 모니터링 대시보드 실행
linkerd viz dashboard
✅ 이제 Linkerd를 통해 StatefulSet의 네트워크 상태를 모니터링하고 트래픽을 분석할 수 있습니다.
5️⃣ StatefulSet과 Service Mesh 연동 시 고려해야 할 사항
✅ 1. mTLS 적용 시 데이터베이스 연결 문제 방지
• 일부 StatefulSet 애플리케이션(MySQL, PostgreSQL)은 mTLS가 활성화되면 정상적으로 통신하지 못할 수 있음
• 해결 방법: DestinationRule에서 tls.mode: DISABLE 설정
📌 mTLS를 비활성화하는 설정 예제
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: mysql
spec:
host: mysql.default.svc.cluster.local
trafficPolicy:
tls:
mode: DISABLE
✅ 데이터베이스와의 정상적인 연결을 유지하려면 mTLS 설정을 조정해야 합니다.
✅ 2. Pod 개별 라우팅 및 트래픽 제어 고려
StatefulSet은 Pod 이름이 정해져 있으므로, 특정 Pod로 트래픽을 유도해야 할 수도 있습니다.
📌 특정 StatefulSet Pod에만 트래픽을 라우팅하는 VirtualService 설정 예제
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: mysql-0
spec:
hosts:
- mysql-0.mysql.default.svc.cluster.local
tcp:
- match:
- port: 3306
route:
- destination:
host: mysql-0.mysql.default.svc.cluster.local
✅ 이제 특정 StatefulSet Pod로 트래픽을 유도할 수 있습니다.
🔥 6️⃣ 결론
✔ Istio 및 Linkerd를 활용하면 StatefulSet의 보안(mTLS), 트래픽 제어, 모니터링을 강화할 수 있음
✔ StatefulSet의 Headless Service를 올바르게 설정해야 Service Mesh가 정상적으로 트래픽을 감지할 수 있음
✔ mTLS가 활성화되면 일부 Stateful 애플리케이션과의 호환성 문제가 발생할 수 있으므로, 필요 시 비활성화 필요
✔ StatefulSet Pod 이름을 고려하여 개별적인 트래픽 라우팅 정책을 적용해야 함