์ŠคํŒŸ VM


์ด ํŽ˜์ด์ง€์—์„œ๋Š” Spot VM์˜ ์ •์˜์™€ Spot VM์ด Google Kubernetes Engine(GKE)์—์„œ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. Spot VM ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ Spot VM ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

GKE์˜ Spot VM ๊ฐœ์š”

์ŠคํŒŸ VM์€ ํ‘œ์ค€ Compute Engine VM๋ณด๋‹ค ์ €๋ ดํ•˜๊ณ  ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๋Š” Compute Engine ๊ฐ€์ƒ ๋จธ์‹ (VM) ์ธ์Šคํ„ด์Šค์ž…๋‹ˆ๋‹ค. ์ŠคํŒŸ VM์€ ํ‘œ์ค€ VM๊ณผ ๋™์ผํ•œ ๋จธ์‹  ์œ ํ˜• ๋ฐ ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ ๋…ธ๋“œ ํ’€์—์„œ Spot VM์„ ์‚ฌ์šฉํ•˜๋ฉด Spot VM์˜ ์ž„์‹œ ํŠน์„ฑ์œผ๋กœ ์ธํ•œ ์ค‘๋‹จ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํ…Œ์ดํŠธ๋ฆฌ์Šค(Stateless), ์ผ๊ด„ ๋˜๋Š” ๋‚ด๊ฒฐํ•จ์„ฑ ์›Œํฌ๋กœ๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Compute Engine์—์„œ ํ‘œ์ค€ VM์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•„์š”ํ•  ๋•Œ๊นŒ์ง€ Spot VM์€ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Spot VM์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Compute Engine ๋ฌธ์„œ์˜ Spot VM์„ ์ฐธ์กฐํ•˜์„ธ์š”.

Spot VM์˜ ์ด์ 

Spot VM ๋ฐ ์„ ์ ํ˜• VM์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งŽ์€ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

24์‹œ๊ฐ„ ํ›„ ๋งŒ๋ฃŒ๋˜๋Š” ์„ ์ ํ˜• VM๊ณผ ๋‹ฌ๋ฆฌ Spot VM์€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์ด ์—†์Šต๋‹ˆ๋‹ค. Spot VM์€ Compute Engine์—์„œ ๋‹ค๋ฅธ ๊ณณ์— ๋ฆฌ์†Œ์Šค๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

GKE์—์„œ Spot VM ์ž‘๋™ ๋ฐฉ์‹

Spot VM์ด ์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋˜๋Š” ๋…ธ๋“œ ํ’€์„ ๋งŒ๋“ค๋ฉด GKE๋Š” ๊ด€๋ฆฌํ˜• ์ธ์Šคํ„ด์Šค ๊ทธ๋ฃน(MIG)์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ๊ธฐ๋ณธ Compute Engine Spot VM์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Spot VM์„ ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œ๋Š” ํ‘œ์ค€ GKE ๋…ธ๋“œ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜์ง€๋งŒ ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Spot VM์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ํ‘œ์ค€ VM์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Compute Engine์€ ๋‹ค๋ฅธ ์œ„์น˜์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก Spot VM์„ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

Spot VM์˜ ์ข…๋ฃŒ ๋ฐ ๋‹จ๊ณ„์  ์ข…๋ฃŒ

Compute Engine์ด Spot VM์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ํšŒ์ˆ˜ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ข…๋ฃŒ ์•Œ๋ฆผ์ด GKE๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. Spot VM์€ ์ข…๋ฃŒ ์•Œ๋ฆผ์„ ๋ฐ›์€ ํ›„ 30์ดˆ ๋™์•ˆ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋Š” ๋‹จ๊ณ„์  ๋…ธ๋“œ ์ข…๋ฃŒ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. kubelet์€ ์ข…๋ฃŒ ์•Œ๋ฆผ์„ ํ™•์ธํ•˜๊ณ  ๋…ธ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ ํฌ๋“œ๋ฅผ ๋‹จ๊ณ„์ ์œผ๋กœ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ํฌ๋“œ๊ฐ€ ๋ฐฐํฌ์™€ ๊ฐ™์€ ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ์˜ ์ผ๋ถ€์ธ ๊ฒฝ์šฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ข…๋ฃŒ๋œ ํฌ๋“œ๋ฅผ ๋Œ€์ฒดํ•  ์ƒˆ ํฌ๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

kubelet์€ ์ตœ์ƒ์˜ ๋ฐฉ์‹์œผ๋กœ ๋น„์‹œ์Šคํ…œ ํฌ๋“œ์— 15์ดˆ์˜ ๋‹จ๊ณ„์  ์ข…๋ฃŒ ๊ธฐ๊ฐ„์„ ๋ถ€์—ฌํ•˜๋ฉฐ ์ดํ›„ ์‹œ์Šคํ…œ ํฌ๋“œ(system-cluster-critical ๋˜๋Š” system-node-critical priorityClasses ๊ฐ€์ง„)๋Š” 15์ดˆ ๋™์•ˆ ๋‹จ๊ณ„์ ์œผ๋กœ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. ๋‹จ๊ณ„์  ๋…ธ๋“œ ์ข…๋ฃŒ ์ค‘์— kubelet์€ ํฌ๋“œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  Failed ๋‹จ๊ณ„์™€ Terminated ์ด์œ ๋ฅผ ์ข…๋ฃŒ๋œ ํฌ๋“œ์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

ํฌ๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ terminationGracePeriodSeconds ํ•„๋“œ์— 15์ดˆ๋ณด๋‹ค ํฐ ๊ฐ’์„ ์ง€์ •ํ•˜๋”๋ผ๋„ ์ข…๋ฃŒ ์•Œ๋ฆผ ํ›„ 30์ดˆ๊ฐ€ ์ง€๋‚˜๋ฉด VM์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

์ข…๋ฃŒ๋œ ํฌ๋“œ ์ˆ˜๊ฐ€ ๋…ธ๋“œ 100๊ฐœ ๋ฏธ๋งŒ์ธ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฒฝ์šฐ 1,000๊ฐœ, ๋…ธ๋“œ ์ˆ˜๊ฐ€ 100๊ฐœ ์ด์ƒ์ธ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฒฝ์šฐ 5,000๊ฐœ์˜ ๊ธฐ์ค€์ ์— ๋„๋‹ฌํ•˜๋ฉด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ํฌ๋“œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข…๋ฃŒ๋œ ํฌ๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  kubectl get pods --all-namespaces | grep -i NodeShutdown | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n
  kubectl get pods --all-namespaces | grep -i Terminated | awk '{print $1, $2}' | xargs -n2 kubectl delete pod -n

์ŠคํŒŸ VM์—์„œ ์›Œํฌ๋กœ๋“œ ์˜ˆ์•ฝ

GKE๋Š” cloud.google.com/gke-spot=true ๋ฐ cloud.google.com/gke-provisioning=spot(GKE ๋ฒ„์ „ 1.25.5-gke.2500 ์ด์ƒ์„ ์‹คํ–‰ํ•˜๋Š” ๋…ธ๋“œ) ๋ผ๋ฒจ์„ ์ž๋™์œผ๋กœ ์ŠคํŒŸ VM์„ ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํฌ๋“œ ์‚ฌ์–‘์˜ nodeSelector ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ŠคํŒŸ VM์„ ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œ์—์„œ ํŠน์ • ํฌ๋“œ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” cloud.google.com/gke-spot ๋ผ๋ฒจ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

apiVersion: v1
kind: Pod
spec:
  nodeSelector:
    cloud.google.com/gke-spot: "true"

๋˜๋Š” ๋‹ค์Œ ์˜ˆ์‹œ์™€ ๊ฐ™์ด ๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GKE๊ฐ€ ์ŠคํŒŸ VM์—์„œ ํฌ๋“œ๋ฅผ ์˜ˆ์•ฝํ•˜๋„๋ก ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

apiVersion: v1
kind: Pod
spec:
...
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: cloud.google.com/gke-spot
            operator: In
            values:
            - "true"
...

๋˜ํ•œ nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution์„ ์‚ฌ์šฉํ•˜์—ฌ GKE๊ฐ€ Spot VM ์‚ฌ์šฉ ๋…ธ๋“œ์— ํฌ๋“œ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋„๋ก ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹ ์— GKE๊ฐ€ ํ‘œ์ค€ VM์„ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด ๋…ธ๋“œ์— ํฌ๋“œ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ Spot VM์„ ์šฐ์„  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ์•ฝ์— taint ๋ฐ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration) ์‚ฌ์šฉ

์‹œ์Šคํ…œ ์ค‘๋‹จ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋…ธ๋“œ taint๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ GKE๊ฐ€ ์ค‘์š”ํ•œ ์›Œํฌ๋กœ๋“œ๋ฅผ Spot VM์— ์˜ˆ์•ฝํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Spot VM์„ ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œ๋ฅผ taintํ•˜๋ฉด GKE๋Š” ํ•ด๋‹น ๋…ธ๋“œ์— ๋Œ€ํ•œ ํ•ด๋‹น ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration)์ด ์žˆ๋Š” ํฌ๋“œ๋งŒ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ taint๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ‘œ์ค€ Compute Engine VM์„ ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œ ํ’€์ด ํด๋Ÿฌ์Šคํ„ฐ์— ํ•˜๋‚˜ ์ด์ƒ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ VM์„ ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œ ํ’€์€ GKE๊ฐ€ DNS์™€ ๊ฐ™์€ ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ์•ˆ์ •์ ์ธ ์œ„์น˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Spot VM์— ๋…ธ๋“œ taint๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Spot VM์— taint ๋ฐ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration) ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

GPU ๋…ธ๋“œ ํ’€์— Spot VM ์‚ฌ์šฉ

Spot VM์€ GPU ์‚ฌ์šฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ GPU ๋…ธ๋“œ ํ’€์„ ๋งŒ๋“ค๋ฉด GKE๊ฐ€ ์ž๋™์œผ๋กœ nvidia.com/gpu=present:NoSchedule taint๋ฅผ ์ƒˆ ๋…ธ๋“œ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration)์ด ์žˆ๋Š” ํฌ๋“œ๋งŒ ์ด๋Ÿฌํ•œ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GKE๋Š” GPU๋ฅผ ์š”์ฒญํ•˜๋Š” ํฌ๋“œ์— ์ด ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration)์„ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Spot VM์„ ์‚ฌ์šฉํ•˜๋Š” GPU ๋…ธ๋“œ ํ’€์„ ๋งŒ๋“ค๋ ค๋ฉด ๋จผ์ € ํ‘œ์ค€ VM์„ ์‚ฌ์šฉํ•˜๋Š” ๋น„GPU ๋…ธ๋“œ ํ’€์ด ํด๋Ÿฌ์Šคํ„ฐ์— ํ•˜๋‚˜ ์ด์ƒ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์— Spot VM์„ ์‚ฌ์šฉํ•˜๋Š” GPU ๋…ธ๋“œ ํ’€๋งŒ ์žˆ๋Š” ๊ฒฝ์šฐ GKE๋Š” ํ•ด๋‹น ๋…ธ๋“œ์— nvidia.com/gpu=present:NoSchedule taint๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ GKE๋Š” Spot VM์„ ์‚ฌ์šฉํ•˜๋Š” GPU ๋…ธ๋“œ ํ’€์— ์‹œ์Šคํ…œ ์›Œํฌ๋กœ๋“œ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GPU ๋…ธ๋“œ๊ฐ€ ๋น„GPU ๋…ธ๋“œ๋ณด๋‹ค ์ปดํ“จํŒ… ๋น„์šฉ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— Spot VM์œผ๋กœ ์ธํ•ด ์ค‘๋‹จ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ฆฌ์†Œ์Šค ์†Œ๋น„๋ฅผ ๋Š˜๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ ์ž๋™ ํ™•์žฅ ์ฒ˜๋ฆฌ ๋ฐ ๋…ธ๋“œ ์ž๋™ ํ”„๋กœ๋น„์ €๋‹

ํด๋Ÿฌ์Šคํ„ฐ ์ž๋™ ํ™•์žฅ ์ฒ˜๋ฆฌ ๋ฐ ๋…ธ๋“œ ์ž๋™ ํ”„๋กœ๋น„์ €๋‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์›Œํฌ๋กœ๋“œ์˜ ์š”๊ตฌ์— ๋”ฐ๋ผ ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ ๋…ธ๋“œ ํ’€์„ ์ž๋™์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ ์ž๋™ ํ™•์žฅ ์ฒ˜๋ฆฌ์™€ ๋…ธ๋“œ ์ž๋™ ํ”„๋กœ๋น„์ €๋‹์€ ๋ชจ๋‘ Spot VM์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

Spot VM ๋ฐ ๋…ธ๋“œ ์ž๋™ ํ”„๋กœ๋น„์ €๋‹

๋…ธ๋“œ ์ž๋™ ํ”„๋กœ๋น„์ €๋‹์€ ์›Œํฌ๋กœ๋“œ์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋„๋ก ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ ํ’€์„ ์ž๋™์œผ๋กœ ๋งŒ๋“ค๊ณ  ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. nodeSelector ๋˜๋Š” ๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Spot VM์ด ํ•„์š”ํ•œ ์›Œํฌ๋กœ๋“œ๋ฅผ ์˜ˆ์•ฝํ•˜๋ฉด ๋…ธ๋“œ ์ž๋™ ํ”„๋กœ๋น„์ €๋‹์ด ์›Œํฌ๋กœ๋“œ์˜ ํฌ๋“œ๋ฅผ ์ˆ˜์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ ๋…ธ๋“œ ํ’€์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. GKE๋Š” ์ƒˆ ๋…ธ๋“œ ํ’€์˜ ๋…ธ๋“œ์— cloud.google.com/gke-spot=true:NoSchedule taint๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration)์ด ์žˆ๋Š” ํฌ๋“œ๋งŒ ์ด๋Ÿฌํ•œ ๋…ธ๋“œ ํ’€์˜ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GKE๊ฐ€ Spot VM์— ํฌ๋“œ๋ฅผ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐฐํฌ์— ํ•ด๋‹น ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration)์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

   tolerations:
   - key: cloud.google.com/gke-spot
     operator: Equal
     value: "true"
     effect: NoSchedule

ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration)๊ณผ nodeSelector ๋˜๋Š” ๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ ๊ทœ์น™์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜์—ฌ GKE๋งŒ Spot VM์—์„œ ํฌ๋“œ๋ฅผ ์˜ˆ์•ฝํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration)๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์›Œํฌ๋กœ๋“œ๋ฅผ ์˜ˆ์•ฝํ•˜๋ฉด GKE๋Š” Spot VM ๋˜๋Š” ์šฉ๋Ÿ‰์ด ์žˆ๋Š” ๊ธฐ์กด Standard VM์— ํฌ๋“œ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ŠคํŒŸ VM์— ์›Œํฌ๋กœ๋“œ๋ฅผ ์˜ˆ์•ฝํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration) ์™ธ์—๋„ nodeSelector ๋˜๋Š” ๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ŠคํŒŸ VM์—์„œ ์›Œํฌ๋กœ๋“œ ์˜ˆ์•ฝ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

Spot VM ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ž๋™ ํ™•์žฅ ์ฒ˜๋ฆฌ

ํด๋Ÿฌ์Šคํ„ฐ ์ž๋™ ํ™•์žฅ ์ฒ˜๋ฆฌ๋Š” ํ•„์š”์— ๋”ฐ๋ผ ๋…ธ๋“œ ํ’€์˜ ๋…ธ๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ  ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์ŠคํŒŸ VM์„ ์šฐ์„ ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ํด๋Ÿฌ์Šคํ„ฐ ์ž๋™ ํ™•์žฅ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ŠคํŒŸ VM ๋ฐ ํด๋Ÿฌ์Šคํ„ฐ ์ž๋™ ํ™•์žฅ ์ฒ˜๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๊ธฐ๋ณธ ์ •์ฑ…

GKE ๋ฒ„์ „ 1.24.1-gke.800๋ถ€ํ„ฐ ์ž๋™ ํ™•์žฅ ์ฒ˜๋ฆฌ ์œ„์น˜ ์ •์ฑ…์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๊ธฐ๋ณธ ์œ„์น˜ ์ •์ฑ…์ด ANY๋กœ ์„ค์ •๋˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ์ž๋™ ํ™•์žฅ ์ฒ˜๋ฆฌ๊ฐ€ ์ŠคํŒŸ VM ๋…ธ๋“œ ํ’€์„ ํ”„๋กœ๋น„์ €๋‹ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ •์ฑ…์—์„œ Spot VM์€ ์„ ์ ๋  ์œ„ํ—˜์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ VM ์œ ํ˜•์˜ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ํด๋Ÿฌ์Šคํ„ฐ ์ž๋™ ํ™•์žฅ ์ฒ˜๋ฆฌ ๋ฐฐํฌ ์ •์ฑ…์€ BALANCED์ž…๋‹ˆ๋‹ค.

์ŠคํŒŸ VM์„ ์‚ฌ์šฉํ•˜์—ฌ Standard ๋…ธ๋“œ ํ’€ ์—…๊ทธ๋ ˆ์ด๋“œ

์ŠคํŒŸ VM์„ ์‚ฌ์šฉํ•˜๋Š” Standard ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ ํ’€์ด ์ผ์‹œ ๊ธ‰์ฆ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ GKE๋Š” ์ŠคํŒŸ VM์œผ๋กœ ์ผ์‹œ ๊ธ‰์ฆ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ GKE๋Š” ์ŠคํŒŸ VM์—์„œ ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ธฐ์กด ๋…ธ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜๊ณ  ๋“œ๋ ˆ์ด๋‹ํ•˜๊ธฐ ์ „์— ์ŠคํŒŸ VM์ด ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ผ์‹œ ๊ธ‰์ฆ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Kubernetes ๋™์ž‘ ์ˆ˜์ •

GKE์—์„œ Spot VM์„ ์‚ฌ์šฉํ•˜๋ฉด Kubernetes๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๋ณด์ฆ ๋ฐ ์ œ์•ฝ์กฐ๊ฑด์ด ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค.

  • Spot VM ํšŒ์ˆ˜๋Š” ๋น„์ž๋ฐœ์ ์ด๋ฉฐ PodDisruptionBudgets์ด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ๋œ PodDisruptionBudget๋ณด๋‹ค ๋” ๋†’์€ ๋น„๊ฐ€์šฉ์„ฑ์„ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Spot VM ๊ถŒ์žฅ์‚ฌํ•ญ

Spot VM์„ ์‚ฌ์šฉํ•˜๋Š” ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•  ๋•Œ ๋‹ค์Œ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹ฌ๊ฐํ•œ ์ค‘๋‹จ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Spot VM์—๋Š” ๊ฐ€์šฉ์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. GKE๋Š” Spot VM์˜ ์ผ๋ถ€ ๋˜๋Š” ์ „๋ถ€๋ฅผ ์–ธ์ œ๋“ ์ง€ ํšŒ์ˆ˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ์ƒˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์ ์„ ๋ณด์žฅํ•˜์ง€ ์•Š๊ณ  ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Spot VM์ด ์—†์–ด๋„ ์›Œํฌ๋กœ๋“œ ๋ฐ ์ž‘์—…์ด ์ฒ˜๋ฆฌ๋˜๋„๋ก ํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์— Spot VM์„ ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œํ’€๊ณผ ํ‘œ์ค€ Compute Engine VM์„ ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œ ํ’€์ด ํ˜ผํ•ฉ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Spot VM์„ ์‚ฌ์šฉํ•˜๋Š” GPU ๋…ธ๋“œ ํ’€์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ํด๋Ÿฌ์Šคํ„ฐ์— ํ‘œ์ค€ VM์„ ์‚ฌ์šฉํ•˜๋Š” GPU๊ฐ€ ์—†๋Š” ๋…ธ๋“œ ํ’€์ด ํ•˜๋‚˜ ์ด์ƒ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ๋…ธ๋“œ ์žฌ์ƒ์„ฑ ์‹œ ๋…ธ๋“œ ์ด๋ฆ„์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์ง€๋งŒ Spot VM์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋‚ด๋ถ€ ๋ฐ ์™ธ๋ถ€ IP ์ฃผ์†Œ๋Š” ์žฌ์ƒ์„ฑ ํ›„ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋…ธ๋“œ taint ๋ฐ ํ†จ๋Ÿฌ๋ ˆ์ด์…˜(toleration)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘์š”ํ•œ ํฌ๋“œ๊ฐ€ Spot VM์„ ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œ ํ’€์— ์˜ˆ์•ฝ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ŠคํŒŸ VM์—์„œ ์Šคํ…Œ์ดํŠธํ’€(Stateful) ์›Œํฌ๋กœ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์ข…๋ฃŒ ํ›„ 25์ดˆ ์ด๋‚ด์— ์›Œํฌ๋กœ๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•˜์—ฌ ์˜๊ตฌ ๋ณผ๋ฅจ ๋ฐ์ดํ„ฐ ์†์ƒ ์œ„ํ—˜์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • Kubernetes ํฌ๋“œ ์ข…๋ฃŒ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

๋‹ค์Œ ๋‹จ๊ณ„