๋ฉ๋ชจ. ๋ฒ์ญ: ์ด ๊ธ์ ์ ์๋ ์ฒด์ฝ์ ์๊ท๋ชจ ํ์ฌ์ธ ํ์ดํํ ์ผ(pipetail)์ ์์ง๋์ด์ ๋๋ค. ๊ทธ๋ค์ Kubernetes ํด๋ฌ์คํฐ ์ด์๊ณผ ๊ด๋ จ๋ [๋๋๋ก ์ง๋ถํ์ง๋ง ์ฌ์ ํ] ๋งค์ฐ ์๊ธํ ๋ฌธ์ ์ ์คํด์ ๋ฉ์ง ๋ชฉ๋ก์ ์ ๋ฆฌํ์ต๋๋ค.
์ง๋ ์๋
๊ฐ Kubernetes๋ฅผ ์ฌ์ฉํ๋ฉด์ ์ฐ๋ฆฌ๋ ์๋ง์ ํด๋ฌ์คํฐ(GCP, AWS ๋ฐ Azure์์ ๊ด๋ฆฌํ ๋ฐ ๋น๊ด๋ฆฌํ ๋ชจ๋)๋ฅผ ์ฌ์ฉํด ์์ต๋๋ค. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ฐ๋ฆฌ๋ ์ผ๋ถ ์ค์๊ฐ ์ง์์ ์ผ๋ก ๋ฐ๋ณต๋๋ค๋ ๊ฒ์ ์์์ฐจ๋ฆฌ๊ธฐ ์์ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋ ๋ถ๋๋ฌ์ด ๊ฒ์ด ์์ต๋๋ค. ๋๋ถ๋ถ์ ์์
์ ์ฐ๋ฆฌ๊ฐ ์ง์ ์ํํ์ต๋๋ค!
์ด ๊ธฐ์ฌ์๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ค๋ฅ๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ด๋ฅผ ์์ ํ๋ ๋ฐฉ๋ฒ๋ ์ธ๊ธ๋์ด ์์ต๋๋ค.
1. ๋ฆฌ์์ค: ์์ฒญ ๋ฐ ์ ํ
์ด ํญ๋ชฉ์ ํ์คํ ๊ฐ์ฅ ์ฃผ๋ชฉ์ ๋ฐ๊ณ ๋ชฉ๋ก์์ XNUMX์๋ฅผ ์ฐจ์งํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก CPU ์์ฒญ ์ ํ ์ง์ ๋์ง ์์๊ฑฐ๋ ๊ฐ์ด ๋งค์ฐ ๋ฎ์ (๊ฐ ๋
ธ๋์ ๊ฐ๋ฅํ ํ ๋ง์ ํฌ๋๋ฅผ ๋ฐฐ์นํ๊ธฐ ์ํด) ๋ฐ๋ผ์ ๋
ธ๋๊ฐ ๊ณผ๋ถํ๋ฉ๋๋ค. ๋ก๋๊ฐ ๋์ ์๊ฐ์๋ ๋
ธ๋์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ด ์์ ํ ํ์ฉ๋๊ณ ํน์ ์ํฌ๋ก๋๋ ๋
ธ๋์์ "์์ฒญํ" ๊ฒ๋ง ์์ ํฉ๋๋ค. CPU ์กฐ์ . ์ด๋ก ์ธํด ์ ํ๋ฆฌ์ผ์ด์
๋๊ธฐ ์๊ฐ, ์๊ฐ ์ด๊ณผ ๋ฐ ๊ธฐํ ๋ถ์พํ ๊ฒฐ๊ณผ๊ฐ ์ฆ๊ฐํฉ๋๋ค. (์ด์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ต๊ทผ ๋ค๋ฅธ ๋ฒ์ญ์์ ์ฝ์ด๋ณด์ธ์: โ
์ต๊ณ ์ ๋ ธ๋ ฅ (๊ทน๋๋ก ์๋ ๊ถ์ฅ):
resources: {}
๋งค์ฐ ๋ฎ์ CPU ์์ฒญ(๋งค์ฐ ์๋ ๊ถ์ฅ):
resources:
Requests:
cpu: "1m"
๋ฐ๋ฉด์ CPU ์ ํ์ด ์์ผ๋ฉด ๋ ธ๋ ํ๋ก์ธ์๊ฐ ์์ ํ ๋ก๋๋์ง ์์ ๊ฒฝ์ฐ์๋ ํฌ๋์์ ํด๋ก ์ฃผ๊ธฐ๋ฅผ ๋นํฉ๋ฆฌ์ ์ผ๋ก ๊ฑด๋๋ธ ์ ์์ต๋๋ค. ๋ค์ ๋งํ์ง๋ง ์ด๋ก ์ธํด ์ง์ฐ์ด ์ฆ๊ฐํ ์ ์์ต๋๋ค. ๋งค๊ฐ๋ณ์๋ฅผ ๋๋ฌ์ผ ๋ ผ๋์ ๊ณ์๋๋ค CPU CFS ํ ๋น๋ ์ค์ ๋ ์ ํ์ ๋ฐ๋ผ Linux ์ปค๋ ๋ฐ CPU ์กฐ์ , CFS ํ ๋น๋ ๋นํ์ฑํ... ์์ฝ๊ฒ๋ CPU ์ ํ์ ํด๊ฒฐํ ์ ์๋ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์ด์ ๋ํ ์์ธํ ๋ด์ฉ์ ์๋ ๋งํฌ์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
๊ณผ๋ํ ์ ํ (์ค๋ฒ ์ปค๋ฐ) ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ ๋ ํฐ ๋ฌธ์ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. CPU ํ๋์ ๋๋ฌํ๋ฉด ํด๋ก ์ฃผ๊ธฐ๋ฅผ ๊ฑด๋๋ฐ๊ฒ ๋๊ณ , ๋ฉ๋ชจ๋ฆฌ ํ๋์ ๋๋ฌํ๋ฉด ํฌ๋๊ฐ ์ข ๋ฃ๋ฉ๋๋ค. ๊ด์ฐฐํ ์ ์ด ์๋์? OOMํฌ? ์, ๊ทธ๊ฒ์ด ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ๋งํ๋ ๊ฒ์ ๋๋ค.
์ด๋ฐ ์ผ์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ ์ต์ํํ๊ณ ์ถ์ต๋๊น? ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณผ๋ํ๊ฒ ํ ๋นํ์ง ๋ง๊ณ ๋ฉ๋ชจ๋ฆฌ ์์ฒญ์ ํ๋๋ก ์ค์ ํ์ฌ(์๋ ์์ ๊ฐ์ด) ๋ณด์ฅ๋ QoS(์๋น์ค ํ์ง)๋ฅผ ์ฌ์ฉํ์ธ์. ์ด์ ๋ํด ์์ธํ ์์๋ณด์ธ์.
๋ฒ์คํธ ๊ฐ๋ฅ (OOMkill์ด ๋ฐ์ํ ํ๋ฅ ์ด ๋์์ง):
resources:
requests:
memory: "128Mi"
cpu: "500m"
limits:
memory: "256Mi"
cpu: 2
๋ณด์ฅ:
resources:
requests:
memory: "128Mi"
cpu: 2
limits:
memory: "128Mi"
cpu: 2
๋ฆฌ์์ค๋ฅผ ์ค์ ํ ๋ ์ ์ฌ์ ์ผ๋ก ๋์์ด ๋๋ ๊ฒ์ ๋ฌด์์ ๋๊น?
๊ณผ ๋ฉํธ๋ฆญ ์๋ฒ Pod(๋ฐ ๊ทธ ์์ ์๋ ์ปจํ ์ด๋)๋ณ ํ์ฌ CPU ๋ฆฌ์์ค ์๋น ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํ์ธํ ์ ์์ต๋๋ค. ์๋ง๋ ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ๋ค์ ๋ช ๋ น์ ์คํํ๋ฉด ๋ฉ๋๋ค.
kubectl top pods
kubectl top pods --containers
kubectl top nodes
๊ทธ๋ฌ๋ ํ์ฌ ์ฌ์ฉ๋๋ง ํ์๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ํฌ๊ธฐ ์์์ ๋ํ ๋๋ต์ ์ธ ์์ด๋์ด๋ฅผ ์ป์ ์ ์์ง๋ง ๊ถ๊ทน์ ์ผ๋ก๋ ๋ค์์ด ํ์ํฉ๋๋ค. ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ฅธ ์ธก์ ํญ๋ชฉ ๋ณ๊ฒฝ ๋ด์ญ (์: "์ต๊ณ CPU ๋ก๋๋ ์ผ๋ง์๋์?", "์ด์ ์์นจ ๋ก๋๋ ์ผ๋ง์๋์?" ๋ฑ๊ณผ ๊ฐ์ ์ง๋ฌธ์ ๋ตํ๊ธฐ ์ํด) ์ด๋ฅผ ์ํด ๋ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํ๋ก ๋ฉํ ์ฐ์ค, ๋ฐ์ดํฐ ๋๊ทธ ๋ฐ ๊ธฐํ ๋๊ตฌ. ๋จ์ํ ๋ฉํธ๋ฆญ ์๋ฒ์์ ๋ฉํธ๋ฆญ์ ๊ฐ์ ธ์ ์ ์ฅํ๋ฉด ์ฌ์ฉ์๋ ์ด๋ฅผ ์ฟผ๋ฆฌํ๊ณ ๊ทธ์ ๋ฐ๋ผ ํ๋กฏํ ์ ์์ต๋๋ค.
์ปดํจํ ์ฑ๋ฅ์ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ์ฌ์ด ์ผ์ด ์๋๋๋ค. ํญ์ ํ ํธ๋ฆฌ์ค ๊ฒ์์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ๋ฎ์ ํ๊ท ์๋น(์: 10%)๋ก ์ปดํจํ ์ฑ๋ฅ์ ๋๋ฌด ๋ง์ ๋น์ฉ์ ์ง๋ถํ๊ณ ์๋ค๋ฉด AWS Fargate ๋๋ Virtual Kubelet ๊ธฐ๋ฐ ์ ํ์ ์ดํด๋ณด๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ด๋ ์๋ฒ๋ฆฌ์ค/์ข ๋์ ๊ฒฐ์ ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋์์ผ๋ฉฐ, ์ด๋ฌํ ์กฐ๊ฑด์์๋ ๋ ์ ๋ ดํ ์ ์์ต๋๋ค.
2. ํ๋์ฑ ๋ฐ ์ค๋น ์ํ ํ๋ก๋ธ
๊ธฐ๋ณธ์ ์ผ๋ก Kubernetes์์๋ ํ์ฑ ์ํ ๋ฐ ์ค๋น ์ํ ํ์ธ์ด ํ์ฑํ๋์ด ์์ง ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ก๋ ์ ์์ ์ผ๋ ๊ฒ์ ์์ด๋ฒ๋ฆด ๋๋ ์์ต๋๋ค...
ํ์ง๋ง ์น๋ช ์ ์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์๋น์ค๋ฅผ ๋ค์ ์์ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ๊ทธ๋ฆฌ๊ณ ๋ก๋ ๋ฐธ๋ฐ์๋ ํฌ๋๊ฐ ํธ๋ํฝ์ ์์ฉํ ์ค๋น๊ฐ ๋์๋์ง ์ด๋ป๊ฒ ์ ์ ์๋์? ์๋๋ฉด ๋ ๋ง์ ํธ๋ํฝ์ ์ฒ๋ฆฌํ ์ ์์ต๋๊น?
์ด๋ฌํ ํ ์คํธ๋ ์ข ์ข ์๋ก ํผ๋๋ฉ๋๋ค.
- ์๋๊ฐ โ "์์กด ๊ฐ๋ฅ์ฑ" ๊ฒ์ฌ - ์คํจํ ๊ฒฝ์ฐ ํฌ๋๋ฅผ ๋ค์ ์์ํฉ๋๋ค.
- ์ค๋น โ ์ค๋น ํ์ธ, ์คํจํ๋ฉด Kubernetes ์๋น์ค์์ ํฌ๋ ์ฐ๊ฒฐ์ ๋์ต๋๋ค(์ด๋ ๋ค์์ ์ฌ์ฉํ์ฌ ํ์ธํ ์ ์์ต๋๋ค).
kubectl get endpoints
) ๋ค์ ํ์ธ์ด ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ๋๊น์ง ํธ๋ํฝ์ด ๋์ฐฉํ์ง ์์ต๋๋ค.
์ด ๋ ๊ฐ์ง ๊ฒ์ฌ ๋ชจ๋ ํฌ๋์ ์ ์ฒด ์๋ช ์ฃผ๊ธฐ ๋์ ์ํ๋ฉ๋๋ค.. ๊ทธ๊ฒ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ์คํด๋ ์ค๋น ์ํ ํ๋ก๋ธ๊ฐ ์์ ์์๋ง ์คํ๋์ด ๋ฐธ๋ฐ์๊ฐ ํฌ๋๊ฐ ์ค๋น๋์์์ ์ ์ ์๋ค๋ ๊ฒ์
๋๋ค(Ready
) ํธ๋ํฝ ์ฒ๋ฆฌ๋ฅผ ์์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์ฌ์ฉ ์ต์
์ค ํ๋์ผ ๋ฟ์
๋๋ค.
๋ ๋ค๋ฅธ ํ๋๋ Pod์ ํธ๋ํฝ์ด ๊ณผ๋ํ๋ค๋ ๊ฒ์ ์์๋ผ ๊ฐ๋ฅ์ฑ์ด๋ฉฐ, ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๋ค (๋๋ ํฌ๋๊ฐ ๋ฆฌ์์ค ์ง์ฝ์ ์ธ ๊ณ์ฐ์ ์ํํจ) ์ด ๊ฒฝ์ฐ ์ค๋น ์ํ ํ์ธ์ด ๋์์ด ๋ฉ๋๋ค. ํฌ๋์ ๋ถํ๋ฅผ ์ค์ด๊ณ ํฌ๋๋ฅผ "๋๊ฐ"์ํต๋๋ค.. ํฅํ ์ค๋น ์ํ ํ์ธ์ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃํ๋ฉด ํฌ๋์ ๋ถํ๋ฅผ ๋ค์ ๋๋ฆฝ๋๋ค.. ์ด ๊ฒฝ์ฐ(์ค๋น ํ ์คํธ๊ฐ ์คํจํ๋ฉด) ํ์ฑ ํ ์คํธ ์คํจ๋ ๋งค์ฐ ๋น์์ฐ์ ์ ๋๋ค. ๊ฑด๊ฐํ๊ณ ์ด์ฌํ ์ผํ๋ ํฌ๋๋ฅผ ๋ค์ ์์ํ๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋ฐ๋ผ์ ์ด๋ค ๊ฒฝ์ฐ์๋ ์๋ชป ๊ตฌ์ฑ๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ํ์ฑํํ๋ ๊ฒ๋ณด๋ค ์ ํ ํ์ธํ์ง ์๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค. ์์์ ๋งํ ๋๋ก๋ผ๋ฉด, ํ์ฑ ํ์ธ ๋ณต์ฌ๋ณธ ์ค๋น ํ์ธ, ๊ทธ๋ ๋ค๋ฉด ๋น์ ์ ํฐ ์ด๋ ค์์ ์ฒํด ์์ต๋๋ค. ๊ฐ๋ฅํ ์ต์
์ ๊ตฌ์ฑํ๋ ๊ฒ์
๋๋ค
๊ณตํต ์ข
์์ฑ์ด ์คํจํ ๋ ๋ ๊ฐ์ง ์ ํ์ ๊ฒ์ฌ ๋ชจ๋ ์คํจํด์๋ ์ ๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ชจ๋ Pod์ ๊ณ๋จ์(๋์ฌํ์ ๊ฐ์) ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค. ๋ค์ ๋งํด์,
3. ๊ฐ HTTP ์๋น์ค์ ๋ํ LoadBalancer
์๋ง๋ ํด๋ฌ์คํฐ์๋ ์ธ๋ถ๋ก ์ ๋ฌํ๋ ค๋ HTTP ์๋น์ค๊ฐ ์์ ๊ฒ์ ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์๋น์ค๋ฅผ ์ด๋ฉด type: LoadBalancer
, ํด๋น ์ปจํธ๋กค๋ฌ(์๋น์ค ์ ๊ณต์
์ฒด์ ๋ฐ๋ผ ๋ค๋ฆ)๋ ์ธ๋ถ LoadBalancer(๋ฐ๋์ L7์์ ์คํ๋ ํ์๋ ์์ง๋ง L4์์๋ ์คํ๋จ)๋ฅผ ์ ๊ณตํ๊ณ ํ์ํ๋ฉฐ ์ด๋ ๋น์ฉ(์ธ๋ถ ์ ์ IPv4 ์ฃผ์, ์ปดํจํ
์ฑ๋ฅ, ์ด๋น ์ฒญ๊ตฌ)์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ) ๊ทธ๋ฌํ ๋ฆฌ์์ค๋ฅผ ๋ง์ด ์์ฑํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ด ๊ฒฝ์ฐ ํ๋์ ์ธ๋ถ ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ฌ๋ ๊ฒ์ด ํจ์ฌ ๋ ๋
ผ๋ฆฌ์ ์
๋๋ค. type: NodePort
. ์๋๋ฉด ๋ ๋์ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ด ํ์ฅํ๋ ๊ฒ์
๋๋ค. nginx-์์ -์ปจํธ๋กค๋ฌ (๋๋ Traefik), ๋๊ฐ ์ ์ผํ ์ฌ๋์ด ๋ ๊ฒ์ธ๊ฐ? ๋
ธ๋ํฌํธ ์ธ๋ถ ๋ก๋ ๋ฐธ๋ฐ์์ ์ฐ๊ฒฐ๋ ์๋ํฌ์ธํธ์ด๋ฉฐ ๋ค์์ ์ฌ์ฉํ์ฌ ํด๋ฌ์คํฐ์ ํธ๋ํฝ์ ๋ผ์ฐํ
ํฉ๋๋ค. ์
๊ตฌ-์ฟ ๋ฒ๋คํฐ์ค ๋ฆฌ์์ค.
์๋ก ์ํธ ์์ฉํ๋ ๋ค๋ฅธ ํด๋ฌ์คํฐ ๋ด(๋ง์ดํฌ๋ก) ์๋น์ค๋ ๋ค์๊ณผ ๊ฐ์ ์๋น์ค๋ฅผ ์ฌ์ฉํ์ฌ "ํต์ "ํ ์ ์์ต๋๋ค. ํด๋ฌ์คํฐIP DNS๋ฅผ ํตํ ๋ด์ฅํ ์๋น์ค ๊ฒ์ ๋ฉ์ปค๋์ฆ. ๊ณต์ฉ DNS/IP๋ฅผ ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ์ง์ฐ ์๊ฐ์ ์ํฅ์ ๋ฏธ์น๊ณ ํด๋ผ์ฐ๋ ์๋น์ค ๋น์ฉ์ด ์ฆ๊ฐํ ์ ์์ต๋๋ค.
4. ํด๋ฌ์คํฐ ๊ธฐ๋ฅ์ ๊ณ ๋ คํ์ง ์๊ณ ํด๋ฌ์คํฐ ์๋ ํ์ฅ
ํด๋ฌ์คํฐ์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๊ณ ์ ๊ฑฐํ ๋ ํด๋น ๋ ธ๋์ CPU ์ฌ์ฉ๋๊ณผ ๊ฐ์ ์ผ๋ถ ๊ธฐ๋ณธ ์ธก์ ํญ๋ชฉ์ ์์กดํด์๋ ์ ๋ฉ๋๋ค. ํฌ๋ ๊ณํ์๋ ๋ง์ ์ฌํญ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ์ ํ, ํฌ๋/๋ ธ๋ ์ ํธ๋, ์ค์ผ ๋ฐ ํ์ฉ, ๋ฆฌ์์ค ์์ฒญ, QoS ๋ฑ๊ณผ ๊ฐ์ ์ด๋ฌํ ๋ฏธ๋ฌํ ์ฐจ์ด๋ฅผ ๊ณ ๋ คํ์ง ์์ ์ธ๋ถ ์๋ ํฌ๊ธฐ ์กฐ์ ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
ํน์ ํฌ๋๋ฅผ ์์ฝํด์ผ ํ์ง๋ง ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ CPU ์ฑ๋ฅ์ด ์์ฒญ/๋ถํด๋๊ณ ํฌ๋๊ฐ ์์ฝ๋๋ค๊ณ ์์ํด ๋ณด์ธ์. ์ํ์ ๊ฑธ๋ฆฌ๋ค Pending
. ์ธ๋ถ ์๋ ํ์ฅ ์ฒ๋ฆฌ๋ ํ๊ท ํ์ฌ CPU ๋ก๋(์์ฒญ๋ ๋ก๋๊ฐ ์๋)๋ฅผ ํ์ธํ๊ณ ํ์ฅ์ ์์ํ์ง ์์ต๋๋ค. (์ค์ผ์ผ ์์) - ๋ค๋ฅธ ๋
ธ๋๋ฅผ ์ถ๊ฐํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด ํฌ๋๋ ์์ฝ๋์ง ์์ต๋๋ค.
์ด ๊ฒฝ์ฐ ์ญ์ค์ผ์ผ๋ง (์ค์ผ์ผ์ธ) โ ํด๋ฌ์คํฐ์์ ๋
ธ๋๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ํญ์ ๊ตฌํํ๊ธฐ๊ฐ ๋ ์ด๋ ต์ต๋๋ค. ์ํ ์ ์ฅ ํฌ๋(์๊ตฌ ์คํ ๋ฆฌ์ง๊ฐ ์ฐ๊ฒฐ๋์ด ์์)๊ฐ ์๋ค๊ณ ์์ํด ๋ณด์ธ์. ์๊ตฌ ๋ณผ๋ฅจ ๋ณดํต ์ํด์๋ค ํน์ ๊ฐ์ฉ์ฑ ์์ญ ํด๋น ์ง์ญ์์๋ ๋ณต์ ๋์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ธ๋ถ ์๋ ํฌ๊ธฐ ์กฐ์ ๊ธฐ๊ฐ ์ด Pod๊ฐ ์๋ ๋
ธ๋๋ฅผ ์ญ์ ํ๋ ๊ฒฝ์ฐ ์ค์ผ์ค๋ฌ๋ ์ด Pod๋ฅผ ๋ค๋ฅธ ๋
ธ๋์์ ์์ฝํ ์ ์์ต๋๋ค. ์ด๋ ์๊ตฌ ์ ์ฅ์๊ฐ ์๋ ๊ฐ์ฉ์ฑ ์์ญ์์๋ง ์ํํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ํฌ๋๊ฐ ํด๋น ์ํ์์ ๋ฉ์ถฅ๋๋ค. Pending
.
Kubernetes ์ปค๋ฎค๋ํฐ์์ ๋งค์ฐ ์ธ๊ธฐ ์์
5. IAM/RBAC ๊ธฐ๋ฅ ๋ฌด์
์๊ตฌ ๋ณด์ ๋น๋ฐ์ ๊ฐ์ง IAM ์ฌ์ฉ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ฃผ์ํ์ธ์. ๊ธฐ๊ณ ๋ฐ ์์ฉ ํ๋ก๊ทธ๋จ. ์ญํ ๋ฐ ์๋น์ค ๊ณ์ ์ ์ฌ์ฉํ์ฌ ์์ ์ก์ธ์ค ๊ตฌ์ฑ (์๋น์ค ๊ณ์ ).
์ฐ๋ฆฌ๋ ์ก์ธ์ค ํค(๋ฐ ๋ณด์ ๋น๋ฐ)๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ฑ์ ํ๋์ฝ๋ฉ๋์ด ์๊ณ Cloud IAM์ ์ก์ธ์คํ ์ ์์์๋ ๋ถ๊ตฌํ๊ณ ๋ณด์ ๋น๋ฐ ์ํ์ ๋ฌด์ํ๋ค๋ ์ฌ์ค์ ์์ฃผ ์ ํฉ๋๋ค. ์ ์ ํ ๊ฒฝ์ฐ ์ฌ์ฉ์ ๋์ IAM ์ญํ ๋ฐ ์๋น์ค ๊ณ์ ์ ์ฌ์ฉํฉ๋๋ค.
kube2iam์ ์์ด๋ฒ๋ฆฌ๊ณ ์๋น์ค ๊ณ์ ์ ๋ํ IAM ์ญํ ๋ก ๋ฐ๋ก ์ด๋ํ์ธ์(์ ์ค๋ช
๋ ๋๋ก).
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/my-app-role
name: my-serviceaccount
namespace: default
์ฃผ์ ํ๋. ๊ทธ๋ ๊ฒ ์ด๋ ต์ง๋ ์์ฃ ?
๋ํ ์๋น์ค ๊ณ์ ๋ฐ ์ธ์คํด์ค ํ๋กํ ๊ถํ์ ๋ถ์ฌํ์ง ๋ง์ธ์. admin
ะธ cluster-admin
ํ์ํ์ง ์๋ค๋ฉด. ์ด๋ ํนํ RBAC K8์์ ๊ตฌํํ๊ธฐ๊ฐ ์กฐ๊ธ ๋ ์ด๋ ต์ง๋ง ํ์คํ ๋
ธ๋ ฅํ ๋งํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
6. Pod์ ๋ํ ์๋ ๋ฐ์นํ์ฑ์ ์์กดํ์ง ๋ง์ธ์.
๋ ธ๋์ ์ผ๋ถ ๋ฐฐํฌ์ ๋ณต์ ๋ณธ์ด XNUMX๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ ธ๋๊ฐ ๋จ์ด์ง๊ณ ๋ชจ๋ ๋ณต์ ๋ณธ๋ ํจ๊ป ๋จ์ด์ง๋๋ค. ๋ถ์พํ ์ํฉ์ด์ฃ ? ๊ทธ๋ฐ๋ฐ ์ ๋ชจ๋ ๋ณต์ ๋ณธ์ด ๋์ผํ ๋ ธ๋์ ์์์ต๋๊น? Kubernetes๋ ๊ณ ๊ฐ์ฉ์ฑ(HA)์ ์ ๊ณตํด์ผ ํ์ง ์๋์?!
๋ถํํ๊ฒ๋ Kubernetes ์ค์ผ์ค๋ฌ๋ ์์ฒด์ ์ผ๋ก ๋ณ๋์ ์กด์ฌ ๊ท์น์ ์ค์ํ์ง ์์ต๋๋ค. (๋ฐ์นํ์ฑ) ํฌ๋์ฉ. ๋ช ์์ ์ผ๋ก ๋ช ์ํด์ผ ํฉ๋๋ค.
// ะพะฟััะตะฝะพ ะดะปั ะบัะฐัะบะพััะธ
labels:
app: zk
// ะพะฟััะตะฝะพ ะดะปั ะบัะฐัะบะพััะธ
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- zk
topologyKey: "kubernetes.io/hostname"
๊ทธ๊ฒ ๋ค์ผ. ์ด์ ํฌ๋๋ ๋ค๋ฅธ ๋
ธ๋์ ์์ฝ๋ฉ๋๋ค(์ด ์กฐ๊ฑด์ ์์ฝ ์ค์๋ง ํ์ธ๋๊ณ ์์
์ค์๋ ํ์ธ๋์ง ์์ต๋๋ค. requiredDuringSchedulingIgnoredDuringExecution
).
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ podAntiAffinity
๋ค๋ฅธ ๋
ธ๋์์: topologyKey: "kubernetes.io/hostname"
, - ๋ค๋ฅธ ๊ฐ์ฉ์ฑ ์์ญ์ ๊ดํ ๊ฒ์ด ์๋๋๋ค. ์์ ํ HA๋ฅผ ๊ตฌํํ๋ ค๋ฉด ์ด ์ฃผ์ ๋ฅผ ๋ ์์ธํ ์ดํด๋ด์ผ ํฉ๋๋ค.
7. PodDisruptionBudget ๋ฌด์
Kubernetes ํด๋ฌ์คํฐ์ ํ๋ก๋์ ๋ก๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด์ธ์. ์ฃผ๊ธฐ์ ์ผ๋ก ๋ ธ๋์ ํด๋ฌ์คํฐ ์์ฒด๋ฅผ ์ ๋ฐ์ดํธ(๋๋ ์๋น์ค ํด์ )ํด์ผ ํฉ๋๋ค. PodDisruptionBudget(PDB)์ ํด๋ฌ์คํฐ ๊ด๋ฆฌ์์ ์ฌ์ฉ์ ๊ฐ์ ์๋น์ค ๋ณด์ฆ ๊ณ์ฝ๊ณผ ๋น์ทํฉ๋๋ค.
PDB๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ธ๋ ๋ถ์กฑ์ผ๋ก ์ธํ ์๋น์ค ์ค๋จ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
spec:
minAvailable: 2
selector:
matchLabels:
app: zookeeper
์ด ์์์๋ ํด๋ฌ์คํฐ ์ฌ์ฉ์๋ก์ ๊ด๋ฆฌ์์๊ฒ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค. "์ ์๊ฒ๋ ์ฌ์ก์ฌ ์๋น์ค๊ฐ ์์ต๋๋ค. ๋ฌด์์ ํ๋ ์ด ์๋น์ค์ ๋ณต์ ๋ณธ์ ํญ์ 2๊ฐ ์ด์ ์ฌ์ฉํ ์ ์๋๋ก ํ๊ณ ์ถ์ต๋๋ค."
์ด์ ๋ํด ๋ ์์ธํ ์ฝ์ ์ ์์ต๋๋ค.
8. ๊ณตํต ํด๋ฌ์คํฐ์ ์ฌ๋ฌ ์ฌ์ฉ์ ๋๋ ํ๊ฒฝ
Kubernetes ๋ค์์คํ์ด์ค (๋ค์์คํ์ด์ค) ๊ฐํ ์ ์ฐ์ ์ ๊ณตํ์ง ๋ง์ญ์์ค.
์ผ๋ฐ์ ์ธ ์คํด๋ ๋นํ๋ก๋์ ๋ก๋๋ฅผ ํ ๋ค์์คํ์ด์ค์ ๋ฐฐํฌํ๊ณ ํ๋ก๋์ ๋ก๋๋ฅผ ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ ๋ฐฐํฌํ๋ฉด ์ด๋ค ์์ผ๋ก๋ ์๋ก ์ํฅ์ ๋ฏธ์น์ง ์์ ๊ฒ์ ๋๋ค... ๊ทธ๋ฌ๋ ๋ฆฌ์์ค ์์ฒญ/์ ํ, ํ ๋น๋ ์ค์ ๋ฐ PriorityClasses ์ค์ ์ ์ฌ์ฉํ์ฌ ํน์ ์์ค์ ๊ฒฉ๋ฆฌ๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ํ๋ ์ธ์ ์ผ๋ถ "๋ฌผ๋ฆฌ์ " ๊ฒฉ๋ฆฌ๋ ์ ์ฌ์ฑ, ํ์ฉ์ฑ, ์ค์ผ(๋๋ ๋ ธ๋ ์ ํ๊ธฐ)์ ์ํด ์ ๊ณต๋์ง๋ง ์ด๋ฌํ ๋ถ๋ฆฌ๋ ์๋นํ ์ด๋ ค์ด ๊ตฌํํ๋ค.
๋์ผํ ํด๋ฌ์คํฐ์์ ๋ ๊ฐ์ง ์ ํ์ ์ํฌ๋ก๋๋ฅผ ๊ฒฐํฉํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ณต์ก์ฑ์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌํ ํ์์ฑ์ด ์๊ณ ํ๋๋ฅผ ๊ฐ์ง ์ฌ์ ๊ฐ ์๋ ๊ฒฝ์ฐ ํด๋ฌ์คํฐ ํ๋ ๋ (์๋ฅผ ๋ค์ด ํผ๋ธ๋ฆญ ํด๋ผ์ฐ๋์์) ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ด ๋ ์ข์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํจ์ฌ ๋ ๋์ ์์ค์ ๋จ์ด ํจ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
9. ์ธ๋ถ ํธ๋ํฝ ์ ์ฑ : ํด๋ฌ์คํฐ
ํด๋ฌ์คํฐ ๋ด๋ถ์ ๋ชจ๋ ํธ๋ํฝ์ด ๊ธฐ๋ณธ ์ ์ฑ
์ด ์ค์ ๋ NodePort์ ๊ฐ์ ์๋น์ค๋ฅผ ํตํด ๋ค์ด์ค๋ ๊ฒ์ ๋งค์ฐ ์์ฃผ ๋ณผ ์ ์์ต๋๋ค. externalTrafficPolicy: Cluster
. ์ฆ, ๋
ธ๋ํฌํธ ํด๋ฌ์คํฐ์ ๋ชจ๋ ๋
ธ๋์ ์ด๋ ค ์์ผ๋ฉฐ, ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ ์๋น์ค(ํฌ๋ ์ธํธ)์ ์ํธ ์์ฉํ ์ ์์ต๋๋ค.
๋์์ ์์์ ์ธ๊ธํ NodePort ์๋น์ค์ ๊ด๋ จ๋ ์ค์ ํฌ๋๋ ์ผ๋ฐ์ ์ผ๋ก ํน์ ๋คํธ์ํฌ์์๋ง ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๋
ธ๋์ ํ์ ์งํฉ. ์ฆ, ํ์ํ ํฌ๋๊ฐ ์๋ ๋
ธ๋์ ์ฐ๊ฒฐํ๋ฉด ๋ค๋ฅธ ๋
ธ๋๋ก ํธ๋ํฝ์ ์ ๋ฌํ๊ณ , ํ ์ถ๊ฐ ๋๊ธฐ ์๊ฐ ์ฆ๊ฐ(๋
ธ๋๊ฐ ์๋ก ๋ค๋ฅธ ๊ฐ์ฉ์ฑ ์์ญ/๋ฐ์ดํฐ ์ผํฐ์ ์์นํ ๊ฒฝ์ฐ ๋๊ธฐ ์๊ฐ์ด ์๋นํ ๊ธธ์ด์ง ์ ์์ผ๋ฉฐ, ๋ํ ์ก์ ํธ๋ํฝ ๋น์ฉ๋ ์ฆ๊ฐํฉ๋๋ค).
๋ฐ๋ฉด ํน์ Kubernetes ์๋น์ค์ ์ ์ฑ
์ธํธ๊ฐ ์๋ ๊ฒฝ์ฐ externalTrafficPolicy: Local
, ๊ทธ๋ฌ๋ฉด NodePort๋ ํ์ํ Pod๊ฐ ์ค์ ๋ก ์คํ ์ค์ธ ๋
ธ๋์์๋ง ์ด๋ฆฝ๋๋ค. ์ํ๋ฅผ ํ์ธํ๋ ์ธ๋ถ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ (๊ฑด๊ฐ๊ฒ์ง) ์๋ํฌ์ธํธ(์ด๋ป๊ฒ ์๋ํฉ๋๊น? AWS ELB), ๊ทธ ํ์ํ ๋
ธ๋์๋ง ํธ๋ํฝ์ ๋ณด๋
๋๋ค., ์ด๋ ์ง์ฐ, ์ปดํจํ
์๊ตฌ ์ฌํญ, ์ก์ ์ฒญ๊ตฌ์์ ์ ์ตํ ์ํฅ์ ๋ฏธ์น ๊ฒ์
๋๋ค(์์์ ์ผ๋ก๋ ๋์ผํจ).
์ด๋ฏธ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๊ณ ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. Traefik ๋๋ nginx-์์ -์ปจํธ๋กค๋ฌ NodePort ์๋ํฌ์ธํธ(๋๋ NodePort๋ฅผ ์ฌ์ฉํ๋ LoadBalancer)๋ก HTTP ์์ ํธ๋ํฝ์ ๋ผ์ฐํ ํ๊ณ ์ด ์ต์ ์ ์ค์ ํ๋ฉด ํด๋น ์์ฒญ์ ๋ํ ๋๊ธฐ ์๊ฐ์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
ะ
10. ํด๋ฌ์คํฐ์ ์ฝ๋งค์ด์ง ๋ง๊ณ ์ปจํธ๋กค ํ๋ ์ธ์ ๋จ์ฉํ์ง ๋ง์ธ์.
์ด์ ์๋ ๊ณ ์ ํ ์ด๋ฆ์ผ๋ก ์๋ฒ๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ๊ด๋ก์์ต๋๋ค.
์ ํ์ ์ธ ์ด์ผ๊ธฐ(์ค์ ์ฌ๊ฑด์ ๊ธฐ๋ฐ์ผ๋ก ํจ): ๋ชจ๋ ๊ฒ์ด ๊ฐ๋ ์ฆ๋ช ์ผ๋ก ์์๋์์ผ๋ฏ๋ก ํด๋ฌ์คํฐ๋ ์๋์ค๋ฌ์ด ์ด๋ฆ์ ๊ฐ๊ฒ ๋์์ต๋๋ค. ํ ์คํธโฆ ๋ช ๋ ์ด ์ง๋ฌ์ง๋ง ์ฌ์ ํ ์์ฐ์ ์ฌ์ฉ๋๋ฉฐ ๋ชจ๋๊ฐ ๋ง์ง๊ธฐ๋ฅผ ๋๋ ค์ํฉ๋๋ค.
ํด๋ฌ์คํฐ๊ฐ ํซ์ผ๋ก ๋ณํ๋ ๊ฒ์ ์ฌ๋ฏธ๊ฐ ์์ผ๋ฏ๋ก ์ฐ์ตํ๋ฉด์ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๊ฑฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฌํด ๋ณต๊ตฌ (์ด๊ฒ์ด ๋์์ด ๋ ๊ฒ์
๋๋ค
๋ฐ๋ฉด์ ๊ทธ๊ฒ์ ์กฐ์ํ๋ ๋ฐ ํน ๋น ์ ธ์๋ ์๋ฉ๋๋ค. ์๊ฐ์ด ์ง๋๋ฉด ์ปจํธ๋กค ๋ ์ด์ด๊ฐ ๋๋ ค์ง ์ ์์ต๋๋ค. ์๋ง๋ ์ด๋ ํ์ ์์ด ์์ฑ๋ ๋ง์ ์์ ๊ฐ์ฒด ๋๋ฌธ์ผ ๊ฒ์ ๋๋ค(๊ธฐ๋ณธ ์ค์ ์ผ๋ก Helm์ ์ฌ์ฉํ ๋ ์ผ๋ฐ์ ์ธ ์ํฉ์ด๋ฏ๋ก configmaps/secrets์ ์ํ๊ฐ ์ ๋ฐ์ดํธ๋์ง ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์์ฒ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์ ์ด ๊ณ์ธต) ๋๋ kube-api ๊ฐ์ฒด์ ์ง์์ ์ธ ํธ์ง(์๋ ํ์ฅ, CI/CD, ๋ชจ๋ํฐ๋ง, ์ด๋ฒคํธ ๋ก๊ทธ, ์ปจํธ๋กค๋ฌ ๋ฑ)์ ํตํด ๊ฐ๋ฅํฉ๋๋ค.
๋ํ ๊ด๋ฆฌํ Kubernetes ๊ณต๊ธ์์์ SLA/SLO ๊ณ์ฝ์ ํ์ธํ๊ณ ๋ณด์ฆ์ ์ฃผ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ํ๋งค์๋ ๋ณด์ฆํ ์ ์์ต๋๋ค. ์ ์ด ๊ณ์ธต ๊ฐ์ฉ์ฑ (๋๋ ๊ทธ ํ์ ๊ตฌ์ฑ ์์)์ด์ง๋ง ๋ณด๋ด๋ ์์ฒญ์ p99 ์ง์ฐ์ ์๋๋๋ค. ์ฆ, ๋ค์๊ณผ ๊ฐ์ด ์
๋ ฅํ ์ ์์ต๋๋ค. kubectl get nodes
, ๊ทธ๋ฆฌ๊ณ 10๋ถ ํ์์ผ ๋ต๋ณ์ ๋ฐ์ ์ ์์ผ๋ฉฐ ์ด๋ ์๋น์ค ๊ณ์ฝ ์กฐ๊ฑด์ ์๋ฐํ์ง ์์ต๋๋ค.
11. ๋ณด๋์ค: ์ต์ ํ๊ทธ ์ฌ์ฉ
๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ด๋ฏธ ๊ณ ์ ์
๋๋ค. ์ต๊ทผ์ ์ฐ๋ฆฌ๋ ์ฐ๋ผ๋ฆฐ ๊ฒฝํ์ ํตํด ๋ฐฐ์ด ๋ง์ ์ฌ๋๋ค์ด ํ๊ทธ ์ฌ์ฉ์ ์ค๋จํ๊ธฐ ๋๋ฌธ์ ์ด ๊ธฐ์ ์ ๋ ์์ฃผ ์ ํ์ต๋๋ค. :latest
๋ฒ์ ๊ณ ์ ์ ์์ํ์ต๋๋ค. ๋ง์ธ!
ECR
๊ฐ์
๋ชจ๋ ๊ฒ์ด ํ๋ฃป๋ฐค ์ฌ์ด์ ์๋ํ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํ์ง ๋ง์ญ์์ค. Kubernetes๋ ๋ง๋ณํต์น์ฝ์ด ์๋๋๋ค. ๋์ ์ฑ
๋ค์ํ ํ์ ์คํจํ ๊ฒฝํ์ ๋ํด ์ ์ ์์ต๋๋ค.
์ด ๊ธฐ์ฌ์ ์ ๊ณต๋ ์ค๋ฅ ๋ชฉ๋ก์ ์ถ๊ฐํ๋ ค๋ ๊ฒฝ์ฐ Twitter(
๋ฒ์ญ๊ฐ์ ์ถ์
๋ธ๋ก๊ทธ์์๋ ์ฝ์ด๋ณด์ธ์.
- ยซ
Kubernetes ํด๋ฌ์คํฐ ์ค๊ณ: ๋ช ๊ฐ๊ฐ ์์ด์ผ ํฉ๋๊น? "; - ยซ
Kubernetes ๋ณด์์ ABC: ์ธ์ฆ, ๊ถํ ๋ถ์ฌ, ๊ฐ์ฌ "; - ยซ
Kubernetes์ ์๋ ํฌ๊ธฐ ์กฐ์ ๋ฐ ๋ฆฌ์์ค ๊ด๋ฆฌ "(๋ฆฌ๋ทฐ ๋ฐ ์์๋ณด๊ณ ); - ยซ
Kubernetes์ ConfigMap: ์์์ผ ํ ๋ฏธ๋ฌํ ์ฐจ์ด ".
์ถ์ฒ : habr.com