6 min read

ํ—˜๋‚œํ•œ Kubernetes ์ „ํ™˜๊ธฐ (5) - KEDA ์ ์šฉํ•˜๊ธฐ

Table of Contents

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

KEDA

KEDA๋Š” ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋™์ ์œผ๋กœ ํ™•์žฅํ•˜๊ฑฐ๋‚˜ ์ถ•์†Œํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” Kubernetes ์ปดํฌ๋„ŒํŠธ๋กœ, CNCF Graduated Project์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฉ”์‹œ์ง€ ํ๋‚˜ DB์— ์Œ“์ธ ๋ฐ์ดํ„ฐ์˜ ์–‘์„ ๋ณด๊ณ  ํŠธ๋ž˜ํ”ฝ์„ ์กฐ์ •ํ•˜๊ฑฐ๋‚˜, CronJob์ฒ˜๋Ÿผ ํŠน์ • ์‹œ๊ฐ„๋Œ€๋ฅผ ๊ธฐ์ค€์œผ๋กœ Pod ์ˆ˜๋ฅผ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

KEDA Diagram

Image: KEDA Architecture from KEDA - Docs, Apache 2.0

KEDA์˜ ์›๋ฆฌ๋ฅผ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋ฉด, ScaledObject๋ผ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜ํ•˜์—ฌ HPA(Horizontal Pod Autoscaler)์˜ ์ƒํƒœ๋ฅผ ์ง€์†์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์™ธ๋ถ€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ScaledObject๊ฐ€ Scaling ๊ทœ์น™์„ ๋ณ€๊ฒฝํ•˜๊ณ , ์ด๋ฅผ HPA์— ์ „๋‹ฌํ•˜์—ฌ Pod ์ˆ˜๋ฅผ ์กฐ์ ˆํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
์‹ค์ œ๋กœ ScaledObject๋ฅผ ์ƒ์„ฑํ•ด ๋ณด๋ฉด ์ž๋™์œผ๋กœ HPA๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , Pod scaling ์ด๋ฒคํŠธ ์ž์ฒด๋Š” HPA์— ์œ„์ž„๋ฉ๋‹ˆ๋‹ค.

๊ธฐ์กด์˜ HPA๋Š” ๋ณดํ†ต CPU ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ ์— ๋”ฐ๋ผ Pod์˜ ์ˆ˜๋ฅผ ์กฐ์ ˆํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ์Šต๋‹ˆ๋‹ค. KEDA๋Š” ์ด๋ฅผ ํ™•์žฅํ•˜์—ฌ ์ด๋ฒคํŠธ ์†Œ์Šค๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋” ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ๋œ ์กฐ๊ฑด์—์„œ์˜ ๋ฆฌ์†Œ์Šค ์กฐ์ •์„ ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ด ์ค๋‹ˆ๋‹ค.

์ €ํฌ ํšŒ์‚ฌ์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฌธ์„œ ์ฒ˜๋ฆฌ๋‚˜ ๊ฐ์ข… ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ๋ฅผ RabbitMQ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๊ณ  ๋™์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ•˜๋Š” ์š”๊ตฌ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์—๋Š” ์ฝ”๋“œ๋กœ ์ด ๋กœ์ง์„ ์ง์ ‘ ๊ตฌํ˜„ํ–ˆ์—ˆ๋Š”๋ฐ, Kubernetes ํ™˜๊ฒฝ์œผ๋กœ ์ „ํ™˜ํ•˜๋ฉด์„œ ์‹ค์ œ KEDA๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋˜ํ•œ B2B ์„œ๋น„์Šค๊ฐ€ ๋ฉ”์ธ์ด๊ธฐ ๋•Œ๋ฌธ์— ํšŒ์‚ฌ ์„œ๋น„์Šค์˜ ํŠธ๋ž˜ํ”ฝ์€ ํŠน์ • ์‹œ๊ฐ„๋Œ€์— ๋ชฐ๋ฆฌ๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์—ˆ๊ณ , ์ด์— ๋”ฐ๋ฅธ ํŠธ๋ž˜ํ”ฝ ๋Œ€์‘๊ณผ ๋ฆฌ์†Œ์Šค ํšจ์œจํ™”์—๋„ KEDA๊ฐ€ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด ๋  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

RabbitMQ ์—ฐ๋™ํ•˜๊ธฐ

์ €ํฌ๊ฐ€ KEDA๋ฅผ ์ ์šฉํ•˜๊ณ ์ž ํ•œ ์•ฑ๋“ค์˜ ์ด๋ฒคํŠธ ์†Œ์Šค๋Š” RabbitMQ์˜€๊ณ , ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ง‘์ค‘์ ์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. RabbitMQ ์ด๋ฒคํŠธ ์†Œ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์—ฐ๋™ํ•˜๋Š”์ง€๋Š” ์ด ๋ฌธ์„œ์— ์‚ฌ๋ก€๋ณ„๋กœ ์ž์„ธํžˆ ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๊ตฌํ˜„

KEDA ์„ค์น˜๋Š” Helm chart๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
KEDA๋ฅผ ์‚ฌ์šฉํ•  ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ์— ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

KEDA๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” ๋‹ค์Œ ๋ฆฌ์†Œ์Šค๋“ค์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ScaledObject: ์ด๋ฒคํŠธ ์†Œ์Šค๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , HPA๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•œ Scaling ๊ทœ์น™์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ScaledObject๊ฐ€ ์ •์˜๋˜๋ฉด ์ž๋™์œผ๋กœ HPA๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
  • TriggerAuthentication: ์ด๋ฒคํŠธ ์†Œ์Šค์— ๋Œ€ํ•œ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” RabbitMQ์˜ URL์ด๋‚˜ ์ธ์ฆ ์ •๋ณด๊ฐ€ ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.
  • Secret: ๋‹น์—ฐํžˆ ๋ฆฌ์†Œ์Šค์— ์ง์ ‘ ๋น„๋ฐ€ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ Secret์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ์ €ํฌ๋Š” External Secret Operator๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ Secret Manager์—์„œ ๋น„๋ฐ€ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ๋œ ๊ตฌํ˜„์ฒด๋Š” ๊ณต์‹ ๋ฌธ์„œ์— ๋งค์šฐ ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด ๋ฆฌ์†Œ์Šค๋“ค์„ ๊ธฐ์กด ์„œ๋น„์Šค Helm chart ํ…œํ”Œ๋ฆฟ์— ํ†ตํ•ฉํ•˜์—ฌ values.yaml์—์„œ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŠน์ • ํ ์ง€์ •ํ•˜๊ธฐ

๊ฐ™์€ RabbitMQ๋ฅผ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์•ฑ๋งˆ๋‹ค ์กฐ๊ธˆ์”ฉ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋‹ฌ๋ž์Šต๋‹ˆ๋‹ค.
์šฐ์„  ํŠน์ • ์Šค์ผ€์ค„๋ง ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” Batch ์•ฑ์˜ ๊ฒฝ์šฐ ์ •ํ•ด์ง„ ํ 2~3๊ฐœ๋งŒ ๋ฐ”๋ผ๋ณด๋ฉด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” triggers ํ•ญ๋ชฉ์— ๋ชจ๋‹ˆํ„ฐ๋งํ•  ํ ์ด๋ฆ„์„ ์ง์ ‘ ๋ช…์‹œํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: batch-worker-scaledobject
  namespace: default
spec:
  scaleTargetRef:
    name: batch-worker-deployment
  triggers:
    - type: rabbitmq
        metadata:
        protocol: auto
        queueName: foo
        mode: QueueLength
        value: "50"
        activationValue: "1"
    - type: rabbitmq
        metadata:
        protocol: auto
        queueName: bar
        mode: QueueLength
        value: "50"
        activationValue: "1"

์ •๊ทœ์‹ ํ•„ํ„ฐ ์‚ฌ์šฉํ•˜๊ธฐ

๋ฌธ์„œ ํŒŒ์‹ฑ์„ ๋‹ด๋‹นํ•˜๋Š” ์•ฑ๋“ค์€ ์˜ˆ๋ฅผ ๋“ค๋ฉด document- ๋ผ๋Š” Prefix๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ํ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
KEDA์—์„œ๋Š” ์ •๊ทœ์‹์„ ์ด์šฉํ•œ ํ ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: document-worker-scaledobject
  namespace: default
spec:
  scaleTargetRef:
    name: document-worker-deployment
  triggers:
    - type: rabbitmq
      metadata:
        protocol: http # Required for regex usage
        useRegex: "true" # Enable regex pattern matching
        queueName: "document-.*" # Or other regex pattern
        mode: QueueLength
        value: "5"
        activationValue: "1"

๋‹ค๋งŒ, ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” RabbitMQ Management API๋ฅผ ํ†ตํ•œ ์ƒํƒœ ์กฐํšŒ ๋“ฑ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ํ”„๋กœํ† ์ฝœ์„ http๋กœ ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”ผํฌ ํƒ€์ž„ ํŠธ๋ž˜ํ”ฝ ๋Œ€์‘ํ•˜๊ธฐ

์•ž์˜ 2๊ฐ€์ง€ ์ผ€์ด์Šค๋Š” ๊ณ„ํš๋œ ๋‚ด์šฉ์ด์—ˆ์ง€๋งŒ, ๊ทธ ์™ธ์—๋„ KEDA๋ฅผ ํ™œ์šฉํ•  ์ผ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

์ตœ๊ทผ์— ์ฃผ ์‚ฌ์šฉ ์‹œ๊ฐ„๋Œ€(ํ‰์ผ ์˜ค์ „ 8์‹œ ~ ์˜คํ›„ 7์‹œ)์— ์„œ๋น„์Šค ์‘๋‹ต ์†๋„๊ฐ€ ๋А๋ ค์ง„๋‹ค๋Š” ๋ถˆ๋งŒ์ด ์ œ๊ธฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋ฌผ๋ก  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง์„ ๊ฐœ์„ ํ•˜๋Š” ๊ฒƒ๋„ ํ•„์š”ํ•˜์ง€๋งŒ ๋‹น์žฅ์€ ์ง„ํ–‰ํ•˜๊ธฐ ์–ด๋ ค์› ๊ณ  ์ธํ”„๋ผ ๋ ˆ๋ฒจ์—์„œ ์„ ์ œ ๋Œ€์‘์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” CronJob ๋“ฑ์œผ๋กœ ๋ช…์‹œ์  Scaling์„ ํ• ์ง€ ๊ณ ๋ฏผํ–ˆ์ง€๋งŒ, ์กฐ์‚ฌํ•˜๋ฉด์„œ KEDA์˜ Cron Scaler๋ฅผ ์‚ฌ์šฉํ•ด ํŠน์ • ์‹œ๊ฐ„๋Œ€์— Pod ์ˆ˜๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Cron Scaler๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ •ํ•ด์ง„ ์‹œ๊ฐ„๋Œ€์— ์›ํ•˜๋Š” Pod ์ˆ˜๋ฅผ ๋ณด์žฅํ•˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ๋Š” ํ”ผํฌ ํƒ€์ž„ ์ด์ „์— ๋ฆฌ์†Œ์Šค๊ฐ€ ์˜ฌ๋ผ์˜ค๋Š” ์‹œ๊ฐ„๊นŒ์ง€ ๊ฐ์•ˆํ•˜์—ฌ, ์ „ํ›„ 15๋ถ„ ์ •๋„ ์—ฌ์œ ๋ฅผ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ธฐ์กด์˜ HPA์ฒ˜๋Ÿผ CPU ์‚ฌ์šฉ๋ฅ  ๊ธฐ์ค€ Scaling๋„ ๊ฐ™์ด ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์—ฌ ํ•ด๋‹น ์˜ต์…˜๋„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: web-cron-scaledobject
  namespace: default
spec:
  scaleTargetRef:
    name: web-deployment
  triggers:
    - type: cron
      metadata:
        timezone: Asia/Tokyo
        start: "45 7 * * 1-5"
        end: "15 19 * * 1-5"
        desiredReplicas: "30"
    - type: cpu
      metadata:
        type: Utilization
        value: "85"

์—ฌ๊ธฐ์„œ desiredReplicas์˜ ์ˆ˜์น˜๋Š” ๊ณ„์† ์‘๋‹ต ์†๋„๋ฅผ ๋ณด๋ฉด์„œ ์กฐ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ 2~3๋ฒˆ ์ •๋„์˜ ์กฐ์ •์„ ๊ฑฐ์ณ ์ตœ์ ์˜ ์ˆ˜์น˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๋” ๋Š˜๋ฆฌ๋Š” ํ–‰์œ„์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์ ์ธ ๋น„์šฉ ๋ฐœ์ƒ์€ ์–ด์ฉ” ์ˆ˜ ์—†์—ˆ์ง€๋งŒ, ํ™•์‹คํžˆ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜์—ˆ๋‹ค๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

Cron Scaler์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋Š” ์ด ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

์ฃผ์˜์‚ฌํ•ญ

  1. Argo CD๋กœ KEDA๋ฅผ ์„ค์น˜ํ•  ๋•Œ ๋ช‡ ๊ฐ€์ง€ ์ด์Šˆ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
    • CRD ๋ฌธ์ œ๋กœ Server-side Apply๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ผ๋ถ€ OutOfSync ์ƒํƒœ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ignoreDifferences ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
  2. KEDA๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ HPA๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • KEDA๊ฐ€ ์ž์ฒด์ ์œผ๋กœ HPA๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์ถฉ๋Œ์ด๋‚˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ด๋Š” HPA์™€ ๋™์ผํ•œ๋ฐ, KEDA๋ฅผ ํ™œ์„ฑํ™”ํ–ˆ๋‹ค๋ฉด Deployment์˜ replicas ๊ฐ’์„ ๋น„์›Œ ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • HPA๊ฐ€ ์กฐ์ •ํ•˜๋ ค๋Š” ๊ฐ’๊ณผ replicas ๊ฐ’์ด ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
    • ์ด๋ฅผ ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ํ™•์ธํ•˜๋ ค๋ฉด replicas๋ฅผ ์„ค์ •ํ•ด ๋‘๊ณ , KEDA์—์„œ Zero scaling, ์ฆ‰ ์ตœ์†Œ๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•ด ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.
      ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด KEDA๊ฐ€ ๊ณ„์† Pod๋ฅผ ์ข…๋ฃŒ์‹œํ‚ค๊ณ  Deployment๋Š” ๊ณ„์† ๋ณต๊ตฌ์‹œํ‚ค๋Š” ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ

์ด๋ ‡๊ฒŒ KEDA๋ฅผ ๋„์ž…ํ•˜์—ฌ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์˜ ๋™์  ์Šค์ผ€์ผ๋ง ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ณ , ์ถ”๊ฐ€๋กœ ์„œ๋น„์Šค ์•ˆ์ •์„ฑ๋„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
KEDA๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ 2๊ฐœ์˜ ๊ธฐ๋Šฅ ์™ธ์—๋„ ๋งŽ์€ ๊ธฐ๋Šฅ๊ณผ ์ด๋ฒคํŠธ ์†Œ์Šค๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋”์šฑ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ถ”ํ›„์—๋Š” Cold start๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์•ฑ์— ๋Œ€ํ•ด Scale-to-zero ๊ฐœ๋…์„ ์ ์šฉํ•˜์—ฌ ๋”์šฑ ํšจ์œจ์ ์ธ ์ž์› ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ํ•œ ๋ฒˆ ์จ ๋ณด๊ณ  ์‹ถ์—ˆ๋˜ ๋„๊ตฌ๋ผ ๋งŒ์กฑ๋„๊ฐ€ ์‚ด์ง ๋” ๋†’์•˜๋˜ ๊ฒƒ์€ ๋ค์ž…๋‹ˆ๋‹ค ๐Ÿ˜†

๋‹ค๋งŒ ์•ž์œผ๋กœ๋„ Scaling ์˜ต์…˜์„ ๊ณ„์† ์กฐ์ •ํ•ด ๋‚˜๊ฐ€๋ฉฐ ์ตœ์ ์˜ ์„ค์ •์„ ์ฐพ๊ณ , ๋˜ํ•œ KEDA Scaling ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์ž‘์—…๋„ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
(ํ˜„์‹œ์  ๊ฐ€์žฅ ํ™•์‹คํ•œ ๊ฒƒ์€ Deployment์˜ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)

์•ž์œผ๋กœ๋„ KEDA ์™ธ์— ์ ์šฉํ•ด ๋ณด๊ณ  ์‹ถ์€ ๋„๊ตฌ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์•ˆ์ •์„ฑ์„ ์ƒ๊ฐํ•˜๋ฉด์„œ ์ ์  ๋ฐœ์ „๋œ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ด ๋‚˜๊ฐ€๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ