Tsuru는 오픈소스 PaaS 플랫폼으로, 마이크로서비스 간 통신을 제어하는 서비스 메쉬 기능을 유연하게 지원한다. 이 가이드에서는 Tsuru 환경 내에서 트래픽 라우팅 전략을 설계하고, 네트워크 보안 규칙을 적용하는 구체적인 절차를 다룬다.
환경 초기화 및 모듈 활성화
Tsuru의 라우팅 및 보안 기능은 플러그인 아키텍처를 기반으로 확장된다. 기본 환경 구축 후 etc/tsuru.conf 및 관련 설정 파일을 수정하여 메쉬 관련 모듈을 활성화해야 한다. 핵심 라우터 설정은 router/ 디렉토리에 위치하며, 보안 검증 로직은 api/ 및 permission/ 패키지와 연동된다.
정적 트래픽 분산 전략
서비스 버전 간 트래픽 비율을 조절하거나 특정 경로 기반 라우팅을 구성하려면 라우터 설정 파일을 활용한다. 다음과 같이 매칭 조건과 백엔드 연결 정보를 정의할 수 있다.
traffic_policies:
- match:
uri: "/service/payments"
headers:
x-version: "stable"
backend:
target: "payment-svc-v1"
split_ratio: 0.7
fallback:
target: "payment-svc-v2"
split_ratio: 0.3
위 구성은 요청 URI 및 커스텀 헤더를 기준으로 트래픽을 두 개의 서비스 인스턴스로 분산시킨다. 가중치 값은 부하 테스트 결과에 따라 지속적으로 조정해야 한다.
동적 라우팅 적용
서비스 재배포나 실시간 트래픽 스케줄링이 필요한 경우, Tsuru REST API를 호출하여 설정을 갱신할 수 있다. api/router.go에 정의된 엔드포인트는 서비스 재시작 없이 인메모리 라우팅 테이블을 업데이트한다. 컨트롤러 측에서 구현 예시는 다음과 같다.
func ApplyDynamicRoute(client *http.Client, policyPayload []byte) error {
req, err := http.NewRequest(http.MethodPut, "/api/v1/router/rules", bytes.NewBuffer(policyPayload))
if err != nil {
return fmt.Errorf("request construction failed: %w", err)
}
req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil || resp.StatusCode != http.StatusOK {
return fmt.Errorf("routing policy update rejected, status: %v", resp.StatusCode)
}
return nil
}
네트워크 보안 및 접근 제어
마이크로서비스 간 통신은 반드시 암호화되어야 한다. Tsuru는 서로 인증(mTLS)을 위해 api/testdata/ 경로에 배치된 인증서 파일을 설정에 연결한다. tls.enabled: true 옵션과 함께 인증서 및 키 파일 경로를 명시하면 트래픽은 자동으로 TLS 1.3 프로토콜로 encapsulation된다.
접근 제어 측면에서는 permission/ 모듈이 역할 기반 접근 제어(RBAC)를 구현한다. 서비스 이름, 네임스페이스, 그리고 허용된 HTTP 메서드를 조합하여 정책 규칙을 작성한다.
access_policies:
- source: "frontend-cluster"
destination: "backend-analytics"
allowed_methods: ["GET", "POST"]
require_mutual_tls: true
rate_limit: 500
위 규칙은 특정 클러스터 내부의 프론트엔드 서비스만 백엔드 분석 모듈에 제한된 메서드로 접근할 수 있도록 하며, 동시 요청 수를 제한하는 레이트 리밍도 함께 적용된다.
관측성 및 로그 집계
라우팅 및 보안 정책의 정상 동작을 검증하려면 메트릭과 로그 데이터가 필요하다. provision/kubernetes/metrics.go는 Kubernetes 환경의 서비스 메쉬 프록시에서 Prometheus 형식의 지표를 스크랩한다. HTTP 상태 코드 분포, 라우트 히트율, TLS 핸드셰이크 실패 횟수를 실시간으로 모니터링할 수 있다.
로그 관리는 applog/ 컴포넌트가 담당한다. JSON 구조의 구조화 로그를 Elasticsearch 또는 Loki와 같은 백엔드에 스트리밍하면, 보안 위반 시도나 라우트 실패 트랜잭션을 빠르게 추적할 수 있다. 로그 레벨과 샘플링 비율은 운영 환경의 리소스 사용량에 따라 동적으로 조정할 것을 권장한다.
문제 해결 및 검증 절차
라우트 규칙이 적용되지 않는 경우, 설정 파일의 YAML 인덴테이션 오류나 캐시 유효 시간(TTL)을 우선 확인한다. tsuru route reload 명령어를 실행하거나 컨트롤러의 상태 엔드포인트를 호출하여 현재 로드된 규칙과 대조한다.
보안 정책 간 충돌이 발생하는 상황에서는 명시적 우선순위 플래그를 설정해야 한다. Tsuru의 권한 평가기는 규칙 목록에서 상단에 정의된 정책을 먼저 매칭하며, 충돌이 감지되면 로깅 컴포넌트에 경고 메시지를 기록한다. 복잡한 의존성 관계가 있는 아키텍처에서는 정책 적용 전에 샌드박스 환경에서 트래픽 재현 테스트를 반드시 수행해야 한다.