Kubernetes/Kubernetes Advanced

📌 [StatefulSet 심화편 #28] StatefulSet과 Service Mesh(Istio, Linkerd) 연동 전략

ygtoken 2025. 3. 15. 11:22
728x90

 

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 이름을 고려하여 개별적인 트래픽 라우팅 정책을 적용해야 함

 

728x90