Document toolboxDocument toolbox

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

3. Linkerd 기술 자료

Overview

4. Linkerd 릴리즈 노트

Releases and Versions

Releases · linkerd/linkerd2