Kubernetes: ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•œ๊ฐ€์š”?

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

Kubernetes: ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•œ๊ฐ€์š”?

์‹œ์Šคํ…œ์— ์กด์žฌํ•˜๋Š” ์ฃผ์š” ๋ฆฌ์†Œ์Šค ์œ ํ˜•๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ด๋Š” ํ”„๋กœ์„ธ์„œ ์‹œ๊ฐ„๊ณผ RAM์ž…๋‹ˆ๋‹ค. k8s ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค ์œ ํ˜•์€ ๋‹ค์Œ ๋‹จ์œ„๋กœ ์ธก์ •๋ฉ๋‹ˆ๋‹ค.

  • CPU - ์ฝ”์–ด ๋‚ด
  • RAM - ๋ฐ”์ดํŠธ ๋‹จ์œ„

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

๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ๋‘ ์œ ํ˜•์„ ๋ชจ๋‘ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ๋™์ž‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

๋‹ค์Œ์€ ๋ฆฌ์†Œ์Šค ์ œํ•œ์„ ์„ค์ •ํ•˜๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

  • ํŠน์ • ์ปจํ…Œ์ด๋„ˆ ์ˆ˜์ค€์—์„œ:

    containers:
    - name: app-nginx
      image: nginx
      resources:
        requests:
          memory: 1Gi
        limits:
          cpu: 200m

    ์ €๊ฒƒ๋“ค. ์ด ๊ฒฝ์šฐ nginx๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋…ธ๋“œ์— ์ตœ์†Œ 1G์˜ ์—ฌ์œ  RAM๊ณผ 0.2 CPU๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, ์ปจํ…Œ์ด๋„ˆ๋Š” ์ตœ๋Œ€ 0.2 CPU์™€ ๋…ธ๋“œ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  RAM์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ •์ˆ˜ ์ˆ˜์ค€ ns์—์„œ:

    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: nxs-test
    spec:
      hard:
        requests.cpu: 300m
        requests.memory: 1Gi
        limits.cpu: 700m
        limits.memory: 2Gi

    ์ €๊ฒƒ๋“ค. ๊ธฐ๋ณธ ns์˜ ๋ชจ๋“  ์š”์ฒญ ์ปจํ…Œ์ด๋„ˆ ํ•ฉ๊ณ„๋Š” CPU์˜ ๊ฒฝ์šฐ 300m, OP์˜ ๊ฒฝ์šฐ 1G๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋ชจ๋“  ์ œํ•œ์˜ ํ•ฉ๊ณ„๋Š” CPU์˜ ๊ฒฝ์šฐ 700m, OP์˜ ๊ฒฝ์šฐ 2G์ž…๋‹ˆ๋‹ค.

  • ns ๋‹จ์œ„์˜ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ œํ•œ:

    apiVersion: v1
    kind: LimitRange
    metadata:
      name: nxs-limit-per-container
    spec:
     limits:
       - type: Container
         defaultRequest:
           cpu: 100m
           memory: 1Gi
         default:
           cpu: 1
           memory: 2Gi
         min:
           cpu: 50m
           memory: 500Mi
         max:
           cpu: 2
           memory: 4Gi

    ์ €๊ฒƒ๋“ค. ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์˜ ๊ธฐ๋ณธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์š”์ฒญ์€ CPU์˜ ๊ฒฝ์šฐ 100m, OP์˜ ๊ฒฝ์šฐ 1G๋กœ ์„ค์ •๋˜๊ณ  ์ œํ•œ์€ CPU ๋ฐ 1G๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ๋™์‹œ์— CPU(2m < x < 50) ๋ฐ RAM(2M < x < 500G)์— ๋Œ€ํ•œ ์š”์ฒญ/์ œํ•œ์—์„œ ๊ฐ€๋Šฅํ•œ ๊ฐ’์—๋„ ์ œํ•œ์ด ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

  • ํฌ๋“œ ์ˆ˜์ค€ ์ œํ•œ์‚ฌํ•ญ ns:

    apiVersion: v1
    kind: LimitRange
    metadata:
     name: nxs-limit-pod
    spec:
     limits:
     - type: Pod
       max:
         cpu: 4
         memory: 1Gi

    ์ €๊ฒƒ๋“ค. ๊ธฐ๋ณธ ns์˜ ๊ฐ ํฌ๋“œ์—๋Š” vCPU 4๊ฐœ ๋ฐ 1G๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ด๋Ÿฌํ•œ ์ œํ•œ์„ ์„ค์ •ํ•˜๋ฉด ์–ด๋–ค ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ง์”€๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ ๊ฐ„ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜

์•„์‹œ๋‹ค์‹œํ”ผ k8s ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋…ธ๋“œ ๊ฐ„ Pod ๋ฐฐํฌ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์Šค์ผ€์ค„๋Ÿฌ, ํŠน์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ผ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์‹œ์ž‘ํ•  ์ตœ์ ์˜ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•  ๋•Œ ๋‘ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

  1. ํ•„ํ„ฐ๋ง
  2. ๋ฒ”์œ„

์ €๊ฒƒ๋“ค. ์„ค๋ช…๋œ ์ •์ฑ…์— ๋”ฐ๋ผ ์ดˆ๊ธฐ์— ๋…ธ๋“œ๋Š” ์„ธํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํฌ๋“œ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์ˆ ์–ด (๋…ธ๋“œ์— ํฌ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ - PodFitsResources ํฌํ•จ) ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋‹ค์Œ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์šฐ์„ ์ˆœ์œ„ ํฌ์ธํŠธ๊ฐ€ ๋ถ€์—ฌ๋˜๊ณ (๋…ธ๋“œ์— ๋ฌด๋ฃŒ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๋” ๋งŽ์€ ํฌ์ธํŠธ๊ฐ€ ํ• ๋‹น๋จ - LeastResourceAllocation/LeastRequestedPriority/BalancedResourceAllocation ํฌํ•จ) ๊ฐ€์žฅ ๋งŽ์€ ํฌ์ธํŠธ๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ์—์„œ ํฌ๋“œ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค(์—ฌ๋Ÿฌ ๋…ธ๋“œ๊ฐ€ ๋™์‹œ์— ์ด ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋Š” ๊ฒฝ์šฐ ๋ฌด์ž‘์œ„๋กœ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค).

๋™์‹œ์—, ๋…ธ๋“œ์˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ‰๊ฐ€ํ•  ๋•Œ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ etcd์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ ์•ˆ๋‚ด๋œ๋‹ค๋Š” ์ ์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฐ Pod์˜ ์š”์ฒญ/์ œํ•œ ๋ฆฌ์†Œ์Šค ์–‘์— ๋Œ€ํ•œ ๊ฒƒ์ด์ง€๋งŒ ์‹ค์ œ ๋ฆฌ์†Œ์Šค ์†Œ๋น„์—๋Š” ํ•ด๋‹น๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์ •๋ณด๋Š” ๋ช…๋ น ์ถœ๋ ฅ์—์„œ โ€‹โ€‹์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. kubectl describe node $NODE์˜ˆ :

# kubectl describe nodes nxs-k8s-s1
..
Non-terminated Pods:         (9 in total)
  Namespace                  Name                                         CPU Requests  CPU Limits  Memory Requests  Memory Limits  AGE
  ---------                  ----                                         ------------  ----------  ---------------  -------------  ---
  ingress-nginx              nginx-ingress-controller-754b85bf44-qkt2t    0 (0%)        0 (0%)      0 (0%)           0 (0%)         233d
  kube-system                kube-flannel-26bl4                           150m (0%)     300m (1%)   64M (0%)         500M (1%)      233d
  kube-system                kube-proxy-exporter-cb629                    0 (0%)        0 (0%)      0 (0%)           0 (0%)         233d
  kube-system                kube-proxy-x9fsc                             0 (0%)        0 (0%)      0 (0%)           0 (0%)         233d
  kube-system                nginx-proxy-k8s-worker-s1                    25m (0%)      300m (1%)   32M (0%)         512M (1%)      233d
  nxs-monitoring             alertmanager-main-1                          100m (0%)     100m (0%)   425Mi (1%)       25Mi (0%)      233d
  nxs-logging                filebeat-lmsmp                               100m (0%)     0 (0%)      100Mi (0%)       200Mi (0%)     233d
  nxs-monitoring             node-exporter-v4gdq                          112m (0%)     122m (0%)   200Mi (0%)       220Mi (0%)     233d
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests           Limits
  --------           --------           ------
  cpu                487m (3%)          822m (5%)
  memory             15856217600 (2%)  749976320 (3%)
  ephemeral-storage  0 (0%)             0 (0%)

์—ฌ๊ธฐ์—์„œ๋Š” ํŠน์ • ๋…ธ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋ชจ๋“  ํฌ๋“œ์™€ ๊ฐ ํฌ๋“œ๊ฐ€ ์š”์ฒญํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ cronjob-cron-events-1573793820-xt6q9 ํฌ๋“œ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ์Šค์ผ€์ค„๋Ÿฌ ๋กœ๊ทธ์˜ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค(์ด ์ •๋ณด๋Š” ์‹œ์ž‘ ๋ช…๋ น ์ธ์ˆ˜ -v=10์—์„œ 10๋ฒˆ์งธ ๋กœ๊น… ์ˆ˜์ค€์„ ์„ค์ •ํ•  ๋•Œ ์Šค์ผ€์ค„๋Ÿฌ ๋กœ๊ทธ์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค).

๋กœ๊ทธ

I1115 07:57:21.637791       1 scheduling_queue.go:908] About to try and schedule pod nxs-stage/cronjob-cron-events-1573793820-xt6q9                                                                                                                                           
I1115 07:57:21.637804       1 scheduler.go:453] Attempting to schedule pod: nxs-stage/cronjob-cron-events-1573793820-xt6q9                                                                                                                                                    
I1115 07:57:21.638285       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s5 is allowed, Node is running only 16 out of 110 Pods.                                                                               
I1115 07:57:21.638300       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s6 is allowed, Node is running only 20 out of 110 Pods.                                                                               
I1115 07:57:21.638322       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s3 is allowed, Node is running only 20 out of 110 Pods.                                                                               
I1115 07:57:21.638322       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s4 is allowed, Node is running only 17 out of 110 Pods.                                                                               
I1115 07:57:21.638334       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s10 is allowed, Node is running only 16 out of 110 Pods.                                                                              
I1115 07:57:21.638365       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s12 is allowed, Node is running only 9 out of 110 Pods.                                                                               
I1115 07:57:21.638334       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s11 is allowed, Node is running only 11 out of 110 Pods.                                                                              
I1115 07:57:21.638385       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s1 is allowed, Node is running only 19 out of 110 Pods.                                                                               
I1115 07:57:21.638402       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s2 is allowed, Node is running only 21 out of 110 Pods.                                                                               
I1115 07:57:21.638383       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s9 is allowed, Node is running only 16 out of 110 Pods.                                                                               
I1115 07:57:21.638335       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s8 is allowed, Node is running only 18 out of 110 Pods.                                                                               
I1115 07:57:21.638408       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s13 is allowed, Node is running only 8 out of 110 Pods.                                                                               
I1115 07:57:21.638478       1 predicates.go:1369] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s10 is allowed, existing pods anti-affinity terms satisfied.                                                                         
I1115 07:57:21.638505       1 predicates.go:1369] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s8 is allowed, existing pods anti-affinity terms satisfied.                                                                          
I1115 07:57:21.638577       1 predicates.go:1369] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s9 is allowed, existing pods anti-affinity terms satisfied.                                                                          
I1115 07:57:21.638583       1 predicates.go:829] Schedule Pod nxs-stage/cronjob-cron-events-1573793820-xt6q9 on Node nxs-k8s-s7 is allowed, Node is running only 25 out of 110 Pods.                                                                               
I1115 07:57:21.638932       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: BalancedResourceAllocation, capacity 39900 millicores 66620178432 memory bytes, total request 2343 millicores 9640186880 memory bytes, score 9        
I1115 07:57:21.638946       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: LeastResourceAllocation, capacity 39900 millicores 66620178432 memory bytes, total request 2343 millicores 9640186880 memory bytes, score 8           
I1115 07:57:21.638961       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: BalancedResourceAllocation, capacity 39900 millicores 66620170240 memory bytes, total request 4107 millicores 11307422720 memory bytes, score 9        
I1115 07:57:21.638971       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: BalancedResourceAllocation, capacity 39900 millicores 66620178432 memory bytes, total request 5847 millicores 24333637120 memory bytes, score 7        
I1115 07:57:21.638975       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: LeastResourceAllocation, capacity 39900 millicores 66620170240 memory bytes, total request 4107 millicores 11307422720 memory bytes, score 8           
I1115 07:57:21.638990       1 resource_allocation.go:78] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: LeastResourceAllocation, capacity 39900 millicores 66620178432 memory bytes, total request 5847 millicores 24333637120 memory bytes, score 7           
I1115 07:57:21.639022       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s10: TaintTolerationPriority, Score: (10)                                                                                                        
I1115 07:57:21.639030       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s8: TaintTolerationPriority, Score: (10)                                                                                                         
I1115 07:57:21.639034       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s9: TaintTolerationPriority, Score: (10)                                                                                                         
I1115 07:57:21.639041       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s10: NodeAffinityPriority, Score: (0)                                                                                                            
I1115 07:57:21.639053       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s8: NodeAffinityPriority, Score: (0)                                                                                                             
I1115 07:57:21.639059       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s9: NodeAffinityPriority, Score: (0)                                                                                                             
I1115 07:57:21.639061       1 interpod_affinity.go:237] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: InterPodAffinityPriority, Score: (0)                                                                                                                   
I1115 07:57:21.639063       1 selector_spreading.go:146] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s10: SelectorSpreadPriority, Score: (10)                                                                                                                   
I1115 07:57:21.639073       1 interpod_affinity.go:237] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: InterPodAffinityPriority, Score: (0)                                                                                                                    
I1115 07:57:21.639077       1 selector_spreading.go:146] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s8: SelectorSpreadPriority, Score: (10)                                                                                                                    
I1115 07:57:21.639085       1 interpod_affinity.go:237] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: InterPodAffinityPriority, Score: (0)                                                                                                                    
I1115 07:57:21.639088       1 selector_spreading.go:146] cronjob-cron-events-1573793820-xt6q9 -> nxs-k8s-s9: SelectorSpreadPriority, Score: (10)                                                                                                                    
I1115 07:57:21.639103       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s10: SelectorSpreadPriority, Score: (10)                                                                                                         
I1115 07:57:21.639109       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s8: SelectorSpreadPriority, Score: (10)                                                                                                          
I1115 07:57:21.639114       1 generic_scheduler.go:726] cronjob-cron-events-1573793820-xt6q9_nxs-stage -> nxs-k8s-s9: SelectorSpreadPriority, Score: (10)                                                                                                          
I1115 07:57:21.639127       1 generic_scheduler.go:781] Host nxs-k8s-s10 => Score 100037                                                                                                                                                                            
I1115 07:57:21.639150       1 generic_scheduler.go:781] Host nxs-k8s-s8 => Score 100034                                                                                                                                                                             
I1115 07:57:21.639154       1 generic_scheduler.go:781] Host nxs-k8s-s9 => Score 100037                                                                                                                                                                             
I1115 07:57:21.639267       1 scheduler_binder.go:269] AssumePodVolumes for pod "nxs-stage/cronjob-cron-events-1573793820-xt6q9", node "nxs-k8s-s10"                                                                                                               
I1115 07:57:21.639286       1 scheduler_binder.go:279] AssumePodVolumes for pod "nxs-stage/cronjob-cron-events-1573793820-xt6q9", node "nxs-k8s-s10": all PVCs bound and nothing to do                                                                             
I1115 07:57:21.639333       1 factory.go:733] Attempting to bind cronjob-cron-events-1573793820-xt6q9 to nxs-k8s-s10

์—ฌ๊ธฐ์„œ๋Š” ์ฒ˜์Œ์— ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” 3๊ฐœ์˜ ๋…ธ๋“œ ๋ชฉ๋ก์„ ํ•„ํ„ฐ๋งํ•˜๊ณ  ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(nxs-k8s-s8, nxs-k8s-s9, nxs-k8s-s10). ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๋…ธ๋“œ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋Ÿฌํ•œ ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ ๋งค๊ฐœ๋ณ€์ˆ˜(BalancedResourceAllocation, LeastResourceAllocation ํฌํ•จ)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ๊ถ๊ทน์ ์œผ๋กœ ํฌ๋“œ๋Š” ํฌ์ธํŠธ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ๋…ธ๋“œ์— ์˜ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ ๋™์‹œ์— ๋‘ ๊ฐœ์˜ ๋…ธ๋“œ๋Š” ๋™์ผํ•œ ํฌ์ธํŠธ ์ˆ˜ 100037์„ ๊ฐ€์ง€๋ฏ€๋กœ nxs-k8s-s10์ด๋ผ๋Š” ์ž„์˜์˜ ๋…ธ๋“œ๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค).

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

ํฌ๋“œ์˜ ํ‡ด๊ฑฐ

์•„์‹œ๋‹ค์‹œํ”ผ ๊ฐ ํฌ๋“œ์—๋Š” 3๊ฐ€์ง€ QoS ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

  1. ๋ณด์žฅ โ€” ํฌ๋“œ์˜ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ฐ CPU์— ๋Œ€ํ•œ ์š”์ฒญ ๋ฐ ์ œํ•œ์ด ์ง€์ •๋˜๊ณ  ์ด ๊ฐ’์ด ์ผ์น˜ํ•ด์•ผ ํ•  ๋•Œ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.
  2. ํŒŒ์—ด ๊ฐ€๋Šฅ โ€” ํฌ๋“œ์— ์žˆ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปจํ…Œ์ด๋„ˆ์— ์š”์ฒญ๊ณผ ์ œํ•œ์ด ์žˆ๊ณ  ์š”์ฒญ < ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ตœ์„ ์˜ ๋…ธ๋ ฅ โ€” ํฌ๋“œ์˜ ๋‹จ์ผ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ฆฌ์†Œ์Šค ์ œํ•œ์ด ์—†๋Š” ๊ฒฝ์šฐ

๋™์‹œ์— ๋…ธ๋“œ์— ๋ฆฌ์†Œ์Šค(๋””์Šคํฌ, ๋ฉ”๋ชจ๋ฆฌ)๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด kubelet์€ ํฌ๋“œ์˜ ์šฐ์„ ์ˆœ์œ„์™€ QoS ํด๋ž˜์Šค๋ฅผ ๊ณ ๋ คํ•˜๋Š” ํŠน์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ผ ํฌ๋“œ์˜ ์ˆœ์œ„๋ฅผ ๋งค๊ธฐ๊ณ  ์ œ๊ฑฐํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด RAM์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๋Š” ๊ฒฝ์šฐ QoS ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์Œ ์›์น™์— ๋”ฐ๋ผ ํฌ์ธํŠธ๊ฐ€ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

  • ๋ณด์žฅ: -์‚ผ
  • ์ตœ๊ณ ์˜ ๋…ธ๋ ฅ: 1000
  • ๋ฒ„์ŠคํŠธ ๊ฐ€๋Šฅ: min(max(2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999)

์ €๊ฒƒ๋“ค. ๋™์ผํ•œ ์šฐ์„ ์ˆœ์œ„๋กœ kubelet์€ ๋จผ์ € ๋…ธ๋“œ์—์„œ ์ตœ์„ ์˜ QoS ํด๋ž˜์Šค๋ฅผ ๊ฐ–์ถ˜ ํฌ๋“œ๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์ถœ๋ ฅ: ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ถ€์กฑํ•œ ๊ฒฝ์šฐ ์›ํ•˜๋Š” ํฌ๋“œ๊ฐ€ ๋…ธ๋“œ์—์„œ ์ œ๊ฑฐ๋  ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ด๋ ค๋ฉด ์šฐ์„ ์ˆœ์œ„์™€ ํ•จ๊ป˜ ์š”์ฒญ/ํ•œ๋„ ์„ค์ •๋„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌ๋“œ(HPA)์˜ ์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ์„ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜

k8s ์—”ํ„ฐํ‹ฐ์™€ ๊ฐ™์ด ๋ฆฌ์†Œ์Šค(์‹œ์Šคํ…œ - CPU/RAM ๋˜๋Š” ์‚ฌ์šฉ์ž - rps) ์‚ฌ์šฉ์— ๋”ฐ๋ผ Pod ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์ด๋Š” ์ž‘์—…์ธ ๊ฒฝ์šฐ ๊ณ ์ „๋ ฅ ์ฆํญ๊ธฐ (์ˆ˜ํ‰ํ˜• ํฌ๋“œ ์ž๋™ ํฌ๊ธฐ ์กฐ์ •๊ธฐ). ๊ทธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๊ด€์ฐฐ๋œ ๋ฆฌ์†Œ์Šค์˜ ํ˜„์žฌ ํŒ๋…๊ฐ’์ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค(currentMetricValue).
  2. ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์›ํ•˜๋Š” ๊ฐ’์ด ๊ฒฐ์ •๋˜๋ฉฐ(desiredMetricValue), ์‹œ์Šคํ…œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.
  3. ํ˜„์žฌ ๋ณต์ œ๋ณธ ์ˆ˜๊ฐ€ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค(currentReplicas).
  4. ๋‹ค์Œ ๊ณต์‹์€ ์›ํ•˜๋Š” ๋ณต์ œ๋ณธ ์ˆ˜(desiredReplicas)๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.
    DesiredReplicas = [ currentReplicas * ( currentMetricValue / DesiredMetricValue )]

์ด ๊ฒฝ์šฐ ๊ณ„์ˆ˜(currentMetricValue/desiredMetricValue)๊ฐ€ 1์— ๊ฐ€๊นŒ์šฐ๋ฉด ์Šค์ผ€์ผ๋ง์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ด ๊ฒฝ์šฐ ํ—ˆ์šฉ๋˜๋Š” ์˜ค๋ฅ˜๋Š” ์ง์ ‘ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ 0.1์ž…๋‹ˆ๋‹ค).

CPU ์†Œ๋น„์— ๋”ฐ๋ผ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ์•ฑ ํ…Œ์ŠคํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๋ฐฐํฌ๋ผ๊ณ  ์„ค๋ช…๋จ)์˜ ์˜ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ hpa๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ

    kind: Deployment
    apiVersion: apps/v1beta2
    metadata:
    name: app-test
    spec:
    selector:
    matchLabels:
    app: app-test
    replicas: 2
    template:
    metadata:
    labels:
    app: app-test
    spec:
    containers:
    - name: nginx
    image: registry.nixys.ru/generic-images/nginx
    imagePullPolicy: Always
    resources:
    requests:
    cpu: 60m
    ports:
    - name: http
    containerPort: 80
    - name: nginx-exporter
    image: nginx/nginx-prometheus-exporter
    resources:
    requests:
    cpu: 30m
    ports:
    - name: nginx-exporter
    containerPort: 9113
    args:
    - -nginx.scrape-uri
    - http://127.0.0.1:80/nginx-status

    ์ €๊ฒƒ๋“ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌ๋“œ๊ฐ€ ์ฒ˜์Œ์— ๋‘ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค์—์„œ ์‹œ์ž‘๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ธ์Šคํ„ด์Šค์—๋Š” ๋‘ ๊ฐœ์˜ nginx ๋ฐ nginx-exporter ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์š”์ฒญ CPU์šฉ.

  • HPA ์„ ์–ธ๋ฌธ

    apiVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    metadata:
    name: app-test-hpa
    spec:
    maxReplicas: 10
    minReplicas: 2
    scaleTargetRef:
    apiVersion: extensions/v1beta1
    kind: Deployment
    name: app-test
    metrics:
    - type: Resource
    resource:
    name: cpu
    target:
    type: Utilization
    averageUtilization: 30

    ์ €๊ฒƒ๋“ค. ๋ฐฐํฌ ์•ฑ ํ…Œ์ŠคํŠธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ  CPU ํ‘œ์‹œ๊ธฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ Pod ์ˆ˜๋ฅผ ์กฐ์ •ํ•˜๋Š” hpa๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค(Pod๋Š” ์š”์ฒญํ•œ CPU์˜ 30%๋ฅผ ์†Œ๋น„ํ•ด์•ผ ํ•จ). 2~10์˜ ๋ฒ”์œ„.

    ์ด์ œ ๋‚œ๋กœ ์ค‘ ํ•˜๋‚˜์— ๋ถ€ํ•˜๋ฅผ ๊ฐ€ํ•  ๊ฒฝ์šฐ hpa ์ž‘๋™ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

     # kubectl top pod
    NAME                                                   CPU(cores)   MEMORY(bytes)
    app-test-78559f8f44-pgs58            101m         243Mi
    app-test-78559f8f44-cj4jz            4m           240Mi

์ „์ฒด์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์›ํ•˜๋Š” ๊ฐ’(desiredMetricValue) - hpa ์„ค์ •์— ๋”ฐ๋ฅด๋ฉด 30%์ž…๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ๊ฐ’(currentMetricValue) - ๊ณ„์‚ฐ์„ ์œ„ํ•ด ์ปจํŠธ๋กค๋Ÿฌ ๊ด€๋ฆฌ์ž๋Š” ๋ฆฌ์†Œ์Šค ์†Œ๋น„์˜ ํ‰๊ท  ๊ฐ’์„ % ๋‹จ์œ„๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด๋ถ€๋กœ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    1. ๋ฉ”ํŠธ๋ฆญ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ Pod ๋ฉ”ํŠธ๋ฆญ์˜ ์ ˆ๋Œ€๊ฐ’์„ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. 101m์™€ 4m
    2. ํ‰๊ท  ์ ˆ๋Œ€๊ฐ’์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, (101m + 4m) / 2 = 53m
    3. ์›ํ•˜๋Š” ๋ฆฌ์†Œ์Šค ์†Œ๋น„์— ๋Œ€ํ•œ ์ ˆ๋Œ€๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. (์ด๋ฅผ ์œ„ํ•ด ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์˜ ์š”์ฒญ์ด ํ•ฉ์‚ฐ๋ฉ๋‹ˆ๋‹ค.) 60m + 30m = 90m
    4. ์š”์ฒญ Pod๋ฅผ ๊ธฐ์ค€์œผ๋กœ CPU ์†Œ๋น„์˜ ํ‰๊ท  ๋น„์œจ์„ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. 53m / 90m * 100% = 59%

์ด์ œ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์ค€๋น„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๊ณ„์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.

ratio = 59% / 30% = 1.96

์ €๊ฒƒ๋“ค. ๋ณต์ œ๋ณธ ์ˆ˜๋Š” ~2๋ฐฐ๋กœ ์ฆ๊ฐ€ํ•˜์—ฌ [2 * 1.96] = 4๊ฐ€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก  : ๋ณด์‹œ๋‹ค์‹œํ”ผ, ์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์ž‘๋™ํ•˜๋ ค๋ฉด ๊ด€์ฐฐ๋œ ํฌ๋“œ์˜ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ์š”์ฒญ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ํ•„์ˆ˜ ์กฐ๊ฑด์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ์˜ ์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ์„ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜(Cluster Autoscaler)

๋ถ€ํ•˜ ์„œ์ง€๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋™์•ˆ ์‹œ์Šคํ…œ์— ๋ฏธ์น˜๋Š” ๋ถ€์ •์ ์ธ ์˜ํ–ฅ์„ ์ค‘ํ™”ํ•˜๋ ค๋ฉด hpa๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, hpa ์ปจํŠธ๋กค๋Ÿฌ ๊ด€๋ฆฌ์ž์˜ ์„ค์ •์— ๋”ฐ๋ผ ๋ณต์ œ๋ณธ ์ˆ˜๋ฅผ 2๋ฐฐ๋กœ ๋Š˜๋ ค์•ผ ํ•œ๋‹ค๊ณ  ๊ฒฐ์ •ํ–ˆ์ง€๋งŒ ๋…ธ๋“œ์—๋Š” ์ด๋Ÿฌํ•œ ์ˆ˜์˜ Pod๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ์œ  ๋ฆฌ์†Œ์Šค๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(์ฆ‰, ๋…ธ๋“œ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญ ํฌ๋“œ์— ์š”์ฒญํ•จ) ์ด๋Ÿฌํ•œ ํฌ๋“œ๋Š” ๋ณด๋ฅ˜ ์ค‘ ์ƒํƒœ๋กœ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ์ œ๊ณต์—…์ฒด์— ํ•ด๋‹น IaaS/PaaS(์˜ˆ: GKE/GCE, AKS, EKS ๋“ฑ)๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋…ธ๋“œ ์ž๋™ ํฌ๊ธฐ ์กฐ์ •๊ธฐ. ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ Pod์— ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ตœ๋Œ€ ๋ฐ ์ตœ์†Œ ๋…ธ๋“œ ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ณ  (ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์ฃผ๋ฌธ/์ œ๊ฑฐํ•จ์œผ๋กœ์จ) ํ˜„์žฌ ๋…ธ๋“œ ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์•ฝํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋ณด๋ฅ˜ ์ค‘ ์ƒํƒœ).

๊ฒฐ๋ก  : ๋…ธ๋“œ๋ฅผ ์ž๋™ ํฌ๊ธฐ ์กฐ์ •ํ•˜๋ ค๋ฉด k8s๊ฐ€ ๋…ธ๋“œ์˜ ๋กœ๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ‰๊ฐ€ํ•˜๊ณ  ์ด์— ๋”ฐ๋ผ ํด๋Ÿฌ์Šคํ„ฐ์— ๋‹ค์Œ ํฌ๋“œ๋ฅผ ์‹œ์ž‘ํ•  ๋ฆฌ์†Œ์Šค๊ฐ€ ์—†๋‹ค๊ณ  ๋ณด๊ณ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํฌ๋“œ ์ปจํ…Œ์ด๋„ˆ์— ์š”์ฒญ์„ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆ ๋ฆฌ์†Œ์Šค ์ œํ•œ์„ ์„ค์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค.

  1. k8s ๋…ธ๋“œ ๊ฐ„ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ์ธก๋ฉด์—์„œ ์Šค์ผ€์ค„๋Ÿฌ์˜ ๋ณด๋‹ค ์ •ํ™•ํ•œ ์ž‘๋™์„ ์œ„ํ•ด
  2. "ํฌ๋“œ ํ‡ด๊ฑฐ" ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด
  3. HPA(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํฌ๋“œ)์˜ ์ˆ˜ํ‰ ์ž๋™ ํ™•์žฅ์ด ์ž‘๋™ํ•˜๋ ค๋ฉด
  4. ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๋ฅผ ์œ„ํ•œ ๋…ธ๋“œ์˜ ์ˆ˜ํ‰์  AutoScaling(Cluster AutoScaling)

๋ธ”๋กœ๊ทธ์—์„œ ๋‹ค๋ฅธ ๊ธฐ์‚ฌ๋„ ์ฝ์–ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€