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 기술 자료

https://linkerd.io/2.12/overview/

4. Linkerd 릴리즈 λ…ΈνŠΈ

https://linkerd.io/releases/

https://github.com/linkerd/linkerd2/releases/