5. Linkerd
1. Linkerd 개요
Linkerd는 Kubernetes용으로 설계된 경량 서비스이며 분산 애플리케이션에서 코드를 변경할 필요 없이 런타임 디버깅, 옵저버빌러티 기능, 안정성 및 보안을 제공합니다.
Linkerd 구조
Linkerd에는 UI, data-plane, control-plane의 3가지 구성 요소가 있다. 각 서비스 인스턴스 옆에 경량 transparent proxy를 설치하여 동작합니다.
Control-plane
서비스메시의 핵심 기능을 제공하는 서비스 집합입니다.
텔레메트리 데이터를 수집하고 API를 제공하며, Data-plane 프록시에 제어 데이터를 제공합니다.
Control-plane의 구성요소는 다음과 같습니다.
Controller : CLI 및 Dashboard용 API를 제공하는 Public API 컨테이너로 구성
Destination : Data-plane에 있는 각각의 프록시는 metric, retries, timeout과 같은 데이터의 요청을 보낼 위치를 검색
Identity : CA(Certificate Authority)기능을 제공하며 프록시로부터 CSR(Certificate Signing Request)을 수락하고 서명된 올바른 인증을 반환하는 역할을 수행
Proxy Injector : 승인 컨트롤러로서
linkerd.io/inject: enabled
어노테이션을 찾고 pod 명세를 수정하여 initcontainer와 사이드카를 포함하는 프록시를 모두 추가Service Profile Validator : 새로운 서비스 프로필이 저장되기 전에 유효성 검사를 하는 승인 컨트롤러
Tap : CLI나 대시보드에서 요청을 받아 어플리케이션의 옵저버빌러티를 실시간으로 제공
Web : 웹에서 대시보드를 제공
Grafana : Grafana를 통하여 즉시 사용 가능한 대시보드를 제공
Prometheus : linkerd 메트릭을 4191번 포트를 통하여 매 10초마다 수집
Data-plane
Data-plane은 경량 프록시로 서비스 컨테이너의 각 인스턴스와 함께 사이드카 컨테이너로써 배포됩니다.
특정 어노테이션이 있는 pod의 초기화 단계에서 프록시가 주입됩니다.
Linkerd2-Proxy
애플리케이션의 코드 변경 없이 각 pod와의 통신에서 암호화 기능과 중개 역할을 수행 할 수 있습니다.
쿠버네티스와 같이 컨테이너 환경에서 사용하기 위해 만들어졌기 때문에 매우 가볍습니다.
2. Linkerd 사용
Linkerd에서 제공하는 데모 어플리케이션을 배포합니다.
(k8s-venv) root@k8s-master01:~# curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/emojivoto.yml \
> | kubectl apply -f -
namespace/emojivoto created
serviceaccount/emoji created
serviceaccount/voting created
serviceaccount/web created
service/emoji-svc created
service/voting-svc created
service/web-svc created
deployment.apps/emoji created
deployment.apps/vote-bot created
deployment.apps/voting created
deployment.apps/web created
(k8s-venv) root@k8s-master01:~# kubectl get all -n emojivoto
NAME READY STATUS RESTARTS AGE
pod/emoji-5dbdd567bd-v9tmw 1/1 Running 0 15s
pod/vote-bot-58b4f5fdb7-bzpsl 1/1 Running 0 15s
pod/voting-5fdcddcfc-jltvb 1/1 Running 0 15s
pod/web-67c857998c-w5dxm 1/1 Running 0 15s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/emoji-svc ClusterIP 10.233.5.28 <none> 8080/TCP,8801/TCP 16s
service/voting-svc ClusterIP 10.233.35.137 <none> 8080/TCP,8801/TCP 16s
service/web-svc ClusterIP 10.233.15.55 <none> 80/TCP 16s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/emoji 1/1 1 1 16s
deployment.apps/vote-bot 1/1 1 1 16s
deployment.apps/voting 1/1 1 1 15s
deployment.apps/web 1/1 1 1 15s
NAME DESIRED CURRENT READY AGE
replicaset.apps/emoji-5dbdd567bd 1 1 1 16s
replicaset.apps/vote-bot-58b4f5fdb7 1 1 1 16s
replicaset.apps/voting-5fdcddcfc 1 1 1 15s
replicaset.apps/web-67c857998c 1 1 1 15s
Linkerd 명령어를 통해 데모 어플리케이션에 Proxy Pod를 추가합니다.
(k8s-venv) root@k8s-master01:~# kubectl get -n emojivoto deploy -o yaml \
> | linkerd inject - \
> | kubectl apply -f -
deployment "emoji" injected
deployment "vote-bot" injected
deployment "voting" injected
deployment "web" injected
deployment.apps/emoji configured
deployment.apps/vote-bot configured
deployment.apps/voting configured
deployment.apps/web configured
(k8s-venv) root@k8s-master01:~# kubectl get all -n emojivoto
NAME READY STATUS RESTARTS AGE
pod/emoji-55c59cf485-c4hbx 2/2 Running 0 5m1s
pod/vote-bot-57d4c898bb-965fq 2/2 Running 0 5m1s
pod/voting-87469d4bb-xx6gf 2/2 Running 0 5m1s
pod/web-847cbcb586-5gw4m 2/2 Running 0 5m1s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/emoji-svc ClusterIP 10.233.5.28 <none> 8080/TCP,8801/TCP 7m44s
service/voting-svc ClusterIP 10.233.35.137 <none> 8080/TCP,8801/TCP 7m44s
service/web-svc ClusterIP 10.233.15.55 <none> 80/TCP 7m44s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/emoji 1/1 1 1 7m44s
deployment.apps/vote-bot 1/1 1 1 7m44s
deployment.apps/voting 1/1 1 1 7m43s
deployment.apps/web 1/1 1 1 7m43s
NAME DESIRED CURRENT READY AGE
replicaset.apps/emoji-55c59cf485 1 1 1 5m1s
replicaset.apps/emoji-5dbdd567bd 0 0 0 7m44s
replicaset.apps/vote-bot-57d4c898bb 1 1 1 5m1s
replicaset.apps/vote-bot-58b4f5fdb7 0 0 0 7m44s
replicaset.apps/voting-5fdcddcfc 0 0 0 7m43s
replicaset.apps/voting-87469d4bb 1 1 1 5m1s
replicaset.apps/web-67c857998c 0 0 0 7m43s
replicaset.apps/web-847cbcb586 1 1 1 5m1s
Linkerd 대시보드에서 데모 어플리케이션을 메쉬하는 것을 확인합니다.
Proxy가 사이드카 패턴으로 주입된 네임스페이스를 클릭하면 다음과 같은 정보가 표현됩니다.
각 네임스페이스별 리소스의 상태를 좌측의 워크로드 탭에서 확인할 수 있으며 각 리소스별 확인할수 있는 정보는 아래와 같습니다.
Mashed: proxy의 개수 및 활성화된 proxy 수
Success Rate: 200 code의 비율
RPS: Request Per Second 초당 요청 횟수
P50 Latency: 평균지연시간 p50
P95 Latency: 평균지연시간 p95
P59 Latency: 평균지연시간 p99