XNUMX๊ฐ€์ง€ Kubernetes ์„ฑ๋Šฅ ํŒ

XNUMX๊ฐ€์ง€ Kubernetes ์„ฑ๋Šฅ ํŒ

๋ชจ๋‘ ์•ˆ๋…•! ์ œ ์ด๋ฆ„์€ Oleg Sidorenkov์ด๊ณ  DomClick์—์„œ ์ธํ”„๋ผ ํŒ€ ๋ฆฌ๋”๋กœ ์ผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํŒ๋งค์šฉ ํ๋ธŒ๋ฅผ XNUMX๋…„ ์ด์ƒ ์‚ฌ์šฉํ•ด ์™”์œผ๋ฉฐ ์ด ๊ธฐ๊ฐ„ ๋™์•ˆ ๋‹ค์–‘ํ•œ ํฅ๋ฏธ๋กœ์šด ์ˆœ๊ฐ„์„ ๊ฒฝํ—˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์ €๋Š” ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฐ”๋‹๋ผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ํ›จ์”ฌ ๋” ๋งŽ์€ ์„ฑ๋Šฅ์„ ๋Œ์–ด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ค€๋น„ ๊พธ์ค€ํ•œ ์ด๋™!

์—ฌ๋Ÿฌ๋ถ„ ๋ชจ๋‘ Kubernetes๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์„ ์œ„ํ•œ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์˜คํ”ˆ ์†Œ์Šค ์‹œ์Šคํ…œ์ด๋ผ๋Š” ๊ฒƒ์„ ์ž˜ ์•Œ๊ณ  ๊ณ„์‹ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜๋Š” ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ๋งˆ์ˆ ์„ ๋ถ€๋ฆฌ๋Š” 5๊ฐœ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ. ๋˜ํ•œ ์ด๊ฒƒ์€ ๋‹ค์–‘ํ•œ ์ž‘์—…์— ๋Œ€ํ•œ ์ตœ๋Œ€ ์‚ฌ์šฉ์ž ์ •์˜๋ฅผ ์œ„ํ•ด ๋ ˆ๊ณ  ์ƒ์„ฑ์ž์ฒ˜๋Ÿผ ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ๋Š” ์ƒ๋‹นํžˆ ์œ ์—ฐํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์žฅ์ž‘์„ ํ™”์‹ค์— ๋„ฃ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์„œ๋ฒ„๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์— ๋˜์ง€๊ณ  ์Šฌํ””์„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ™˜๊ฒฝ์„ ์ƒ๊ฐํ•œ๋‹ค๋ฉด "์–ด๋–ป๊ฒŒ ์Šคํ† ๋ธŒ์— ๋ถˆ์„ ํ”ผ์šฐ๊ณ  ์ˆฒ์„ ํ›„ํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? "๋ผ๊ณ  ์ƒ๊ฐํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ธํ”„๋ผ๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ๋น„์šฉ์„ ์ ˆ๊ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

1. ํŒ€ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆฌ์†Œ์Šค ์ถ”์ 

XNUMX๊ฐ€์ง€ Kubernetes ์„ฑ๋Šฅ ํŒ

๊ฐ€์žฅ ์ง„๋ถ€ํ•˜์ง€๋งŒ ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ์š”์ฒญ/์ œํ•œ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ณ„๋กœ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐœ๋ฐœ ํŒ€๋ณ„๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์„œ ์‹œ๊ฐ„, ๋ฉ”๋ชจ๋ฆฌ, ์ž„์‹œ ์Šคํ† ๋ฆฌ์ง€ ์†Œ๋น„์— ๋Œ€ํ•œ ๊ฐ’์„ ๋ฐฐํฌํ•˜๊ธฐ ์ „์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.

resources:
   requests:
     memory: 2Gi
     cpu: 250m
   limits:
     memory: 4Gi
     cpu: 500m

๊ฒฝํ—˜์ƒ ์šฐ๋ฆฌ๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•œ๋„์—์„œ ์š”์ฒญ์„ ๋‘ ๋ฐฐ ์ด์ƒ ๋ถ€ํ’€๋ฆด ๊ฐ€์น˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ํฌ๊ธฐ๋Š” ์š”์ฒญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณ„์‚ฐ๋˜๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฆฌ์†Œ์Šค ์ฐจ์ด(์˜ˆ: 5-10๋ฐฐ)๋กœ ์„ค์ •ํ•œ ๊ฒฝ์šฐ ๋…ธ๋“œ๊ฐ€ ํฌ๋“œ๋กœ ์ฑ„์›Œ์ง€๊ณ  ๊ฐ‘์ž๊ธฐ ๋กœ๋“œ๊ฐ€ ์ˆ˜์‹ ๋  ๋•Œ ๋…ธ๋“œ์— ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ• ์ง€ ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. ์ข‹์€ ๊ฑด ์—†์–ด. ์ตœ์†Œํ•œ ์Šค๋กœํ‹€๋งํ•˜๊ณ  ์ตœ๋Œ€๋กœ ์ž‘์—…์ž์—๊ฒŒ ์ž‘๋ณ„ ์ธ์‚ฌ๋ฅผ ํ•˜๊ณ  ํŒŸ(Pod)์ด ์ด๋™ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ํ›„ ๋‚˜๋จธ์ง€ ๋…ธ๋“œ์—์„œ ์ฃผ๊ธฐ์  ๋กœ๋“œ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ ๋„์›€์„ ๋ฐ›์•„ limitranges ์ตœ์†Œ, ์ตœ๋Œ€ ๋ฐ ๊ธฐ๋ณธ๊ฐ’๊ณผ ๊ฐ™์ด ์‹œ์ž‘ํ•  ๋•Œ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฆฌ์†Œ์Šค ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โžœ  ~ kubectl describe limitranges --namespace ops
Name:       limit-range
Namespace:  ops
Type        Resource           Min   Max   Default Request  Default Limit  Max Limit/Request Ratio
----        --------           ---   ---   ---------------  -------------  -----------------------
Container   cpu                50m   10    100m             100m           2
Container   ephemeral-storage  12Mi  8Gi   128Mi            4Gi            -
Container   memory             64Mi  40Gi  128Mi            128Mi          2

ํ•˜๋‚˜์˜ ๋ช…๋ น์ด ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋„๋ก ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ์ œํ•œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โžœ  ~ kubectl describe resourcequotas --namespace ops
Name:                   resource-quota
Namespace:              ops
Resource                Used          Hard
--------                ----          ----
limits.cpu              77250m        80
limits.memory           124814367488  150Gi
pods                    31            45
requests.cpu            53850m        80
requests.memory         75613234944   150Gi
services                26            50
services.loadbalancers  0             0
services.nodeports      0             0

์„ค๋ช…์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด resourcequotas, ops ๋ช…๋ น์ด ๋‹ค๋ฅธ 10 cpu๋ฅผ ์†Œ๋น„ํ•˜๋Š” ํŒŸ(Pod)์„ ๋ฐฐ์น˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์ด๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ณ  ์˜ค๋ฅ˜๋ฅผ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Error creating: pods "nginx-proxy-9967d8d78-nh4fs" is forbidden: exceeded quota: resource-quota, requested: limits.cpu=5,requests.cpu=5, used: limits.cpu=77250m,requests.cpu=53850m, limited: limits.cpu=10,requests.cpu=10

์œ ์‚ฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด, ๋ช…๋ น ๋ฆฌ์†Œ์Šค์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ปค๋ฐ‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์ตœ์ƒ์˜ ํŒŒ์ผ ์ €์žฅ์†Œ ์„ ํƒ

XNUMX๊ฐ€์ง€ Kubernetes ์„ฑ๋Šฅ ํŒ

์—ฌ๊ธฐ์„œ๋Š” Kubernetes ์ž‘์—…์ž ๋…ธ๋“œ์˜ ์˜๊ตฌ ๋ณผ๋ฅจ ๋ฐ ๋””์Šคํฌ ํ•˜์œ„ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์ฃผ์ œ๋ฅผ ๋‹ค๋ฃจ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ํ”„๋กœ๋•์…˜์—์„œ HDD์˜ "Cube"๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋•Œ๋กœ๋Š” ์ผ๋ฐ˜ SSD๋กœ๋„ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋กœ๊ทธ๊ฐ€ I/O ์ž‘์—…์œผ๋กœ ๋””์Šคํฌ๋ฅผ ์ฃฝ์ด๋Š” ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์—๋Š” ํ•ด๊ฒฐ์ฑ…์ด ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ๊ณ ์„ฑ๋Šฅ SSD๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ NVMe๋กœ ์ „ํ™˜ํ•˜์‹ญ์‹œ์˜ค(์ž์ฒด ํ•˜๋“œ์›จ์–ด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ).

  • ๋กœ๊น… ์ˆ˜์ค€์„ ๋‚ฎ์ถฅ๋‹ˆ๋‹ค.

  • ๋””์Šคํฌ๋ฅผ ๊ฐ•๊ฐ„ํ•˜๋Š” ํฌ๋“œ์˜ "์Šค๋งˆํŠธ" ๋ฐธ๋Ÿฐ์‹ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(podAntiAffinity).

์œ„์˜ ์Šคํฌ๋ฆฐ์ƒท์€ access_logs๊ฐ€ ํ™œ์„ฑํ™”๋œ ๊ฒฝ์šฐ(~12k ๋กœ๊ทธ/์ดˆ) ๋””์Šคํฌ๊ฐ€ ์žˆ๋Š” nginx-ingress-controller์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๋Ÿฌํ•œ ์ƒํƒœ๋Š” ์ด ๋…ธ๋“œ์˜ ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ ์ €ํ•˜๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PV์— ๊ด€ํ•ด์„œ๋Š” ์•„์‰ฝ๊ฒŒ๋„ ๋ชจ๋“  ๊ฒƒ์„ ์‹œ๋„ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ข… ์˜๊ตฌ ๋ณผ๋ฅจ. ์ž์‹ ์—๊ฒŒ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์—ญ์‚ฌ์ ์œผ๋กœ ์šฐ๋ฆฌ๋‚˜๋ผ์—์„œ๋Š” ์„œ๋น„์Šค์˜ ์ผ๋ถ€์— RWX ๋ณผ๋ฅจ์ด ํ•„์š”ํ•œ ์ผ์ด ์žˆ์—ˆ์œผ๋ฉฐ ์˜ค๋ž˜ ์ „์— ์ด ์ž‘์—…์„ ์œ„ํ•ด NFS ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‹ธ๊ณ  ... ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์šฐ๋ฆฌ๋Š” ๊ทธ์™€ ํ•จ๊ป˜ ๋˜ฅ์„ ๋จน์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฑด๊ฐ•ํ•˜์ง€๋งŒ ๊ทธ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ๊ณ  ๊ทธ์˜ ๋จธ๋ฆฌ๋Š” ๋” ์ด์ƒ ์•„ํ”„์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๋Šฅํ•˜๋ฉด S3 ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€๋กœ ์ „ํ™˜ํ•˜์‹ญ์‹œ์˜ค.

3. ์ตœ์ ํ™”๋œ ์ด๋ฏธ์ง€ ๊ตฌ์ถ•

XNUMX๊ฐ€์ง€ Kubernetes ์„ฑ๋Šฅ ํŒ

Kubernetes๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ ๋” ๋น ๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ค๊ณ  ๋” ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ปจํ…Œ์ด๋„ˆ ์ตœ์ ํ™” ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค. 

์ตœ์ ํ™”๋Š” ์ด๋ฏธ์ง€๊ฐ€ ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • ํ•˜๋‚˜์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๋งŒ ํฌํ•จํ•˜๊ฑฐ๋‚˜ ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ๋งŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์ž‘์€ ํฌ๊ธฐ, ํฐ ์ด๋ฏธ์ง€๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ๋” ์ž˜ ์ „์†ก๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  • ๋‹ค์šดํƒ€์ž„ ๋ฐœ์ƒ ์‹œ Kubernetes๊ฐ€ ์กฐ์น˜๋ฅผ ์ทจํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ ๋ฐ ์ค€๋น„ ์—”๋“œํฌ์ธํŠธ ๋ณด์œ 

  • ๊ตฌ์„ฑ ์˜ค๋ฅ˜์— ๋” ๊ฐ•ํ•œ ์ปจํ…Œ์ด๋„ˆ ์นœํ™”์ ์ธ ์šด์˜ ์ฒด์ œ(์˜ˆ: Alpine ๋˜๋Š” CoreOS)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ํ•จ๊ป˜ ์ œ๊ณต๋˜๋Š” ์†Œ์Šค๊ฐ€ ์•„๋‹Œ ์ปดํŒŒ์ผ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋งŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค๋‹จ๊ณ„ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰์„์—์„œ ์ด๋ฏธ์ง€๋ฅผ ํ™•์ธํ•˜๊ณ  ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๋„๊ตฌ์™€ ์„œ๋น„์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ์ตœ์‹  ์ƒํƒœ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‹ค์Œ์„ ์–ป์Šต๋‹ˆ๋‹ค.

  1. ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜ ๊ฐ์†Œ.

  2. ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ ์‹œ๊ฐ„์ด ๊ฐ์†Œํ–ˆ์Šต๋‹ˆ๋‹ค.

  3. ์ „์ฒด Docker ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์˜ ๋” ์ž‘์€ ํฌ๊ธฐ.

4. DNS ์บ์‹œ ์‚ฌ์šฉ

XNUMX๊ฐ€์ง€ Kubernetes ์„ฑ๋Šฅ ํŒ

๋†’์€ ๋ถ€ํ•˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์˜ DNS ์‹œ์Šคํ…œ์„ ์กฐ์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์‚ถ์ด ๋งค์šฐ ํ˜•ํŽธ ์—†์Šต๋‹ˆ๋‹ค. ์˜›๋‚  ์˜›์ ์— Kubernetes ๊ฐœ๋ฐœ์ž๋Š” kube-dns ์†”๋ฃจ์…˜์„ ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋‚˜๋ผ์—์„œ๋„ ๊ตฌํ˜„๋˜์—ˆ์ง€๋งŒ์ด ์†Œํ”„ํŠธ์›จ์–ด๋Š” ํŠน๋ณ„ํžˆ ์กฐ์ •๋˜์ง€ ์•Š์•˜๊ณ  ํ•„์š”ํ•œ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€ ๋ชปํ–ˆ์ง€๋งŒ ์ž‘์—…์€ ๊ฐ„๋‹จ ํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์šฐ๋ฆฌ๊ฐ€ ์ „ํ™˜ํ•˜๊ณ  ์Šฌํ””์„ ์•Œ์ง€ ๋ชปํ•˜๋Š” coredns๊ฐ€ ๋‚˜ํƒ€ ๋‚ฌ์œผ๋ฉฐ ๋‚˜์ค‘์— K8s์˜ ๊ธฐ๋ณธ DNS ์„œ๋น„์Šค๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋Š ์ˆœ๊ฐ„ DNS ์‹œ์Šคํ…œ๊นŒ์ง€ 40๋งŒ rps๊นŒ์ง€ ์„ฑ์žฅํ–ˆ๋Š”๋ฐ ์ด ์†”๋ฃจ์…˜๋„ ๋งŒ๋งŒ์น˜ ์•Š์•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์šด์ข‹๊ฒŒ Nodelocaldns๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋˜์—ˆ๊ณ , ์ผ๋ช… ๋…ธ๋“œ ๋กœ์ปฌ ์บ์‹œ, ์ผ๋ช… ๋…ธ๋“œ ๋กœ์ปฌ DNS ์บ์‹œ.

์™œ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? Linux ์ปค๋„์—๋Š” UDP๋ฅผ ํ†ตํ•œ conntrack NAT๋ฅผ ํ†ตํ•œ ๋‹ค์ค‘ ์•ก์„ธ์Šค๊ฐ€ conntrack ํ…Œ์ด๋ธ”์— ์“ฐ๊ธฐ ์œ„ํ•œ ๊ฒฝ์Ÿ ์กฐ๊ฑด์œผ๋กœ ์ด์–ด์ง€๊ณ  NAT๋ฅผ ํ†ตํ•œ ํŠธ๋ž˜ํ”ฝ์˜ ์ผ๋ถ€๊ฐ€ ์†์‹ค๋˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์„œ๋น„์Šค๋ฅผ ํ†ตํ•œ ๊ฐ ์ด๋™์€ NAT์ž„). Nodelocaldns๋Š” NAT๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์—…์ŠคํŠธ๋ฆผ DNS์— ๋Œ€ํ•œ TCP ์—ฐ๊ฒฐ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๊ณ  ์—…์ŠคํŠธ๋ฆผ DNS ์ฟผ๋ฆฌ๋ฅผ ๋กœ์ปฌ๋กœ ์บ์‹ฑ(์งง์€ 5์ดˆ ๋„ค๊ฑฐํ‹ฐ๋ธŒ ์บ์‹œ ํฌํ•จ)ํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

5. ํฌ๋“œ๋ฅผ ์ˆ˜ํ‰ ๋ฐ ์ˆ˜์ง์œผ๋กœ ์ž๋™ ํ™•์žฅ

XNUMX๊ฐ€์ง€ Kubernetes ์„ฑ๋Šฅ ํŒ

๋ชจ๋“  ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๊ฐ€ XNUMX~XNUMX๋ฐฐ์˜ ๋ถ€ํ•˜ ์ฆ๊ฐ€์— ๋Œ€๋น„ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ž์‹  ์žˆ๊ฒŒ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฆฌ์†Œ์Šค๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์›Œํฌ๋กœ๋“œ๋ฅผ ์ดˆ๊ณผํ•˜์—ฌ ๋ช‡ ๊ฐœ์˜ ํฌ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์ค‘๋ณต๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์—ฐ์†์ ์œผ๋กœ ์œ ์ง€ํ•˜๋ฉด ์„œ๋น„์Šค์— ๋Œ€ํ•œ ํŠธ๋ž˜ํ”ฝ์ด ๊ฐ‘์ž๊ธฐ ์ฆ๊ฐ€ํ•˜์—ฌ ๋‹ค์šดํƒ€์ž„์ด ๋ฐœ์ƒํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ™ฉ๊ธˆ ํ‰๊ท ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„œ๋น„์Šค์™€ ๊ฐ™์€ ๊ณฑ์…ˆ์˜ ์ฃผ๋ฌธ์„ ๋‹ฌ์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ˆ˜ํ‰ํ˜• ํฌ๋“œ ์ž๋™ ํฌ๊ธฐ ์กฐ์ •๊ธฐ ะธ ์ˆ˜์งํ˜• ํฌ๋“œ ์ž๋™ ํ™•์žฅ ์ฒ˜๋ฆฌ.

VPA ์‹ค์ œ ์‚ฌ์šฉ๋Ÿ‰์— ๋”ฐ๋ผ ํŒŸ(Pod)์— ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ์š”์ฒญ/์ œํ•œ์„ ์ž๋™์œผ๋กœ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ค ์ด์œ ๋กœ ์ˆ˜ํ‰์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์—†๋Š” Pod๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ(์™„์ „ํžˆ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์Œ) VPA๋ฅผ ์‹ ๋ขฐํ•˜์—ฌ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ธฐ๋Šฅ์€ ๋ฉ”ํŠธ๋ฆญ ์„œ๋ฒ„์˜ ๊ณผ๊ฑฐ ๋ฐ ํ˜„์žฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ถ”์ฒœ ์‹œ์Šคํ…œ์ด๋ฏ€๋กœ ์š”์ฒญ/์ œํ•œ์„ ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๊ถŒ์žฅ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  ์„ค์ •์„ ์ตœ์ ํ™”ํ•˜์—ฌ CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์—์„œ.

XNUMX๊ฐ€์ง€ Kubernetes ์„ฑ๋Šฅ ํŒhttps://levelup.gitconnected.com/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231์—์„œ ๊ฐ€์ ธ์˜จ ์ด๋ฏธ์ง€

Kubernetes์˜ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ํ•ญ์ƒ ์š”์ฒญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฐ’์„ ์ž…๋ ฅํ•˜๋“  ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ํ•ฉํ•œ ๋…ธ๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ œํ•œ ๊ฐ’์€ ํŒŸ(Pod)์„ ์ œํ•œํ•˜๊ฑฐ๋‚˜ ์ข…๋ฃŒํ•  ์‹œ๊ธฐ๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด kublet์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์ค‘์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ์š”์ฒญ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— VPA๊ฐ€ ์ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ˆ˜์ง์œผ๋กœ ํ™•์žฅํ•  ๋•Œ๋งˆ๋‹ค ์–ด๋–ค ์š”์ฒญ์ด ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ•œ๊ณ„๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ๋น„๋ก€์ ์œผ๋กœ ์กฐ์ •๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ฐ˜์ ์ธ ํฌ๋“œ ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

resources:
   requests:
     memory: 250Mi
     cpu: 200m
   limits:
     memory: 500Mi
     cpu: 350m

์ถ”์ฒœ ์—”์ง„์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ œ๋Œ€๋กœ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด 300m CPU์™€ 500Mi๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์„ค์ •์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

resources:
   requests:
     memory: 500Mi
     cpu: 300m
   limits:
     memory: 1000Mi
     cpu: 525m

์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ์ด๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ์š”์ฒญ/์ œํ•œ ๋น„์œจ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋น„๋ก€ ์กฐ์ •์ž…๋‹ˆ๋‹ค.

  • CPU: 200m โ†’ 300m: ๋น„์œจ 1:1.75;

  • ๋ฉ”๋ชจ๋ฆฌ: 250Mi โ†’ 500Mi: 1:2 ๋น„์œจ.

...์— ๊ด€ํ•˜์—ฌ ๊ณ ์ „๋ ฅ ์ฆํญ๊ธฐ, ์ž‘๋™ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋” ํˆฌ๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์„œ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ฐ™์€ ๋ฉ”ํŠธ๋ฆญ์— ๋Œ€ํ•œ ์ž„๊ณ„๊ฐ’์ด ์„ค์ •๋˜๋ฉฐ, ๋ชจ๋“  ๋ณต์ œ๋ณธ์˜ ํ‰๊ท ์ด ์ž„๊ณ„๊ฐ’์„ ์ดˆ๊ณผํ•˜๋ฉด ๊ฐ’์ด ์ž„๊ณ„๊ฐ’ ์•„๋ž˜๋กœ ๋–จ์–ด์ง€๊ฑฐ๋‚˜ ์ตœ๋Œ€ ๋ณต์ œ๋ณธ ์ˆ˜์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด +1 pod๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค.

XNUMX๊ฐ€์ง€ Kubernetes ์„ฑ๋Šฅ ํŒhttps://levelup.gitconnected.com/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231์—์„œ ๊ฐ€์ ธ์˜จ ์ด๋ฏธ์ง€

CPU ๋ฐ ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ๋ฉ”ํŠธ๋ฆญ ์™ธ์—๋„ ์‚ฌ์šฉ์ž ์ง€์ • Prometheus ๋ฉ”ํŠธ๋ฆญ์— ๋Œ€ํ•œ ์ž„๊ณ„๊ฐ’์„ ์„ค์ •ํ•˜๊ณ  ์ด๊ฒƒ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ™•์žฅํ•  ์‹œ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฐ€์žฅ ์ •ํ™•ํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒฝ์šฐ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ง€์ •๋œ ๋ฉ”ํŠธ๋ฆญ ์ž„๊ณ„๊ฐ’ ์•„๋ž˜๋กœ ์•ˆ์ •ํ™”๋˜๋ฉด HPA๋Š” ์ตœ์†Œ ๋ณต์ œ๋ณธ ์ˆ˜๋กœ ๋˜๋Š” ๋กœ๋“œ๊ฐ€ ์ง€์ •๋œ ์ž„๊ณ„๊ฐ’์„ ์ถฉ์กฑํ•  ๋•Œ๊นŒ์ง€ ํฌ๋“œ๋ฅผ ์ถ•์†Œํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

6. Node Affinity์™€ Pod Affinity๋ฅผ ์žŠ์ง€ ๋งˆ์„ธ์š”

XNUMX๊ฐ€์ง€ Kubernetes ์„ฑ๋Šฅ ํŒ

๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ ๋™์ผํ•œ ํ•˜๋“œ์›จ์–ด์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ ๋ชจ๋“  ํฌ๋“œ๊ฐ€ ์ปดํ“จํŒ… ์ง‘์•ฝ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. Kubernetes๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ ๋ฐ ํฌ๋“œ์˜ ์ „๋ฌธํ™”๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ ์„ ํ˜ธ๋„ ะธ ํฌ๋“œ ์„ ํ˜ธ๋„.

์ปดํ“จํŒ… ์ง‘์•ฝ์ ์ธ ์ž‘์—…์— ์ ํ•ฉํ•œ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ตœ๋Œ€ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ ์ ˆํ•œ ๋…ธ๋“œ์— ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. nodeSelector ๋…ธ๋“œ ๋ ˆ์ด๋ธ”.

๋‘ ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. CPUType=HIGHFREQ ๋งŽ์€ ์ˆ˜์˜ ๋น ๋ฅธ ์ฝ”์–ด, ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” MemoryType=HIGHMEMORY ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ์™€ ๋” ๋น ๋ฅธ ์„ฑ๋Šฅ. ๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•์€ ํฌ๋“œ ๋ฐฐํฌ๋ฅผ ๋…ธ๋“œ์— ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. HIGHFREQ์„น์…˜์— ์ถ”๊ฐ€ํ•˜์—ฌ spec ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ ํƒ๊ธฐ:

โ€ฆ
nodeSelector:
	CPUType: HIGHFREQ

์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋” ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ณ  ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. nodeAffinity ํ˜„์žฅ์—์„œ affinity ์„น์…˜ spec. ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • requiredDuringSchedulingIgnoredDuringExecution: ํ•˜๋“œ ์„ค์ •(์Šค์ผ€์ค„๋Ÿฌ๋Š” ํŠน์ • ๋…ธ๋“œ์—๋งŒ ํฌ๋“œ๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค(๋‹ค๋ฅธ ๋…ธ๋“œ์—๋Š” ์—†์Œ)).

  • preferredDuringSchedulingIgnoredDuringExecution: ์†Œํ”„ํŠธ ์„ค์ •(์Šค์ผ€์ค„๋Ÿฌ๋Š” ํŠน์ • ๋…ธ๋“œ์— ๋ฐฐํฌ๋ฅผ ์‹œ๋„ํ•˜๊ณ  ์‹คํŒจํ•  ๊ฒฝ์šฐ ๋‹ค์Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋…ธ๋“œ์— ๋ฐฐํฌ๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค).

์˜ˆ๋ฅผ ๋“ค์–ด ๋…ธ๋“œ ๋ ˆ์ด๋ธ”์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ํŠน์ • ๊ตฌ๋ฌธ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. In, NotIn, Exists, DoesNotExist, Gt ๋˜๋Š” Lt. ๊ทธ๋Ÿฌ๋‚˜ ๊ธด ๋ ˆ์ด๋ธ” ๋ชฉ๋ก์˜ ๋ณต์žกํ•œ ๋ฐฉ๋ฒ•์€ ์ค‘์š”ํ•œ ์ƒํ™ฉ์—์„œ ์˜์‚ฌ ๊ฒฐ์ • ์†๋„๋ฅผ ๋Šฆ์ถœ ์ˆ˜ ์žˆ์Œ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค. ์ฆ‰, ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Kubernetes๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ํฌ๋“œ์˜ ๋ฐ”์ธ๋”ฉ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋™์ผํ•œ ๊ฐ€์šฉ ์˜์—ญ(ํด๋ผ์šฐ๋“œ ๊ด€๋ จ) ๋˜๋Š” ๋…ธ๋“œ์—์„œ ํŠน์ • ํฌ๋“œ๊ฐ€ ๋‹ค๋ฅธ ํฌ๋“œ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ะ’ podAffinity ์—ฌ๋ฐฑ affinity ์„น์…˜ spec ์˜ ๊ฒฝ์šฐ์™€ ๋™์ผํ•œ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution ะธ preferredDuringSchedulingIgnoredDuringExecution. ์œ ์ผํ•œ ์ฐจ์ด์ ์€ matchExpressions ํ•ด๋‹น ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ํฌ๋“œ๋ฅผ ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ๋…ธ๋“œ์— ํฌ๋“œ๋ฅผ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.

Kubernetes๋Š” ํ•„๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. podAntiAffinity๋ฐ˜๋Œ€๋กœ ํŠน์ • ํฌ๋“œ๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ์— ํฌ๋“œ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ‘œํ˜„์‹ ์ •๋ณด nodeAffinity ๋™์ผํ•œ ์กฐ์–ธ์ด ์ œ๊ณต๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทœ์น™์„ ๋‹จ์ˆœํ•˜๊ณ  ๋…ผ๋ฆฌ์ ์œผ๋กœ ์œ ์ง€ํ•˜๊ณ  ๋ณต์žกํ•œ ๊ทœ์น™ ์„ธํŠธ๋กœ ํฌ๋“œ ์‚ฌ์–‘์„ ๊ณผ๋ถ€ํ•˜ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ํด๋Ÿฌ์Šคํ„ฐ์˜ ์กฐ๊ฑด๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ทœ์น™์„ ์ƒ์„ฑํ•˜์—ฌ ์Šค์ผ€์ค„๋Ÿฌ์— ์ถ”๊ฐ€ ๋ถ€ํ•˜๋ฅผ ๊ฐ€ํ•˜๊ณ  ์ „๋ฐ˜์ ์ธ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๋Š” ๊ฒƒ์€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

7. ์˜ค์—ผ ๋ฐ ํ—ˆ์šฉ

์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๋…ธ๋“œ์™€ ์ˆ˜์ฒœ ๊ฐœ์˜ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๊ฐ€ ์žˆ๋Š” ๋Œ€๊ทœ๋ชจ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ํŠน์ • ํฌ๋“œ๊ฐ€ ํŠน์ • ๋…ธ๋“œ์—์„œ ํ˜ธ์ŠคํŒ…๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์˜ค์—ผ์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜(๊ธˆ์ง€ ๊ทœ์น™)์ด ์ด์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํŠน์ • ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ํŠน์ • ๋…ธ๋“œ๊ฐ€ ํฌ๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ๋…ธ๋“œ์— ์˜ค์—ผ์„ ์ ์šฉํ•˜๋ ค๋ฉด ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. taint kubectl์—์„œ. ํ‚ค์™€ ๊ฐ’์„ ์ง€์ •ํ•œ ๋‹ค์Œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์˜ค์—ผ NoSchedule ๋˜๋Š” NoExecute:

$ kubectl taint nodes node10 node-role.kubernetes.io/ingress=true:NoSchedule

์˜ค์—ผ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ํšจ๊ณผ๋ฅผ ์ง€์›ํ•œ๋‹ค๋Š” ์ ๋„ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. NoSchedule, NoExecute ะธ PreferNoSchedule.

  • NoSchedule ํฌ๋“œ ์‚ฌ์–‘์— ํ•ด๋‹น ํ•ญ๋ชฉ์ด ์žˆ์„ ๋•Œ๊นŒ์ง€ tolerations, ๋…ธ๋“œ์— ๋ฐฐํฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์ด ์˜ˆ์—์„œ๋Š” node10).

  • PreferNoSchedule - ๋‹จ์ˆœํ™”๋œ ๋ฒ„์ „ NoSchedule. ์ด ๊ฒฝ์šฐ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†๋Š” ํฌ๋“œ๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. tolerations ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ํ•˜๋“œ ์ œํ•œ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฆฌ์†Œ์Šค๊ฐ€ ์—†์œผ๋ฉด ํฌ๋“œ๊ฐ€ ์ด ๋…ธ๋“œ์— ๋ฐฐํฌ๋˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • NoExecute - ์ด ํšจ๊ณผ๋Š” ์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ์ด ์—†๋Š” ํฌ๋“œ์˜ ์ฆ‰๊ฐ์ ์ธ ๋Œ€ํ”ผ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. tolerations.

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ์ด ๋™์ž‘์€ ํ—ˆ์šฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” "๊ธˆ์ง€๋œ" ๋…ธ๋“œ๊ฐ€ ์žˆ๊ณ  ์ธํ”„๋ผ ์„œ๋น„์Šค๋งŒ ๋ฐฐ์น˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์„ํ•˜๋Š” ๋ฐฉ๋ฒ•? ์ ์ ˆํ•œ ํ—ˆ์šฉ ์˜ค์ฐจ๊ฐ€ ์žˆ๋Š” ํฌ๋“œ๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํฌ๋“œ ์‚ฌ์–‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

spec:
   tolerations:
     - key: "node-role.kubernetes.io/ingress"
        operator: "Equal"
        value: "true"
        effect: "NoSchedule"

์ด๊ฒƒ์€ ๋‹ค์Œ์— ์žฌ๋ฐฐํฌํ•˜๋Š” ๋™์•ˆ ํฌ๋“œ๊ฐ€ ์ •ํ™•ํžˆ ์ด ๋…ธ๋“œ์— ๋„๋‹ฌํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋…ธ๋“œ ์„ ํ˜ธ๋„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์•„๋‹ˆ๋ฉฐ nodeSelector. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๋Ÿฌ ๊ธฐ๋Šฅ์„ ๊ฒฐํ•ฉํ•˜๋ฉด ๋งค์šฐ ์œ ์—ฐํ•œ ์Šค์ผ€์ค„๋Ÿฌ ์„ค์ •์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8. Pod ๋ฐฐํฌ ์šฐ์„  ์ˆœ์œ„ ์„ค์ •

ํฌ๋“œ-๋…ธ๋“œ ๋ฐ”์ธ๋”ฉ์„ ๊ตฌ์„ฑํ–ˆ๋‹ค๊ณ  ํ•ด์„œ ๋ชจ๋“  ํฌ๋“œ๊ฐ€ ๋™์ผํ•œ ์šฐ์„  ์ˆœ์œ„๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ถ€ ํฌ๋“œ๋ฅผ ๋‹ค๋ฅธ ํฌ๋“œ๋ณด๋‹ค ๋จผ์ € ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Kubernetes๋Š” Pod ์šฐ์„  ์ˆœ์œ„ ๋ฐ ์„ ์ ์„ ์„ค์ •ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์„ค์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. PriorityClass ๋ฐ ํ•„๋“œ ์„ค๋ช… priorityClassName ํฌ๋“œ ์‚ฌ์–‘์—์„œ. ์˜ˆ๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: high-priority
value: 99999
globalDefault: false
description: "This priority class should be used for very important pods only"

์šฐ๋ฆฌ๋Š” ์ƒ์„ฑ PriorityClass, ์ด๋ฆ„, ์„ค๋ช… ๋ฐ ๊ฐ’์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋” ๋†’์ด value, ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์„์ˆ˜๋ก. ๊ฐ’์€ 32๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ 1๋น„ํŠธ ์ •์ˆ˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ๋†’์€ ๊ฐ’์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์„ ์ ํ•  ์ˆ˜ ์—†๋Š” ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌ ์‹œ์Šคํ…œ ํฌ๋“œ์šฉ์œผ๋กœ ์˜ˆ์•ฝ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฑฐ๋Š” ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ ํฌ๋“œ๊ฐ€ ๋Œ๋ฆด ๊ณณ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ฐœ์ƒํ•˜๋ฉฐ ํŠน์ • ๋…ธ๋“œ์˜ ์ผ๋ถ€ ํฌ๋“œ๊ฐ€ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋„ˆ๋ฌด ๋”ฑ๋”ฑํ•œ ๊ฒฝ์šฐ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. preemptionPolicy: Never๊ทธ๋Ÿฌ๋ฉด ์„ ์ ์ด ์—†์„ ๊ฒƒ์ด๋ฉฐ ํฌ๋“œ๋Š” ๋Œ€๊ธฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ๊ฐ€ ๋˜๊ณ  ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

๋‹ค์Œ์œผ๋กœ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๋Š” ํฌ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. priorityClassName:

apiVersion: v1
kind: Pod
metadata:
  name: static-web
  labels:
    role: myrole
 spec:
  containers:
    - name: web
      image: nginx
      ports:
        - name: web
          containerPort: 80
          protocol: TCP
  priorityClassName: high-priority
          

์›ํ•˜๋Š” ๋งŒํผ ์šฐ์„ ์ˆœ์œ„ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๊ฒƒ์— ํœฉ์“ธ๋ฆฌ์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค(์˜ˆ: ๋‚ฎ์Œ, ์ค‘๊ฐ„ ๋ฐ ๋†’์Œ ์šฐ์„ ์ˆœ์œ„๋กœ ์ œํ•œ).

๋”ฐ๋ผ์„œ ํ•„์š”ํ•œ ๊ฒฝ์šฐ nginx-ingress-controller, coredns ๋“ฑ๊ณผ ๊ฐ™์€ ์ค‘์š”ํ•œ ์„œ๋น„์Šค ๋ฐฐํฌ์˜ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

9. ETCD ํด๋Ÿฌ์Šคํ„ฐ ์ตœ์ ํ™”

XNUMX๊ฐ€์ง€ Kubernetes ์„ฑ๋Šฅ ํŒ

ETCD๋Š” ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋‘๋‡Œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "Cube"์˜ ์ž‘์—… ์†๋„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋‹ฌ๋ ค ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ž‘์—…์„ ๋†’์€ ์ˆ˜์ค€์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋‹นํžˆ ํ‘œ์ค€์ ์ด๋ฉฐ ๋™์‹œ์— ์ข‹์€ ์†”๋ฃจ์…˜์€ kube-apiserver์— ๋Œ€ํ•œ ์ง€์—ฐ์„ ์ตœ์†Œํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์— ETCD ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์ง€ ์•Š๋‹ค๋ฉด ETCD๋ฅผ ์ฐธ๊ฐ€์ž๋“ค ์‚ฌ์ด์— ์ถฉ๋ถ„ํ•œ ๋Œ€์—ญํญ์„ ๊ฐ€์ง€๊ณ  ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ€๊น๊ฒŒ ๋ฐฐ์น˜ํ•˜์‹ญ์‹œ์˜ค. ๋˜ํ•œ ํด๋Ÿฌ์Šคํ„ฐ์— ํ•ด๋ฅผ ๋ผ์น˜์ง€ ์•Š๊ณ  ETCD์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋…ธ๋“œ๊ฐ€ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋Š”์ง€ ์ฃผ์˜ํ•˜์‹ญ์‹œ์˜ค.

XNUMX๊ฐ€์ง€ Kubernetes ์„ฑ๋Šฅ ํŒ

ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ฐธ๊ฐ€์ž ์ˆ˜๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ์ฆ๊ฐ€ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๋Š” ๋Œ€์‹  ๋‚ด๊ฒฐํ•จ์„ฑ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋“  ๊ฒƒ์ด ์ ์ ˆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ์„ค์ •์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ๊ถŒ์žฅ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํด๋Ÿฌ์Šคํ„ฐ ํฌ๊ธฐ์— ๋”ฐ๋ผ ์ข‹์€ ํ•˜๋“œ์›จ์–ด๋ฅผ ๊ฐ–์ถ”์‹ญ์‹œ์˜ค(๋‹ค์Œ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Œ). ์—ฌ๊ธฐ์—).

  2. ํ•œ ์Œ์˜ DC ๋˜๋Š” ๋„คํŠธ์›Œํฌ์™€ ๋””์Šคํฌ ์‚ฌ์ด์— ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ถ„์‚ฐ์‹œํ‚จ ๊ฒฝ์šฐ ๋ช‡ ๊ฐ€์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์กฐ์ •ํ•˜์—ฌ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋‚จ๊ฒจ๋‘ก๋‹ˆ๋‹ค(์ฝ์„ ์ˆ˜ ์žˆ์Œ). ์—ฌ๊ธฐ์—).

๊ฒฐ๋ก 

์ด ๋ฌธ์„œ๋Š” ์šฐ๋ฆฌ ํŒ€์ด ์ค€์ˆ˜ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž‘์—…์— ๋Œ€ํ•œ ๋‹จ๊ณ„๋ณ„ ์„ค๋ช…์ด ์•„๋‹ˆ๋ผ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ๊ฐ ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๊ณ ์œ ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ณ ์œ ํ•˜๋ฉฐ ์กฐ์ • ์†”๋ฃจ์…˜์€ ํฌ๊ฒŒ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•, ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜๊ฒฌ์— ๊ท€ํ•˜์˜ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•˜์‹ญ์‹œ์˜ค. ์•„๋Š” ๊ฒƒ์ด ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com