Linkerd의 설계 철학, Rust 기반 마이크로 프록시 아키텍처, 설치와 운영, 그리고 Istio와의 비교를 통해 Linkerd의 강점을 분석합니다.
Linkerd는 "서비스 메시"라는 용어를 처음 만든 프로젝트입니다. 2016년 Buoyant가 발표한 이후 단순함, 경량성, 운영 용이성을 핵심 가치로 발전해 왔습니다. Istio가 풍부한 기능 세트를 추구한다면, Linkerd는 "필요한 것만 제공하되 완벽하게"라는 철학을 따릅니다.
Linkerd 팀은 서비스 메시가 "boring infrastructure"가 되어야 한다고 주장합니다. 인프라는 존재감 없이 묵묵히 작동해야 하며, 운영자에게 부담을 주어서는 안 된다는 것입니다.
이 철학은 구체적인 설계 원칙으로 이어집니다.
최소 복잡성: 80%의 사용 사례를 커버하는 기능만 제공합니다. Istio의 VirtualService 같은 복잡한 CRD 대신, 직관적인 서비스 프로파일(ServiceProfile)과 HTTP 라우팅을 제공합니다.
자체 프록시: Envoy 대신 Rust로 작성한 linkerd2-proxy를 사용합니다. Envoy의 범용성 대신 서비스 메시에 필요한 기능만 구현하여 메모리 사용량과 공격 표면을 줄였습니다.
자동화 우선: mTLS는 설치 즉시 자동 활성화됩니다. 인증서 발급, 갱신, 폐기가 모두 자동입니다. 별도의 PeerAuthentication 설정이 필요 없습니다.
Linkerd의 컨트롤 플레인은 linkerd-control-plane 네임스페이스에 배포되는 몇 가지 컴포넌트로 구성됩니다.
Linkerd 컨트롤 플레인
┌──────────────────────────────────────────────┐
│ linkerd-control-plane 네임스페이스 │
│ │
│ ┌──────────────┐ ┌──────────────────────┐ │
│ │ destination │ │ identity │ │
│ │ (서비스 │ │ (인증서 관리, │ │
│ │ 디스커버리) │ │ SPIFFE 아이덴티티) │ │
│ └──────────────┘ └──────────────────────┘ │
│ │
│ ┌──────────────┐ ┌──────────────────────┐ │
│ │ proxy-injector│ │ heartbeat │ │
│ │ (사이드카 │ │ (텔레메트리) │ │
│ │ 자동 주입) │ │ │ │
│ └──────────────┘ └──────────────────────┘ │
└──────────────────────────────────────────────┘
destination: Kubernetes API를 감시하여 서비스 엔드포인트 정보를 프록시에 전달합니다. Istio의 Pilot에 해당하지만, 훨씬 단순한 구현입니다.
identity: 각 프록시에 mTLS 인증서를 발급합니다. 기본적으로 24시간마다 자동 갱신됩니다.
proxy-injector: linkerd.io/inject: enabled 어노테이션이 있는 Pod에 linkerd2-proxy 사이드카를 자동 주입하는 Admission Webhook입니다.
linkerd2-proxy는 Linkerd의 핵심 차별점입니다.
| 특성 | linkerd2-proxy | Envoy |
|---|---|---|
| 언어 | Rust | C++ |
| 메모리 | ~20MB | ~50MB |
| 지원 프로토콜 | HTTP/1.1, HTTP/2, gRPC, TCP | 거의 모든 L7 프로토콜 |
| 확장 메커니즘 | 없음 (의도적) | Wasm, Lua 필터 |
| 시작 시간 | ~10ms | ~100ms |
| CVE 이력 | 매우 적음 | 상대적으로 많음 |
linkerd2-proxy가 Envoy보다 가벼운 이유는 범용 프록시가 아니라 서비스 메시 전용 프록시이기 때문입니다. Wasm 확장, 커스텀 프로토콜 지원 같은 기능을 의도적으로 배제하여 코드 복잡성과 메모리 사용량을 최소화했습니다.
# Linkerd CLI 설치
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install | sh
# 사전 조건 확인
linkerd check --pre
# CRD 설치
linkerd install --crds | kubectl apply -f -
# 컨트롤 플레인 설치
linkerd install | kubectl apply -f -
# 설치 확인
linkerd check네임스페이스에 어노테이션을 추가하면 해당 네임스페이스의 모든 Pod에 자동으로 프록시가 주입됩니다.
# 네임스페이스 단위 자동 주입 활성화
kubectl annotate namespace my-app linkerd.io/inject=enabled
# 기존 Deployment 재시작하여 프록시 주입
kubectl rollout restart deployment -n my-appLinkerd는 내장 대시보드(Viz 확장)를 제공합니다.
# Viz 확장 설치
linkerd viz install | kubectl apply -f -
# 대시보드 열기
linkerd viz dashboard대시보드에서 서비스 간 트래픽 흐름, 성공률, 지연 시간, 요청량을 실시간으로 확인할 수 있습니다.
Linkerd의 트래픽 관리는 Istio보다 기능이 적지만, 핵심 기능은 갖추고 있습니다.
Linkerd는 Kubernetes 표준인 TrafficSplit SMI(Service Mesh Interface) 리소스를 사용합니다.
apiVersion: split.smi-spec.io/v1alpha2
kind: TrafficSplit
metadata:
name: reviews-split
namespace: my-app
spec:
service: reviews
backends:
- service: reviews-v1
weight: 900 # 90%
- service: reviews-v2
weight: 100 # 10%서비스별 재시도, 타임아웃, 라우트 메트릭을 정의합니다.
apiVersion: linkerd.io/v1alpha2
kind: ServiceProfile
metadata:
name: reviews.my-app.svc.cluster.local
namespace: my-app
spec:
routes:
- name: GET /reviews/{id}
condition:
method: GET
pathRegex: /reviews/[^/]+
isRetryable: true
timeout: 3s
- name: POST /reviews
condition:
method: POST
pathRegex: /reviews
isRetryable: false
timeout: 10sLinkerd 2.20에서 도입된 주목할 만한 기능입니다. HTTP 429 응답의 Retry-After 헤더를 인식하여, 스로틀링 중인 인스턴스를 자동으로 우회합니다.
기존 로드 밸런서:
요청 → [인스턴스 A: 429] → 실패 → 클라이언트가 재시도
레이트 리밋 인지 로드 밸런서:
요청 → [인스턴스 A: 429, Retry-After: 30] → 인스턴스 A를 30초간 우회
→ [인스턴스 B: 200] → 성공
이 기능은 외부 API를 호출할 때 특히 유용합니다. API 레이트 리밋에 걸린 인스턴스를 자동으로 피해서 요청을 분배합니다.
Linkerd의 mTLS는 "제로 설정"입니다. 설치만 하면 모든 메시 내 트래픽이 자동으로 mTLS로 암호화됩니다.
Trust Anchor (루트 CA)
└── Issuer Certificate (중간 CA)
└── Workload Certificate (서비스별, 자동 발급)
Linkerd 2.12부터 세밀한 인가 정책을 지원합니다.
apiVersion: policy.linkerd.io/v1beta3
kind: Server
metadata:
name: reviews-server
namespace: my-app
spec:
podSelector:
matchLabels:
app: reviews
port: 8080
proxyProtocol: HTTP/2
---
apiVersion: policy.linkerd.io/v1alpha1
kind: AuthorizationPolicy
metadata:
name: reviews-auth
namespace: my-app
spec:
targetRef:
group: policy.linkerd.io
kind: Server
name: reviews-server
requiredAuthenticationRefs:
- name: reviews-clients
kind: MeshTLSAuthentication
group: policy.linkerd.io
---
apiVersion: policy.linkerd.io/v1alpha1
kind: MeshTLSAuthentication
metadata:
name: reviews-clients
namespace: my-app
spec:
identities:
- "*.my-app.serviceaccount.identity.linkerd.cluster.local"| 비교 항목 | Istio | Linkerd |
|---|---|---|
| 설계 철학 | 기능의 완전성 | 단순성과 경량성 |
| 프록시 | Envoy (C++) | linkerd2-proxy (Rust) |
| 메모리/Pod | ~50MB | ~20MB |
| mTLS 설정 | PeerAuthentication CRD 필요 | 설치 즉시 자동 (제로 설정) |
| L7 기능 범위 | 매우 풍부 (미러링, 폴트 인젝션 등) | 핵심 기능만 (재시도, 타임아웃) |
| 사이드카 없는 모드 | Ambient (GA) | 없음 (사이드카 유지) |
| 학습 곡선 | 가파름 | 완만함 |
| 라이선스 | Apache 2.0 | Apache 2.0 (안정 릴리즈는 유료*) |
2024년 2월부터 Linkerd의 안정(stable) 릴리즈는 직원 50명 이상 기업에 유료(클러스터당 $2,000/월)입니다. 오픈소스 라이선스 자체는 Apache 2.0이지만, 엔터프라이즈 사용에는 Buoyant 라이선스가 필요합니다. 엣지(edge) 릴리즈는 무료로 사용 가능합니다.
반면, 복잡한 L7 트래픽 관리(트래픽 미러링, 폴트 인젝션, 세밀한 라우팅 규칙)가 필요하거나 사이드카 없는 아키텍처를 원한다면 Istio가 더 적합합니다.
다음 장에서는 eBPF 기술을 활용하여 커널 수준에서 서비스 메시를 구현하는 Cilium을 살펴보겠습니다.
이 글이 도움이 되셨나요?
Istio의 트래픽 관리 기능을 실전 시나리오로 살펴봅니다. 가중치 기반 라우팅, 카나리 배포, 서킷 브레이커, 폴트 인젝션, 트래픽 미러링까지.
eBPF 기술을 활용한 Cilium Service Mesh의 아키텍처, 커널 수준 네트워킹의 성능 이점, Hubble 관측 가능성, 그리고 실전 활용법을 분석합니다.
Istio의 내부 아키텍처, Ambient 모드와 사이드카 모드의 비교, 설치와 기본 설정까지 Istio의 핵심을 깊이 있게 분석합니다.