6 minute read

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ๋Š” ๋กœ์ปฌ Kubernetes ํ™˜๊ฒฝ์—์„œ Knative๋ฅผ ์…‹์—… ํ•ด๋ณด์•˜๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” ๊ทธ๋•Œ ๋””ํ”Œ๋กœ์ด ํ•œ ๊ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ณ ์ž ํ•œ๋‹ค.

Architecture

Knative๋Š” ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๊ฐ์ž์˜ ์—ญํ• ์„ ๋งก์•„ ๋™์ž‘ํ•˜๋Š” Serverless ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ํ•˜๋Š”์ง€ ์•Œ์•„๋‘๋ฉด ์žฅ์• ๊ฐ€ ๋ฐœ์ƒ ํ–ˆ์„ ๋•Œ, ์‰ฝ๊ฒŒ ๋””๋ฒ„๊ทธ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

Activator

Knative๋Š” ์„œ๋ฒ„๋ฆฌ์Šค์˜ ์ปจ์…‰์„ ์ œ๋Œ€๋กœ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด โ€œscale-to-zeroโ€๋ฅผ ์ง€์› ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํŠธ๋ž˜ํ”ฝ์ด๋‚˜ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์ด ์—†์„ ๋•Œ๋Š” ์›Œํฌ๋กœ๋“œ๋ฅผ โ€œzeroโ€ ์ˆ˜์ค€๊นŒ์ง€ ๊บผ๋‘๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ scale-to-zero๊ฐ€ ๋œ ์ƒํƒœ์—์„œ ์ฒซ ํŠธ๋ž˜ํ”ฝ์ด ๋“ค์–ด์˜ค๋ฉด, ๊ทธ ํŠธ๋ž˜ํ”ฝ์€ ์„œ๋น„์Šค๋กœ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Activator์—๊ฒŒ ์ „๋‹ฌ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด, Activator๋Š” ํ•ด๋‹น ํŠธ๋ž˜ํ”ฝ์„ Autoscaler(๋’ค์— ๋‚˜์˜ด)์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ , Autoscaler๊ฐ€ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  ํ–ˆ๋˜ Knative์˜ ํƒ€๊นƒ Service๋ฅผ scale-up ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์š”์ฒญ์ด ๋“œ๋ž ๋˜๋Š”๊ฑด ์•„๋‹๊นŒ?

์ €๋Š” zero-scale ์ƒํ™ฉ์—์„œ ์ „๋‹ฌ๋œ ์ฒซ ํŠธ๋ž˜ํ”ฝ์ด ๋“œ๋ž ๋˜๋Š”๊ฒŒ ์•„๋‹๊นŒ ๊ฑฑ์ •์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋ฆฌ Serverless ์•ฑ์ด๋ผ๊ณ  ํ•ด๋„, ์ดˆ๊ธฐ start-up์— ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๊ธฐ ๋งˆ๋ จ์ด๋‹ˆ๊นŒ์š”! ๐Ÿค”

Knative์˜ Activator๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ โ€œํ(Queue)โ€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ 0-to-1 ์ƒํ™ฉ์—์„œ ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์„ ์ผ๋ถ€ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

์ด โ€œ์š”์ฒญ ๋ฒ„ํผ๋งโ€œ์€ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด pod์ด ์‹œ์ž‘ํ•  ๋•Œ๊นŒ์ง€ ์š”์ฒญ์„ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋ž˜ํ”ฝ ๋ฒ„์ŠคํŠธ ์ƒํ™ฉ์— ๋Œ€์‘

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ ์š”์ฒญ ๋ฒ„ํผ๋ง์€ ํŠธ๋ž˜ํ”ฝ์ด ๊ธ‰๊ฒฉํžˆ ์ฆ๊ฐ€ํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ ๋ฒ„์ŠคํŠธ(traffic burst) ์ƒํ™ฉ์—์„œ๋„ ์ด๋ค„์ง„๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ scale๋กœ ๊ฐ๋‹นํ•˜๊ธฐ ์–ด๋ ค์šด ํฐ ํŠธ๋ž˜ํ”ฝ์ด ์ˆœ๊ฐ„์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด, ์š”์ฒญ์„ ์ฆ‰์‹œ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋•Œ ํ•ด๋‹น ์š”์ฒญ์„ Activator๊ฐ€ ๋ฒ„ํผ๋ง ํ•˜๊ณ , ์ดํ›„ pod์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ถ€ํ•˜ ๋ถ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  Activator๋Š” ๋‹จ์ˆœํ•œ ์š”์ฒญ ํ ์—ญํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ถ”๊ฐ€์ ์ธ Pod์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด, ์ž๋™์œผ๋กœ ์ƒˆ๋กœ์šด Pod์„ ์ƒ์„ฑํ•˜๋„๋ก ํŠธ๋ฆฌ๊ฑฐ ํ•˜๋Š” ์—ญํ• ๋„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๊ณผ์ •์—์„œ Knative์˜ Autoscaler์™€ ํ˜‘๋ ฅํ•ด scale-up์„ ์ˆ˜ํ–‰ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฐ’์€ target-burst-capacity์˜ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ธฐ๋ณธ๊ฐ’์€ โ€œ200โ€ ์ž…๋‹ˆ๋‹ค. ์ „์—ญ์ ์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๊ณ , Revision ๋‹จ์œ„๋กœ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. [doc]

Autoscaler

Knative์˜ ์„œ๋น„์Šค ํŠธ๋ž˜ํ”ฝ์„ ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ Pod ๊ฐฏ์ˆ˜๋ฅผ ์ž๋™์œผ๋กœ ์กฐ์ • ํ•ฉ๋‹ˆ๋‹ค.

์œ„์—์„œ ์†Œ๊ฐœํ•œ scale-to-zero๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ”๋กœ ์ด ๋…€์„ ์ž…๋‹ˆ๋‹ค.

Autoscaler๋Š” Pod์˜ ํŠธ๋ž˜ํ”ฝ์„ ๊ณ„์† ๋ชจ๋‹ˆํ„ฐ๋ง ํ•˜๋ฉด์„œ, scale-up๊ณผ scale-down์„ ์ˆ˜ํ–‰ ํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š” Autoscaler๋Š” ํ•ญ์ƒ Activator์— ์˜ํ•ด ํŠธ๋ฆฌ๊ฑฐ ๋˜๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ, ๊ทธ๋ ‡์ง€ ์•Š๊ณ  ์Šค์Šค๋กœ ๋…๋ฆฝ์ ์œผ๋กœ auto-scaling์„ ์ˆ˜ํ–‰ ํ•ฉ๋‹ˆ๋‹ค.

Activator์™€ ํ˜‘๋ ฅ

๋‹จ, Autoscaler๊ฐ€ Activator์˜ ๋„์›€์ด ํ•„์š”ํ•œ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค! ๋ฐ”๋กœ 0-to-1 ์ƒํ™ฉ์œผ๋กœ ๊ทธ๋™์•ˆ pod์ด ์ „ํ˜€ ์—†์–ด ํŠธ๋ž˜ํ”ฝ์ด ๋ชจ๋‹ˆํ„ฐ๋ง ๋˜์ง€ ์•Š์•˜๊ณ , ์ด๋•Œ๋Š” Activator์˜ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š” ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์•ž์—์„œ ์‚ดํŽด๋ณธ ํŠธ๋ž˜ํ”ฝ ๋ฒ„์ŠคํŠธ๊ฐ€ ๋ฐœ์ƒ ํ•˜๋ฉด, Activator๋Š” ์ž„์‹œ ๋ฒ„ํผ์˜ ์—ญํ• ๋งŒ ์ˆ˜ํ–‰ํ•˜์ง€, Pod ํ™•์žฅ์„ ์ง์ ‘ ํŠธ๋ฆฌ๊ฑฐ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํŠธ๋ž˜ํ”ฝ ๋ฒ„์ŠคํŠธ๋ฅผ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•œ scale-up์€ Autoscaler๊ฐ€ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Autoscaler HPA

Knative์—์„œ๋Š” 2๊ฐ€์ง€์˜ autosacler๋ฅผ ์ง€์› ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์•„๊นŒ ์‚ดํŽด๋ณธ ํŠธ๋ž˜ํ”ฝ ๊ธฐ๋ฐ˜์˜ autoscaler, ๊ทธ๋ฆฌ๊ณ  ํ•˜๋‚˜๋Š” Kubernetes์˜ HPA๋ฅผ ํ™œ์šฉํ•˜๋Š” autoscaler ์ž…๋‹ˆ๋‹ค.

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: my-service
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/metric: "concurrency"  # ๋™์‹œ ์š”์ฒญ ์ˆ˜ ๊ธฐ๋ฐ˜ ์Šค์ผ€์ผ๋ง
        autoscaling.knative.dev/target: "10"  # Pod๋‹น ์ตœ๋Œ€ ๋™์‹œ ์š”์ฒญ 10๊ฐœ
        autoscaling.knative.dev/minScale: "0"  # ํ•„์š” ์—†์œผ๋ฉด 0๊ฐœ๋กœ ์ค„์ด๊ธฐ (Scale-to-Zero)
        autoscaling.knative.dev/maxScale: "10"  # ์ตœ๋Œ€ 10๊ฐœ๊นŒ์ง€ ํ™•์žฅ
      ---
      annotations:
        autoscaling.knative.dev/class: "hpa.autoscaling.knative.dev"  # HPA ๊ธฐ๋ฐ˜ ์Šค์ผ€์ผ๋ง
        autoscaling.knative.dev/metric: "cpu"  # CPU ๊ธฐ๋ฐ˜ ์Šค์ผ€์ผ๋ง
        autoscaling.knative.dev/target: "75"  # CPU ์‚ฌ์šฉ๋Ÿ‰ 75% ๋„๋‹ฌ ์‹œ ํ™•์žฅ
        autoscaling.knative.dev/minScale: "1"  # ์ตœ์†Œ Pod ๊ฐœ์ˆ˜ 1๊ฐœ ์œ ์ง€
        autoscaling.knative.dev/maxScale: "10"  # ์ตœ๋Œ€ 10๊ฐœ๊นŒ์ง€ ํ™•์žฅ

autoscaler HPA๋Š” CPU ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๊ธฐ์ค€์œผ๋กœ pod ๊ฐฏ์ˆ˜๋ฅผ ์กฐ์ • ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  scale-to-zero๋ฅผ ์ง€์› ํ•˜์ง€ ์•Š๊ณ , ์ตœ์†Œ 1๊ฐœ์˜ Pod์ด ์œ ์ง€ ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

HPA ๊ธฐ๋ฐ˜์˜ ์ด autoscaler๋Š” ํŠธ๋ž˜ํ”ฝ ๊ธฐ๋ฐ˜์˜ autoscaler ๋ณด๋‹ค ํ™•์žฅ์ด ๋Š๋ฆฌ๊ฒŒ ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘ํ•˜๋Š” ์ฃผ๊ธฐ์™€ ๊ด€๋ จ์ด ์žˆ๋Š”๋ฐ์š”.

  • Kubernetes์˜ metric-server์˜ ์ง€ํ‘œ ์ˆ˜์ง‘ ์ฃผ๊ธฐ
    • ๊ธฐ๋ณธ๊ฐ’์€ โ€œ30์ดˆโ€ ์ž…๋‹ˆ๋‹ค.
    • Kubernetes ๊ธฐ๋ณธ ์ปดํฌ๋„ŒํŠธ ์ž…๋‹ˆ๋‹ค.
    • ํ•ด๋‹น Pod์— --metric-resolution=10s ๋ช…๋ น์–ด๋กœ ์ˆ˜์ง‘ ์ฃผ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • HPA๊ฐ€ ํ™•์žฅ์„ ๊ฒฐ์ •ํ•˜๋Š” ์ฃผ๊ธฐ
    • ๊ธฐ๋ณธ๊ฐ’์€ โ€œ15์ดˆโ€ ์ž…๋‹ˆ๋‹ค.
    • ์ด๊ฒƒ์€ Kubernetes HPA์˜ ์ปดํฌ๋„ŒํŠธ ์ž…๋‹ˆ๋‹ค.
    • metric-server์—์„œ CPU/๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ๊ฐ€์ ธ์™€์„œ ํ™•์žฅ ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จ ํ•ฉ๋‹ˆ๋‹ค.
    • --horizontal-pod-autoscaler-sync-period=5s ๋ช…๋ น์–ด๋กœ ์ˆ˜์ง‘ ์ฃผ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Controller

Knative์˜ ๋ฆฌ์†Œ์Šค ์ „๋ฐ˜์„ ๊ด€๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ ์ž…๋‹ˆ๋‹ค. Knative์˜ Service์™€ Configuration, Revision ๋“ฑ์„ ๊ด€๋ฆฌ ํ•ฉ๋‹ˆ๋‹ค.

ksvc์— ๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ•œ ๊ฒƒ์„ ๊ฐ์ง€ํ•˜๊ณ , ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒˆ๋กœ์šด Revision์„ ์ƒ์„ฑ ๋ฐ ์‹ ๊ทœ pod์ด ์ƒ์„ฑ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

Webhook

์‚ฌ์šฉ์ž๊ฐ€ kubectl create ksvc ...๋ฅผ ํ†ตํ•ด Knative ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ์ด ์š”์ฒญ์€ Kubernetes API ์„œ๋ฒ„๋กœ ์ „๋‹ฌ ๋ฉ๋‹ˆ๋‹ค.

API ์„œ๋ฒ„๋Š” โ€œAdmission Webhookโ€์„ ํ˜ธ์ถœํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฒ€์ฆ & ๋ณ€ํ™˜ํ•˜๋„๋ก ํ•˜๋Š”๋ฐ์š”. ์ด๋•Œ, Knative์˜ webhook ์„œ๋น„์Šค๊ฐ€ ์ด ์š”์ฒญ์„ ๋ฐ›์•„ ์ฒ˜๋ฆฌ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋Š” ์—ญํ• ์„ 2๊ฐ€์ง€ ์ธ๋ฐ,

  • Validation Webhook
    • ๋ฆฌ์†Œ์Šค๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •์˜ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ž˜๋ชป๋œ ์„ค์ •์ด๋ผ๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ๊ฑฐ๋ถ€ ํ•ฉ๋‹ˆ๋‹ค.
  • Mutation Webhook
    • ์„ค์ •์ด ๋ถ€์กฑํ•˜๊ฒŒ ๋“ค์–ด์™”๋‹ค๋ฉด, ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •์„ ์ฑ„์›Œ ์ค๋‹ˆ๋‹ค.

Kubernetes Admission Webhook

์˜ˆ์ „์— CKA ๊ณต๋ถ€ํ•  ๋•Œ ๋ดค๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ, ์ด๋ฒˆ๋ฐ ๋‹ค์‹œ ๋ณด๋‹ˆ ์ƒˆ๋กญ๊ฒŒ ๋Š๊ปด์กŒ๋‹ค ใ…‹ใ…‹

์‚ฌ์šฉ์ž๊ฐ€ kubectl create/apply ...๋กœ ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ์„ Kubernetes API์— ์š”์ฒญํ•˜๋ฉด, Kubernetes์˜ Admission Webhook์ด ์š”์ฒญ์„ ๊ฐ€๋กœ ์ฑ„๊ณ , ๊ฒ€์ฆ๊ณผ ๋ณ€ํ™˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ฆ์ด ํ†ต๊ณผ ํ•˜๋ฉด, API ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ etcd์— ์ €์žฅํ•˜๊ณ , ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์‹ค์ œ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ