- Aiden's Lab แแ ฒแแ ณแ แ ฆแแ ฅ
- Posts
- ๐ญLinkerd แแ ฉแแ ตแธแแ ต แแ ฉแแ ตแซแแ ฌแซแแ กแแ งแซ แแ ตแจแแ ฅแธ แแ กแแ ญแผแแ ขแแ ฉแแ ก! Linkerd แแ ขแจแแ ตแท แแ ตแแ ณแผ แแ ตแฏแแ ณแธ แแ กแแ ตแแ ณ
๐ญLinkerd แแ ฉแแ ตแธแแ ต แแ ฉแแ ตแซแแ ฌแซแแ กแแ งแซ แแ ตแจแแ ฅแธ แแ กแแ ญแผแแ ขแแ ฉแแ ก! Linkerd แแ ขแจแแ ตแท แแ ตแแ ณแผ แแ ตแฏแแ ณแธ แแ กแแ ตแแ ณ
Linkerdแ แ ณแฏ minikube แแ ณแฏแ แ ฅแแ ณแแ ฅแแ ฆ แแ ตแจแแ ฅแธ แแ ฅแฏแแ ตแแ กแแ ฉ แแ งแ แ ฅ แแ ขแจแแ ตแท แแ ตแแ ณแผแแ ณแฏ แแ กแแ ญแผแแ ขแแ ฉแแ ง Service Meshแแ ฆ แแ ขแแ ข แแ กแฏแแ กแแ ฉแธแแ ตแแ ก.
์๋ ํ์ธ์, Aidenโs Lab ๋ด์ค๋ ํฐ์ ๋๋ค.
Linkerd์ ํต์ฌ ๊ฐ๋ ๊ณผ ๊ธฐ๋ฅ์ ๋ํด ๋ค๋ค๋ ์ง๋ ์๊ฐ์ ์ด์ด์, ์ด๋ฒ์ Linkerd๋ฅผ ์ง์ ์ค์นํ๊ณ ์ฌ์ฉํด๋ณด๋ ์ค์ต์ ์งํํด๋ณด๊ฒ ์ต๋๋ค.
์ปดํฉํธํ ์ค์ต์ ์ํด, Linkerd๋ฅผ ์ฌ์ฉํ Kubernetes ํด๋ฌ์คํฐ๋ minikube๋ก ๊ตฌ์ฑํด์ ์งํํ๋๋ก ํ๊ฒ ์ต๋๋ค. minikube๋ ์ด๋ฏธ ์ง๋ ๊ธ์์ ๊ณ์ ๋ค๋ค๊ธฐ ๋๋ฌธ์ ์ถ๊ฐ๋ก ์ค๋ช ํ์ง ์๊ฒ ์ต๋๋ค.
Linkerd๋ฅผ ์ง์ ์ฌ์ฉํด๋ณด๊ธฐ ์ ์, ํจ๊ณผ์ ์ธ ์ค์ต์ ์ํด Linkerd์ ์ฃผ์ ๊ตฌ์ฑ์์๋ฅผ ์ข ๋ ์ดํด๋ณผ๊ฒ์.
Linkerd์ ์ฃผ์ ๊ตฌ์ฑ์์ ์ข ๋ ์ดํด๋ณด๊ธฐ
Linkerd์ Control Plane์ Service Mesh์ ๋๋ ์ญํ ์ ํ๋ฉฐ ์๋์ ๊ฐ์ ํต์ฌ ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
controller
: ๊ณต์ฉ API ์ ๊ณตdestination
: ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ์ ๋ผ์ฐํ ์ ๋ณด ๊ด๋ฆฌidentity
: mTLS๋ฅผ ์ํ ์ธ์ฆ์ ๋ฐ๊ธ ๋ฐ ๊ด๋ฆฌproxy-injector
: Pod ์์ฑ ์ ์ฌ์ด๋์นด ํ๋ก์๋ฅผ ์๋์ผ๋ก ์ฃผ์
๊ทธ๋ฆฌ๊ณ Linkerd์ Data Plane์ ๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ Pod์ ํจ๊ป ๋ฐฐํฌ๋๋ ์ด๊ฒฝ๋ ์ฌ์ด๋์นด ํ๋ก์์ธ linkerd-proxy
๋ก ์ด๋ฃจ์ด์ง๋๋ค.
Linkerd ํ๋ก์๋ ํด๋น Pod๋ก ๋ค์ด์ค๊ณ ๋๊ฐ๋ ๋ชจ๋ TCP ํธ๋ํฝ(์ฃผ๋ก HTTP, gRPC ๋ฑ)์ ํฌ๋ช ํ๊ฒ ๊ฐ๋ก์ฑ๋๋ฐ์. ์ด๋ ๊ฒ ๊ฐ๋ก์ฑ ํธ๋ํฝ์ ๊ฐ์ง๊ณ mTLS ์ํธํ, ๋ก๋ ๋ฐธ๋ฐ์ฑ, ์ฌ์๋, ํ์์์, ๋ฉํธ๋ฆญ ์์ง ๋ฑ์ ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค.
Linkerd CLI๋ ์ฌ์ฉ์๊ฐ ๋ก์ปฌ ๋จธ์ ์์ Linkerd Control Plane๊ณผ ํต์ ํ๊ณ Service Mesh๋ฅผ ๊ด๋ฆฌํ ์ ์๋ ํด์ ๋๋ค.
CLI ํ๊ฒฝ์์ Linkerd ์ค์น, ์ํ ํ์ธ, ๋ฆฌ์์ค ํต๊ณ ์กฐํ, ์ค์๊ฐ ํธ๋ํฝ ํ์ธ, ํ๋ก์ ์ฃผ์ ๋ฑ ๋ค์ํ ์์ ์ ์ํํ ์ ์๋๋ฐ์. Linkerd ์ด์ ๋ฐ ๋๋ฒ๊น ์ ํ์์ ์ธ ํด์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก Linkerd Viz๋ Linkerd Service Mesh์ ์ํ์ ์ฑ๋ฅ์ ์์์ ์ผ๋ก ํ์ธํ๊ณ ๋ถ์ํ ์ ์๋ ์ต์คํ ์ (ํ์ฅ ๊ธฐ๋ฅ ๋ชจ์)์ ๋๋ค.
์น ๊ธฐ๋ฐ ๋์๋ณด๋๋ฅผ ํตํด ์ค์๊ฐ ํธ๋ํฝ, ์ฑ๊ณต๋ฅ , ์ง์ฐ ์๊ฐ ๋ฑ์ ๋ชจ๋ํฐ๋งํ ์ ์๋๋ฐ์. Prometheus ํธํ ๋ฉํธ๋ฆญ API๋ฅผ ์ ๊ณตํ์ฌ ์ธ๋ถ ๋ชจ๋ํฐ๋ง ์์คํ ๊ณผ์ ์ฐ๋๋ ๊ฐ๋ฅํฉ๋๋ค.
์ค์ต ํ๊ฒฝ ์ค๋น: Linkerd CLI ์ค์น
์ ๋ WSL ํ๊ฒฝ์์ ๋ณธ ์ค์ต์ ์งํํ์ต๋๋ค. ํฐ๋ฏธ๋์์ k8s-test๋ผ๋ ์ด๋ฆ์ผ๋ก minikube ํด๋ฌ์คํฐ๋ฅผ ๋จผ์ ์คํํ ๊ฒ์.

๊ทธ ๋ค์, ์๋ Linkerd CLI ์ค์น ๋ช ๋ น์ด ์คํํฉ๋๋ค.
curl --proto '=https' --tlsv1.2 -sSfL https://run.linkerd.io/install-edge | sh
๊ทธ๋ผ ์๋์ ๊ฐ์ด Linkerd ์ค์น ์คํฌ๋ฆฝํธ๊ฐ ๋ค์ด๋ก๋๋๊ณ ์ค์น๊ฐ ์งํ๋ฉ๋๋ค.

์๋ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ํ๊ฒฝ๋ณ์๋ ์ถ๊ฐํฉ๋๋ค.
export PATH=$HOME/.linkerd2/bin:$PATH
์ฌ๊ธฐ๊น์ง ์๋ฃ๋์๋ค๋ฉด linkerd version
๋ช
๋ น์ด๋ก Linkerd CLI๊ฐ ์ค์น๋์๋์ง ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.

์์ง minikue ํด๋ฌ์คํฐ์ Linkerd์ Control Plane์ด ๋ฐฐํฌ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ Server version์ unavailable
์ํ์ธ๋ฐ์. ๋ฐ์์ Control Plane๊น์ง ๋ฐฐํฌ๋ ๋ค์ ๋ค์ ํ์ธํด๋ณด๋ฉด Server version๋ ์
๋ฐ์ดํธ๋ ๊ฒ๋๋ค.
Linkerd๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด Kubernetes ํด๋ฌ์คํฐ์ Gateway API๋ผ๋ CRD๊ฐ ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค. CRD(Custom Resource Definition)๋ Kubernetes ํด๋ฌ์คํฐ์ ๊ธฐ๋ณธ ๋ฆฌ์์ค ํ์ (Deployment, StatefulSet ๋ฑ) ์ธ๋ก ์๋ก์ด ๋ฆฌ์์ค ์ ํ์ ์ถ๊ฐํด ํด๋ฌ์คํฐ์ ๊ธฐ๋ฅ์ ํ์ฅํ๋ ๊ฑธ ์๋ฏธํฉ๋๋ค.
Gateway API๋ ๋คํธ์ํฌ ํธ๋ํฝ๊ณผ ๊ด๋ จ๋ ๋ฆฌ์์ค๋ค์ ์ ์ํ๋ CRD์ธ๋ฐ์. ๋ง์ฝ ๊ธฐ์กด์ ์ค์น๋์ด ์์ง ์๋ค๋ฉด ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ํด๋ฌ์คํฐ์ Gateway API๋ฅผ ์ค์นํ ์ ์์ต๋๋ค.
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.1/standard-install.yaml
๊ทธ๋ผ ์๋์ ๊ฐ์ด Gateway API๋ฅผ ๊ตฌ์ฑํ๋ CRD๋ค์ด ์ค์น๋ฉ๋๋ค.

๋ค์์ผ๋ก, ํฐ๋ฏธ๋์ linkerd check --pre
๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด ํด๋น ํด๋ฌ์คํฐ๊ฐ Linkerd๋ฅผ ์ฌ์ฉํ๋ ๋ฐ์ ํ์ํ ์ฌ์ ์กฐ๊ฑด๋ค์ ์ถฉ์กฑํ๋์ง ๊ฒ์ฆํ ์ ์์ต๋๋ค. Kubernetes API ์ํ์ ๋ฒ์ ๋ถํฐ Linkerd CLI ๋ฒ์ ๊น์ง ์ ์ฌ์ ์ธ ํ๊ฒฝ ์ด์๋ฅผ ๋ฏธ๋ฆฌ ํ์
๊ฐ๋ฅํ ๋ช
๋ น์ด์
๋๋ค.

ํ์ํ ์ฌ์ ์กฐ๊ฑด์ด ๋ชจ๋ ์ถฉ์กฑ๋์๋ค๊ณ ํ๋, ์ด์ ํด๋ฌ์คํฐ์ Linkerd์ Control Plane์ ๋ฐฐํฌํด๋ณด๊ฒ ์ต๋๋ค.
minikube์ Linkerd Control Plane ๋ฐฐํฌํ๊ธฐ
Linkerd์ Control Plane์ ๋ฐฐํฌํ๋ ค๋ฉด, ๋จผ์ ์๋ ๋ช ๋ น์ด๋ก Control Plane ๋์์ ํ์ํ CRD๋ค์ ์ค์นํด์ผ ํฉ๋๋ค.
linkerd install --crds | kubectl apply -f -

๊ทธ ๋ค์, ๋ณธ๊ฒฉ์ ์ผ๋ก Linkerd์ Control Plane์ ์ค์นํด๋ด ์๋ค. ์๋ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ์๋์ผ๋ก Linkerd Control Plane์ ๊ตฌ์ฑํ๋ ์ปดํฌ๋ํธ๋ค์ด ์ค์น๋ฉ๋๋ค.
linkerd install | kubectl apply -f -
๋ง์ฝ minikube๊ฐ Docker๋ก ๋์ ์ค์ด๋ผ๋ฉด...
Linkerd Control Plane ์ค์น๋ฅผ ์๋ํ ๋ proxy-init ์ปจํ ์ด๋๊ฐ ๋ฐ๋์ root ์ ์ ๋ก ๋์ํด์ผ ํ๋ค๋ ๋ฉ์์ง์ ํจ๊ป Linkerd ์ค์น๊ฐ ์ ๋ ์ ์์ต๋๋ค.
๊ทธ๋ด ๋ linkerd install --set proxyInit.runAsRoot=true | kubectl apply -f -
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด์ Linkerd๋ฅผ ์ค์นํฉ๋๋ค.
์ ์ญ์ minikube๊ฐ Docker๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ์๋์ ๊ฐ์ ๋ช ๋ น์ด๋ก Linkerd Control Plane์ ์ค์นํ์ต๋๋ค.

๊ทธ๋ผ Linkerd ๋์์ ํ์ํ ๋ชจ๋ ๋ฆฌ์์ค๊ฐ linkerd
Namespace์ ๋ฐฐํฌ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. (kubectl -n linkerd get all
)

๋ค์์ผ๋ก linkerd check
๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด Linkerd Control Plane ๋์์ ํ์ํ ๋ชจ๋ ๋ฆฌ์์ค๊ฐ ์ค์น๋์๊ณ ์ ์ ๋์ ์ค์ธ์ง ํ์ธํ ์ ์์ต๋๋ค.

์ด์ , Linkerd์ Observability ๊ธฐ๋ฅ์ ๊ฐํํ๋ viz ์ต์คํ ์ ์ ์ค์นํด๋ด ์๋ค.
Linkerd viz๊ฐ ์ค์น๋๋ฉด ์น ๋์๋ณด๋, ์จ๋๋งจ๋ ํญ ๊ธฐ๋ฅ, Prometheus ํธํ ๋ฉํธ๋ฆญ API ๋ฑ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋๋ฐ์. Service Mesh์ ์ํ๋ฅผ ์๊ฐ์ ์ผ๋ก ํ์ ํ๊ณ ๋ถ์ํ๋ ๋ฐ์ ์ ์ฉํฉ๋๋ค.
ํฐ๋ฏธ๋์์ ์๋ Linkerd viz ์ต์คํ ์ ์ค์น ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด...
linkerd viz install | kubectl apply -f -
์๋์ ๊ฐ์ด Linkerd viz ์ต์คํ ์ ์๋์ ํ์ํ ๋ชจ๋ ๋ฆฌ์์ค๊ฐ ์๋์ผ๋ก ์ค์น๋ฉ๋๋ค.

Linkerd viz ์ต์คํ
์
์ linkerd-viz
Namespace์ ๋ฐฐํฌ๋ฉ๋๋ค.

ํฐ๋ฏธ๋์์ linkerd viz dashboard
๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด ์๋์ ๊ฐ์ด Linkerd viz ๋์๋ณด๋๊ฐ ์ด๋ ธ๋ค๋ ๋ฉ์์ง๊ฐ ๋์ฌ ํ
๋ฐ์. ์ค์ต ์ค์ธ ๋ก์ปฌ ๋จธ์ ๊ณผ Linkerd ๋์๋ณด๋ Service ๊ฐ์ ํฌํธ ํฌ์๋ฉ์ด ์ค์ ๋์ด Linkerd ๋์๋ณด๋์ ์ ๊ทผ ๊ฐ๋ฅ ์ํ๊ฐ ๋ ๊ฒ์
๋๋ค.

๋ฉ์์ง์์ ์๋ ค์ฃผ๋ URL์ ์น๋ธ๋ผ์ฐ์ ์์ ์คํํ๋ฉด...

์ด๋ ๊ฒ Linkerd viz ์น ๋์๋ณด๋๋ฅผ ํ์ธํ์ค ์ ์์ต๋๋ค. Kubernetes ํด๋ฌ์คํฐ์ Namespace ๋ณ๋ก ํ์๋๋ ํธ๋ํฝ์ ๋ํ ์ฑ๊ณต๋ฅ , RPS, P99 ๋ฑ์ ์งํ๋ก ์ง๊ธ Linkerd๊ฐ ์ ์ ๋์ํ๊ณ ์์์ ์ ์ ์์ต๋๋ค.
์ฐธ๊ณ ๋ก, linkerd viz dashboard
๋ช
๋ น์ด๋ฅผ ์คํํ ํฐ๋ฏธ๋์ ๊ณ์ ์ผ๋ฌ์ผ Linkerd viz ๋์๋ณด๋์ ๊ณ์ ์ ๊ทผํ ์ ์๋ ์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
์ด์ ์ฐ๋ฆฌ์ minikube ํด๋ฌ์คํฐ์์ Linkerd ๊ตฌ์ฑ์ ๋ชจ๋ ๋ง์ณค์ต๋๋ค.๐
๋ค์์ผ๋ก Linkerd ํต์ฌ ๊ธฐ๋ฅ์ ์ฌ์ฉํด๋ณด๊ธฐ ์ํด ๋ฐ๋ชจ์ฉ Deployment 2๊ฐ๋ฅผ ๋ฐฐํฌํ ๊ฑด๋ฐ์. Linkerd Service mesh์ Deployment๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ๋ ์์ฃผ ๊ฐ๋จํฉ๋๋ค!
์ค์ต์ฉ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ๋ฐ Service Mesh์ ์ถ๊ฐํ๊ธฐ
์ฐ๋ฆฌ๊ฐ ์ง๊ธ ๊ตฌ์ฑํ Linkerd Service mesh๋ฅผ ์ฌ์ฉํด์ ํธ๋ํฝ์ ๊ด์ฐฐํ๋ ค๋ฉด ๋คํธ์ํฌ ํธ๋ํฝ์ด ๋ฐ์ํ๋ Service๊ฐ Linkerd Service mesh ์์ ํฌํจ๋์ด์ผ๊ฒ ์ฃ ? Linkerd๋ ์ด๋ฅผ ์ํด ํฌ๊ฒ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
linkerd inject ๋ช ๋ น์ด๋ก ์ด๋ฏธ ๋ฐฐํฌ๋ Kubernetes ๋ฆฌ์์ค์ Linkerd proxy ์ฃผ์
Linkerd์์ ์ธ์ ๊ฐ๋ฅํ ์ด๋ ธํ ์ด์ ์ ํน์ Namespace์ ์ถ๊ฐ
์ฐ๋ฆฌ๊ฐ ์ต๊ทผ๊น์ง ์ฌ์ฉํ ํฐ๋ฏธ๋์ linkerd viz dashboard
ํ๋ก์ธ์ค๋ฅผ ๊ณ์ ์คํ ์ค์ด๋, ๋ณ๋์ ํฐ๋ฏธ๋์ ์ด์ด์ ์ค์ต์ ์ด์ด๊ฐ์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ Linkerd ์ค์ต์ ์ฌ์ฉ๋ Kubernetes ๋ฆฌ์์ค๋ฅผ ๋ฐ๋ก ๋ฐฐํฌํ๊ธฐ ์ํด linkerd-demo
๋ ์ด๋ฆ์ Namespace๋ฅผ ๋จผ์ ์์ฑํด์ฃผ์ธ์.

1. linkerd inject ๋ช ๋ น์ด ์ฌ์ฉ
linkerd inject
๋ช
๋ น์ด๋ฅผ ์ง์ ์ฌ์ฉํด๋ณด๊ธฐ ์ํด, ๋จผ์ Linkerd ํ๋ก์๊ฐ ์๋ Nginx Deployment๋ฅผ ๋ฐฐํฌํด๋ณด๊ฒ ์ต๋๋ค. ์๋ Deployment์ Service ๋งค๋ํ์คํธ๋ฅผ YAMLํ์ผ๋ก ์ ์ฅํ ๋ค์ ํด๋ฌ์คํฐ์ ์ ์ฉ(apply
)ํด์ฃผ์ธ์.
# 1. Linkerd๋ก ๊ด์ฐฐํ '์๋ฒ' ์ญํ Nginx Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world-server
namespace: linkerd-demo
spec:
replicas: 1
selector:
matchLabels:
app: hello-world-server
template:
metadata:
labels:
app: hello-world-server
spec:
containers:
- name: hello-world
image: nginx:alpine
ports:
- containerPort: 80
---
# 2. '์๋ฒ' Nginx Deployment๋ฅผ ํด๋ฌ์คํฐ ๋ด์์ ํธ์ถํ ์ ์๋ Service
apiVersion: v1
kind: Service
metadata:
name: hello-world-server
namespace: linkerd-demo
spec:
selector:
app: hello-world-server
ports:
- name: http
port: 80
targetPort: 80

๊ทธ ๋ค์ Linkerd viz ๋์๋ณด๋๋ก ๋์์์ ์๊น ์์ฑํ linkerd-demo Namespace๋ฅผ ํด๋ฆญํด๋ณด๋ฉด...


๋ฐฉ๊ธ ์ฐ๋ฆฌ๊ฐ ๋ฐฐํฌํ hello-world-server Deployment ๋ฑ์ด ํ์๋๊ณ ๋ ์์ง๋ง, ์์ง ๋ฉํธ๋ฆญ์ด ์๋ฌด๊ฒ๋ ํ์๋๊ณ ์์ง ์์ฃ ? Linkerd ํ๋ก์๊ฐ ํด๋น Deployment์ ์ฃผ์ ๋์ง ์์์ Linkerd๊ฐ ์ด Deployment์ ๋ํ ํธ๋ํฝ ๋ฉํธ๋ฆญ์ ๋ฐ์์ค์ง ๋ชปํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ์ง์์ ๋ณด์ด๋ Meshed(๋ฉ์ํ)๋ ํ์ฌ Service mesh์ ํฌํจ๋ ๋ฆฌ์์ค์ ๊ฐ์๋ฅผ ํ์ํ ์์น์ ๋๋ค. ์ง๊ธ์ ๋ฉ์ํ๋ ๋ฆฌ์์ค๊ฐ ํ๋๋ ์์ด์ ๊ฐ๊ฐ '0/1'๋ก ํ์๋ ๊ฑฐ์ฃ .
์ด๋ ๊ฒ Linkerd ์ฌ์ฉ ์ ๋ถํฐ ๋ฐฐํฌ๋ Kubernetes์ ๋ฆฌ์์ค, ์ ํํ๋ Pod ์ค์ ์ Linkerd ํ๋ก์์ปจํ
์ด๋๋ฅผ ์ง์ ์ถ๊ฐํ๋ ๋ช
๋ น์ด๊ฐ ๋ฐ๋ก linkerd inject
์
๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ์ง๊ธ ๋ฐฐํฌ๋์ด์๋ Deployment์ Linkerd ํ๋ก์๋ฅผ ์ฃผ์ ํด์ ๋ค์ ๋ฐฐํฌํ ์ ์์๊น์? ์๋ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
kubectl -n linkerd-demo get deploy -o yaml | linkerd inject - | kubectl apply -f -
์ ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๊ฐ์ ํ๋ฆ์ผ๋ก ์คํ๋ฉ๋๋ค.
linkerd-demo
Namespace์ ์กด์ฌํ๋ ๋ชจ๋ Deployment์ ๋งค๋ํ์คํธ๋ฅผ YAML ์์์ผ๋ก ๊ฐ์ ธ์จ๋ค.๊ฐ์ ธ์จ ๋งค๋ํ์คํธ์ Pod ์ค์ ์ Linkerd ํ๋ก์ ๊ด๋ จ ์ด๋ ธํ ์ด์ ์ ์ฃผ์ ํ๋ค.
์ฃผ์ ๋ ๋งค๋ํ์คํธ๋ฅผ ๋ค์ ํด๋ฌ์คํฐ์ ๋ฐฐํฌํ๋ค.
ํด๋น ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ์๋์ ๊ฐ์ด ์ฃผ์ ๋ฐ ์ค์ ์ด ๋ณ๊ฒฝ๋์๋ค๋ ๋ฉ์์ง๊ฐ ๋จ๊ณ ,

ํด๋น Deployment์ ์ค์ ์ describe ๋ช ๋ น์ด๋ก ๋ณด๋ฉด...

๋นจ๊ฐ ๋ค๋ชจ๋ก ํ์ํ ๊ฒ์ฒ๋ผ Pod ์ค์ ๋ด์ Linkerd์ inject๊ฐ ํ์ฑํ๋์๋ค๋ ์ด๋ ธํ ์ด์ ์ด ์ถ๊ฐ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด์ Linkerd ์น ๋์๋ณด๋๋ฅผ ๋ค์ ํ์ธํด๋ณผ๊น์?

Meshed๋ 1/1๋ก ์ ๋ฐ์ดํธ๋์๊ณ ๊ฐ ๋ฉํธ๋ฆญ๋ ์ ์์ ์ผ๋ก ํ์๋๊ณ ์๋ค์!
์ด๋ ๊ฒ linkerd inject
๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ์กด์ ๋ฐฐํฌ๋์ด์๋ Kubernetes ๋ฆฌ์์ค์ Pod๋ ์ฝ๊ณ ๋น ๋ฅด๊ฒ Linkerd์ Service mesh์ ํธ์
์ํฌ ์ ์์ต๋๋ค.
2. Linkerd๊ฐ ์ธ์ ๊ฐ๋ฅํ ์ด๋ ธํ ์ด์ ์ Namespace์ ์ถ๊ฐ
๋ง์ฝ ํน์ Namespace์ ๋ฐฐํฌ๋๋ Pod๋ ์์ฑ๋์๋ง์ Linkerd Service mesh์ ํฌํจ์ํค๊ณ ์ถ์ ๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ์ถฉ๋ถํ ์์ ์ ์๋ ์๋๋ฆฌ์ค์ธ๋ฐ์.
์ด๋ด ๋ Linkerd์ ์ด๋ ธํ ์ด์ ์ ์ํ๋ Namespace์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๊ฐ๋จํ ๋ด์ฉ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ค์ตํด๋ณผ๊ฒ์.
๋จผ์ ๊ธฐ์กด Namespace(linkerd-demo
)์ ์ค์ ์ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.

์ฐ๋ฆฌ๊ฐ ์ด Namespace๋ฅผ ์์ฑํ ๋ ๋ค๋ฅธ ์ค์ ์ ์ถ๊ฐํ์ง ์์๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ๊ฐ๋ง ๊ฐ์ง๊ณ ์๋๋ฐ์. kubectl์๋ ๋ฆฌ์์ค์ ์ด๋
ธํ
์ด์
์ ์ถ๊ฐํ๋ ๋ช
๋ น์ด(annotate
)๋ฅผ ์ง์ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์๋ ๋ช
๋ น์ด๋ก Linkerd์ ์ด๋
ธํ
์ด์
์ ์ถ๊ฐํด๋ณด๊ฒ ์ต๋๋ค.
kubectl annotate namespace linkerd-demo linkerd.io/inject=enabled

๊ทธ๋ฆฌ๊ณ ๋ค์ Namespace ์ค์ ์ ํ์ธํด๋ณด๋ฉด ์๊น ์ฒซ ๋ฒ์งธ Inject ๋ฐฉ์์์ ์ถ๊ฐ๋ ๊ฒ๊ณผ ๋์ผํ ์ด๋
ธํ
์ด์
์ด ์ถ๊ฐ๋์๋๋ฐ์. ์ด์ linkerd-demo
Namespace์ ์ถ๊ฐ๋๋ ๋ชจ๋ Pod๋ Linkerd ํ๋ก์ ์ฌ์ด๋์นด ์ปจํ
์ด๋๊ฐ ๊ฐ์ด ๋๋ ๊ฒ์
๋๋ค. ๊ธ๋ฐฉ ๋๋ฌ์ฃ ?
์ด์ ์๋ ์๋ก์ด Deployment๋ฅผ ํด๋น Namespace์ ๋ฐฐํฌํด๋ณด๊ฒ ์ต๋๋ค. ์ด traffic-generator๋ ์ด๋ฆ์ Deployment๋ ์๊น ์ฐ๋ฆฌ๊ฐ ๋ฐฐํฌํ๋ hello-world-server์ 2์ด๋ง๋ค HTTP ํธ๋ํฝ์ ๋ณด๋ด๋๋ฐ์. ์ด๊ฑด ์ด๋ฐ Linkerd์ ํธ๋ํฝ ๊ด์ฐฐ ๊ธฐ๋ฅ์์๋ ์ดํด๋ณผ ์์ ์ ๋๋ค.
# '์๋ฒ'๋ก ๊พธ์คํ ํธ๋ํฝ์ ๋ฐ์์ํฌ 'ํด๋ผ์ด์ธํธ' Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: traffic-generator
namespace: linkerd-demo
spec:
replicas: 1
selector:
matchLabels:
app: traffic-generator
template:
metadata:
labels:
app: traffic-generator
spec:
containers:
- name: traffic-curl
image: curlimages/curl:latest
# 2์ด๋ง๋ค hello-world-server ์๋น์ค๋ก HTTP ์์ฒญ ๋ณด๋
command: ["sh", "-c", "while true; do echo '--> Sending request to hello-world-server'; curl -s http://hello-world-server > /dev/null; echo 'Request sent.'; sleep 2; done"]
์ ๋ ์ YAML ํ์ผ์ client.yaml
์ด๋ ์ด๋ฆ์ผ๋ก ์ ์ฅ ํ kubectl apply
๋ช
๋ น์ด๋ก ํด๋ฌ์คํฐ์ ์ ์ฉํ์ต๋๋ค.

๊ทธ๋ฆฌ๊ณ ๋ค์ Linkerd ์น ๋์๋ณด๋๋ฅผ ํ์ธํด๋ณด๋ฉด...

๋ฐฉ๊ธ ๋ฐฐํฌํ Deployment์ Pod๋ Meshed ์ํ๊ฐ ๋๊ณ ํธ๋ํฝ ๋ฉํธ๋ฆญ๋ ์ ๋๋ก ํ์๋๊ณ ์์ต๋๋ค! ์ด๋ ๊ฒ linkerd-demo
Namespace์ ์๋ก ์์ฑ๋๋ Pod๋ ์ด์ ์๋์ผ๋ก Linkerd์ Service mesh์ ํธ์
๋ฉ๋๋ค.
์ง๊ธ๊น์ง Linkerd์ Service mesh์ Pod๋ฅผ ํธ์ ์ํค๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ํด ์์๋ดค๋๋ฐ์. Linkerd์ ์ค๊ณ ์ฒ ํ์ธ 'Keep it simple'๊ณผ 'Just work'์ด ๋ น์๋ , ์์ฃผ ๊ฐ๋จํ ๋ฐฉ์์ ๋๋ค.
์ด์ ์ฐ๋ฆฌ์ Deployment๋ Linkerd Service mesh์ ์ ํธ์ ๋์์ผ๋, Linkerd์ ํต์ฌ ๊ธฐ๋ฅ๋ค์ ์ค์ ๋ก ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค.
Linkerd ํต์ฌ ๊ธฐ๋ฅ ์ง์ ์ฌ์ฉํด๋ณด๊ธฐ
Linkerd์ ํต์ฌ ๊ธฐ๋ฅ๋ค์ ๋๋ถ๋ถ Linkerd ์น ๋์๋ณด๋์์๋ ์ ๊ทผํ ์ ์์ต๋๋ค. ํ์ง๋ง ํฐ๋ฏธ๋์์ ํน์ ๋ช ๋ น์ด๋ก ์ํ๋ ๋ถ๋ถ๋ง ๋ฐ๋ก ํ์ธํด์ผ ํ๋ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์, ๋ณธ ์ค์ต์ ๋ง๋ฌด๋ฆฌ๋ก Linkerd์ ํ์ ๊ธฐ๋ฅ์ ๋ํ ๋ช ๋ น์ด 3๊ฐ์ง๋ฅผ ๊ฐ์ด ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
1. linkerd viz stat
๋ช
๋ น์ด๋ก ํ์ฌ ํธ๋ํฝ ํต๊ณ ํ์ธํ๊ธฐ
linkerd viz stat
Linkerd Service Mesh ๋ด ๋ฆฌ์์ค๋ค์ ์ค์๊ฐ ํธ๋ํฝ ํต๊ณ๋ฅผ ์์ฝํ์ฌ ๋ณด์ฌ์ฃผ๋ ๋๊ตฌ์
๋๋ค. ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ฉด linkerd-demo
Namespace ๋ด ๋ชจ๋ Deployment์ ํ์ฌ ์ด๋น ์์ฒญ ์(RPS), ์ฑ๊ณต๋ฅ (SR), ์ง์ฐ ์๊ฐ(P99) ๋ฑ์ ํ์ธํ ์ ์์ฃ .
linkerd viz stat deploy -n linkerd-demo

2. linkerd viz tap
๋ช
๋ น์ด๋ก ์ค์๊ฐ ์์ฒญ ๋ฐ ์๋ต ์คํธ๋ฆผ ๊ด์ฐฐํ๊ธฐ
linkerd viz tap
๋ช
๋ น์ด๋ ํน์ k8s ๋ฆฌ์์ค(Deployment, Pod, Service ๋ฑ)๋ฅผ ํต๊ณผํ๋ ์ค์ ์์ฒญ๊ณผ ์๋ต์ ์คํธ๋ฆผ์ ์ค์๊ฐ์ผ๋ก ์บก์ฒํด์ ๋ณด์ฌ์ฃผ๋ ๋๊ตฌ์
๋๋ค. ๊ฐ๋ฐ์๋ ์ด์์๋ ์ด๋ฅผ ํตํด ๊ฐ๋ณ ์์ฒญ์ ํค๋, ๋ณธ๋ฌธ, ์ํ ์ฝ๋, ์ง์ฐ ์๊ฐ ๋ฑ์ ์ง์ ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ํด๊ฒฐ์ด๋ ํธ๋ํฝ ๋ถ์์ ์ ์ฉํ๋ฐ์.
์๋์ ๊ฐ์ด linkerd-demo
Namespace ๋ด ๋ชจ๋ Deployment์์ ๋ฐ์ํ๋ ์์ฒญ๊ณผ ์๋ต ์คํธ๋ฆผ์ ์ค์๊ฐ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
linkerd viz tap deploy -n linkerd-demo

3. linkerd viz edges
๋ช
๋ น์ด๋ก ์๋น์ค ๊ฐ mTLS ์ํธํ ์ฐ๊ฒฐ ์ํ ํ์ธํ๊ธฐ
Linkerd๋ Service Mesh์ ํฌํจ๋ ์๋น์ค ๊ฐ์ ๋ชจ๋ TCP ํต์ ์ ์๋์ผ๋ก mTLS๋ก ์ํธํํ๋ค๊ณ ํ์ฃ . ์ด๋ฌํ mTLS ์ฐ๊ฒฐ ์ํ๋ Linkerd ๋์๋ณด๋์ ํ ํด๋ก์ง ๋ทฐ๋ ๊ฐ ์๋น์ค ์์ธ ํ๋ฉด์์ ์๊ฐ์ ์ผ๋ก ํ์ธํ ์ ์๋๋ฐ์.
ํฐ๋ฏธ๋์์ linkerd viz edges deploy -n {Namespace ์ด๋ฆ}
์ ๊ฐ์ ๋ช
๋ น์ด๋ฅผ ํตํด์๋ ์ด๋ค ์๋น์ค๋ค์ด mTLS๋ก ์์ ํ๊ฒ ํต์ ํ๊ณ ์๋์ง ๋ฐ๋ก ํ์ธ ๊ฐ๋ฅํฉ๋๋ค. ์๋์ ๊ฐ์ด ๋ช
๋ น์ด๋ฅผ ์คํํ๋ฉด linkerd-demo
Namespace ๋ด ๋ชจ๋ Deployment์ mTLS ์ฐ๊ฒฐ ์ํ๋ฅผ ํ์ธํ ์ ์๋ ๊ฒ๋๋ค.
linkerd viz edges deploy -n linkerd-demo

๋ง๋ฌด๋ฆฌ
์ง๊ธ๊น์ง Linkerd ์ค์น๋ถํฐ Service mesh์ Deployment ํธ์ , Linkerd์ ํต์ฌ ๋ช ๋ น์ด 3๊ฐ์ง๊น์ง ์ดํด๋ดค๋๋ฐ์. Linkerd๋ ๋ฌด์์ธ์ง ์กฐ๊ธ ๋ ๊ฐ์ด ์กํ์ จ๋์?
๋ฌผ๋ก ์ค์ ์ด์ ํ๊ฒฝ์ Linkerd๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ๋์ ํ๊ธฐ ์ํด์๋ Control Plane๊ณผ Data Plane์ ๋ฆฌ์์ค ์๊ตฌ ์ฌํญ ๊ณํ๋ถํฐ ๊ณ ๊ฐ์ฉ์ฑ์ ์ํ Control Plane ๋ณต์ ๊ตฌ์ฑ ๋ฑ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ด ๋ ์์ ์ ์์ต๋๋ค.
ํ์ง๋ง Linkerd์ ๊ฐ์ Service Mesh๋ฅผ ์ง์ ์ค์นํ๊ณ ์ด์ํด๋ณด๋ ๊ฒฝํ์ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ์ ๋ณต์กํ ํต์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ , ์๋น์ค์ ๊ด์ฐฐ ๊ฐ๋ฅ์ฑ, ์ ๋ขฐ์ฑ, ๋ณด์์ ํฅ์์ํค๋ ๋ฐ์ ํ์ํ ์ค์ง์ ์ธ ์ญ๋์ ํค์์ค๋๋ค.
์ด๋ฐ ๊ฒฝํ์ ๋จ์ํ ํ๋์ ๋๊ตฌ๋ฅผ ๋ฐฐ์ฐ๋ ๊ฒ์ ๋์ด, ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ํ๊ฒฝ์์์ ์์คํ ์ด์ ์ ๋ฐ์ ๋ํ ์ดํด๋๋ฅผ ๋์ด๋ ์ค์ํ ๋ฐ๊ฑฐ๋ฆ์ด ๋๋ค๊ณ ํ ์ ์์ต๋๋ค.
๋ถ๋ ์ด๋ฒ ์๋ฆฌ์ฆ๋ฅผ ํตํด Service mesh๋ Linkerd์ ๋ํด ๋ ์๊ณ ์ถ์ผ์ จ๋ ๋ถ๋ค์๊ฒ ์ข์ ์ฒซ ๊ฑธ์์ด ๋์๊ธธ ๋ฐ๋๋๋ค.
๊ทธ๋ผ ๋ค์ ์ํฐํด์์ ๋ ํฅ๋ฏธ๋ก์ด ์ฃผ์ ๋ก ์ฐพ์๋ต๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
References
โจ์ด๋ฒ ๋ด์ค๋ ํฐ๋ ์ด๋ ์ จ๋์?
์ด๋ฒ ๊ธ์์ ๋ค๋ฃฌ ์ฃผ์ ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ๋์ง ์๋ ค์ฃผ์ธ์! ๋ด์ค๋ ํฐ๋ฅผ ๋ ๋์ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ํ๊ธฐ ์ํด ์๋ ํผ์์ ์งง์ ํผ๋๋ฐฑ์ ๋ฐ๊ณ ์์ด์.
๐ ํผ๋๋ฐฑ ๋ณด๋ด๊ธฐ (1~2๋ถ ์์)
์ฌ๋ฌ๋ถ๋ค์ ์์คํ ์๊ฒฌ์ Aidenโs Lab ๋ด์ค๋ ํฐ์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค!
๐ญAidenโs Lab์์ ๋ ๋ง์ ์ํฐํด์ ๋ง๋๋ณด์ธ์
๋ฐํ๋ ๋ด์ค๋ ํฐ๋ฅผ ์์นด์ด๋นํ๊ณ ๋ค์ํ ์ ๋ณด๋ฅผ ๊ณต์ ํ๋ ๊ธฐ์ ๋ธ๋ก๊ทธ๋ฅผ ์ด์ ์ค์ ๋๋ค.