Kubernetes: CronJobs๋Š” ์‹œ๊ฐ„๋Œ€๋ฅผ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 06์›” 09์ผ  ยท  66์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: kubernetes/kubernetes

"cron timezone", "cronjob timezone" ๋˜๋Š” "scheduledjob timezone"์„ ๊ฒ€์ƒ‰ํ•œ ํ›„ ์ด์— ๋Œ€ํ•œ ํ† ๋ก ์„ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

CronJob ์‚ฌ์–‘์€ https://en.wikipedia.org/wiki/Cron ์„

์ด ์ง€์›์ด kubernetes์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. CronJobSpec ์™€ ๊ฐ™์ด timezone: "Americas/Chicago" CronJobSpec ์ƒˆ ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  2. ์‹œ๊ฐ„๋Œ€๋ฅผ ํฌํ•จํ•˜๋Š” ํ™•์žฅ๋œ cron ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค(์˜ˆ: 30 6 * * 1 Europe/Stockholm
arebatch areworkload-apcronjob kinfeature siapps

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

FWIW, "์‹œ๊ฐ„๋Œ€ ์„ค์ • ๋ฐฉ๋ฒ•"์€ CronJob์„ ๋งŒ๋“œ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž(๊ฐœ๋ฐœ์ž์™€ ๊ด€๋ฆฌ์ž ๋ชจ๋‘)๊ฐ€ ๋ฌป์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  66 ๋Œ“๊ธ€

@iterion ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์„œ๋ช… ๋ ˆ์ด๋ธ”์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ํ†ตํ•ด ์„œ๋ช… ๋ ˆ์ด๋ธ” ์„
(1) ์‹œ๊ทธ ์–ธ๊ธ‰: @kubernetes/sig-<team-name>-misc
(2) ์ˆ˜๋™์œผ๋กœ ๋ ˆ์ด๋ธ” ์ง€์ •: /sig <label>

_์ฐธ๊ณ : ๋ฐฉ๋ฒ• (1)์€ ํŒ€์— ์•Œ๋ฆผ์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ํŒ€ ๋ชฉ๋ก์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์—ฌ๊ธฐ ๋ฐ ๋ชฉ๋ก์— ๋ ˆ์ด๋ธ”์„ ์—ฌ๊ธฐ _

/ ์‹œ๊ทธ ์•ฑ

๋‚˜์—๊ฒŒ ๋” ์ž์—ฐ์Šค๋Ÿฌ์›Œ ๋ณด์ด๋ฏ€๋กœ ๋‘ ๋ฒˆ์งธ ์˜ต์…˜์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

@soltysh @kubernetes/sig-apps-feature-requests

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

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํ˜„์žฌ syncOne ๋ฃจํ”„์— time.Now()๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. k8s๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” cron lib๋Š” ๊ด€์‹ฌ ์žˆ๋Š” ์˜์—ญ์˜ ์‹œ๊ฐ„๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘๋™ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ CronJob์—์„œ ์‹œ๊ฐ„๋Œ€๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ํ•ด๋‹น ์‹œ๊ฐ„์„ zone๊ณผ ํ•จ๊ป˜ syncOne ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

//init the loc, needs error handling
//perhaps default to local if Timezone was invalid
loc, _ := time.LoadLocation(cronjob.Spec.Timezone)

//set timezone,  
now := time.Now().In(loc)

๋˜ํ•œ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋‹น์‹ ์˜ PR์„ ๊ฒ€ํ† ํ•  ์ ์ž„์ž๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ ์˜๋ฏธ๋ก ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์‹œ๊ฐ„๋Œ€๊ฐ€ ์ง€์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์˜ ์˜๋ฏธ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
  • ๊ตฌํ˜„์€ ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ŠคํŠธ์—์„œ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋œ ์‹œ๊ฐ„๋Œ€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๊นŒ?
  • ์‹œ๊ฐ„๋Œ€ ํ•ฉ๋ฒ•์„ฑ์„ ์–ธ์ œ ๊ฒ€์ฆํ•ฉ๋‹ˆ๊นŒ? ๊ฐœ์ฒด ์ƒ์„ฑ/์—…๋ฐ์ดํŠธ ์‹œ ๋˜๋Š” ๊ทธ ์ดํ›„?
  • API ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์‹œ๊ฐ„๋Œ€ ์ด๋ฆ„์ด ์˜ฌ๋ฐ”๋ฅด์ง€๋งŒ ๋ฏธ๋ž˜์—๋Š” ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? ์ด๋Š” ์ด๋ฆ„์ด ์ œ๊ฑฐ๋˜์—ˆ๊ฑฐ๋‚˜(๋„์‹œ ๋˜๋Š” ๊ตญ๊ฐ€๊ฐ€ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ) ๊ธฐ๋ณธ tzdata ํŒจํ‚ค์ง€๊ฐ€ ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ํ˜„์žฌ ๊ตฌ์ œ๊ธˆ์œต์„ ํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ž˜๋ชป๋œ ๊ฒƒ์„ ์ง€์ •ํ•œ ๊ฒฝ์šฐ ํ˜ธ์ŠคํŠธ์˜ ์‹œ๊ฐ„๋Œ€๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” golang์˜ time.LoadLocation(str) ๋ฉ”์„œ๋“œ์— ์˜์กดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜์—์„œ ํ—ˆ์šฉํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์ž์—ด์€ ์œ ํšจํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ˜„์žฌ ์ƒ์„ฑ/์—…๋ฐ์ดํŠธ ์‹œ์ ์— ์ด๊ฒƒ์„ ๊ฒ€์ฆํ•˜๊ณ  ์žˆ์ง€๋Š” ์•Š์ง€๋งŒ ๊ฝค ์‰ฌ์šด ์ผ์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

API ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์‹œ๊ฐ„๋Œ€ ์ด๋ฆ„์ด ์˜ฌ๋ฐ”๋ฅด์ง€๋งŒ ๋ฏธ๋ž˜์—๋Š” ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ? ์ด๋Š” ์ด๋ฆ„์ด ์ œ๊ฑฐ๋˜์—ˆ๊ฑฐ๋‚˜(๋„์‹œ ๋˜๋Š” ๊ตญ๊ฐ€๊ฐ€ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ) ๊ธฐ๋ณธ tzdata ํŒจํ‚ค์ง€๊ฐ€ ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ์— ๋Œ€ํ•œ ์ œ ์ œ์•ˆ์€ ์ ์ ˆํ•œ ์ด๋ฒคํŠธ๋กœ ์ผ์ž๋ฆฌ ์ฐฝ์ถœ์— ์‹คํŒจํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์†”์งํžˆ ๋งํ•ด์„œ ์ด๋Ÿฐ ์ผ์ด ์ž์ฃผ ์ผ์–ด๋‚˜๋Š”์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„ @iterion์— ์ด๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฐ cron ํ˜•์‹์ด ์ง€์›๋˜์ง€ ์•Š๋Š” ์—ฐ๋„ ์ œ์ถœ, ์ง€์ •๋œ ์‹œ๊ฐ„์— ํ•œ ๋ฒˆ๋งŒ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

:+1:

@iterion ๋ฌธ์ œ์™€ ํ’€ ๋ฆฌํ€˜์ŠคํŠธ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ง€๋‚œ ์ฃผ์— SIG Apps์™€ SIG Architecture์—์„œ ์ด์— ๋Œ€ํ•ด ์ƒ๋‹นํžˆ ๋…ผ์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์˜๋ฏธ๊ฐ€ ์žˆ์„ ๋•Œ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹จ์ ์— ๋Œ€ํ•ด์„œ๋„ ๋…ผ์˜ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ทœ์ •์„ ์ค€์ˆ˜ํ•˜๋Š” ๋ชจ๋“  Kubernetes ๋ฐฐํฌ์—๋Š” ์‹œ๊ฐ„๋Œ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๊ณ  ์ด๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ‘œ์ค€ ์‹œ๊ฐ„๋Œ€, ์ผ๊ด‘ ์ ˆ์•ฝ ์‹œ๊ฐ„์ œ, ์‹ค์ œ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์•ˆ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜ค๋Š˜๋‚  ์กด์žฌํ•˜๋Š” 20๊ฐœ ์ด์ƒ์˜ ๋ฐฐํฌํŒ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ž‘์—…์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์„ Kubernetes์— ๋„ฃ๋Š” ๋Œ€์‹  ์š”์ฒญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

๋„์›€์ด ๋œ๋‹ค๋ฉด ์ด๊ฒƒ์€ ๋™์ผํ•œ ์ง€์‹œ๋ฅผ ๋ฐ›๋Š” ์œ ์ผํ•œ ๊ธฐ๋Šฅ์ด ์•„๋‹™๋‹ˆ๋‹ค(๋™์ผํ•œ SIG ์•„ํ‚คํ…์ฒ˜ ํšŒ์˜์—์„œ๋„). ๋‚˜๋Š” ์ด๊ฒƒ์„ wordpress์™€ ๋น„์Šทํ•œ ๋งฅ๋ฝ์—์„œ ์ƒ๊ฐํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์ธ์ง€ ์›Œ๋“œํ”„๋ ˆ์Šค ์ž์ฒด์˜ ์ผ๋ถ€์ธ์ง€์—๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฐฉํ–ฅ์€ ๋งํ•˜์ž๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ํ˜์‹ ์„ ์žฅ๋ คํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ตฌ์ถ•ํ•˜๋ฉด SIG Apps์—์„œ ๋ฐ๋ชจ๋ฅผ ํ†ตํ•ด ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์„ ๋ณด์ผ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ ํšŒ์˜์—์„œ ์‹œ์—ฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์งˆ๋ฌธ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์–ธ์ œ๋“ ์ง€ ์ €์—๊ฒŒ ์—ฐ๋ฝํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

์ด์ „ ์˜๊ฒฌ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋™์˜ํ•˜์ง€ ์•Š์œผ์‹œ๋ฉด ๋‹ค์‹œ ์—ด์–ด์ฃผ์„ธ์š”.

FWIW, "์‹œ๊ฐ„๋Œ€ ์„ค์ • ๋ฐฉ๋ฒ•"์€ CronJob์„ ๋งŒ๋“œ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž(๊ฐœ๋ฐœ์ž์™€ ๊ด€๋ฆฌ์ž ๋ชจ๋‘)๊ฐ€ ๋ฌป์Šต๋‹ˆ๋‹ค.

@iterion ๊ฒฐ๊ตญ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋ฌด์—‡์„ ํ•˜์˜€์Šต๋‹ˆ๊นŒ? ๋‹ค์Œ์„ ํฌํ•จํ•˜์—ฌ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋Œ€ํ•œ ๋‹ค์–‘ํ•œ ์˜ต์…˜์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ˆ˜์ • ์‚ฌํ•ญ์œผ๋กœ Kubernetes ํฌํฌ์—์„œ ์‹คํ–‰
  • cron ์ปจํŠธ๋กค๋Ÿฌ ์ฝ”๋“œ๋ฅผ ์™ธ๋ถ€ ์ปจํŠธ๋กค๋Ÿฌ์— ๋ณต์‚ฌํ•˜๊ณ  ๋‹ค๋ฅธ apiVersion์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‘˜์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
  • kube cronjob ์ปจํŠธ๋กค๋Ÿฌ ๊ตฌํ˜„์„ ๋ฏธ๋Ÿฌ๋งํ•˜์ง€๋งŒ CronJob ๋ฆฌ์†Œ์Šค๊ฐ€ ์•„๋‹Œ ์•ฑ๋ณ„ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” Ruby์—์„œ ํ”„๋กœ์ ํŠธ์— ํŠน์ •ํ•œ ๊ฒƒ์„ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

์‹œ์ž‘์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ๋ฌด์–ธ๊ฐ€๊ฐ€ ์ด๋ฏธ ์žˆ๊ฑฐ๋‚˜ @mattfarina๊ฐ€ ์ด๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๊ธฐ๋กœ ํ•œ ๊ทธ์˜ ๊ฒฐ์ •์„ ๋’ค์ง‘์„ ์ˆ˜ ์žˆ๋„๋ก ํ˜‘๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ(์ด๋Š” ์ด kube์˜ ์ฑ„ํƒ์— ๊ทน์ ์œผ๋กœ ํ•ด๋ฅผ ๋ผ์นฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ), ๊ทธ๊ฒƒ์€ ๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์‹ค์ œ๋กœ ์ƒˆ ์ง์žฅ์œผ๋กœ ์˜ฎ๊ฒผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ์ธ์ ์œผ๋กœ ๋” ์ด์ƒ ์›๋ž˜์˜ ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ, ๋‚ด ์ „ ๋™๋ฃŒ๋“ค์€ ๊ทธ๋กœ ์ธํ•œ ๊ณ ํ†ต์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, ์ด ์ž‘์—…์— ํ• ์• ํ•  ์‹œ๊ฐ„์ด ์žˆ๋‹ค๋ฉด ํ•„์š”์— ๋”ฐ๋ผ CronJobs๋ฅผ ๊ฐ์‹œํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์€ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ์‹œ๊ฐ„๊ณผ ์‹œ๊ฐ„๋Œ€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CronJobs์— ์ฃผ์„์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ•ด๋‹น ์ผ์ •์„ UTC๋กœ ์ „์†กํ•˜๊ณ  CronJobs๋ฅผ ์ˆ˜์ •ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋™๊ธฐํ™” ๋ฃจํ”„๋ฅผ ์ผ์ •ํ•œ ๊ฐ„๊ฒฉ์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ๋ฌธ์ œ์˜ ๊ฒฝ๊ณ„๋ฅผ ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ผ๊ด‘ ์ ˆ์•ฝ ์‹œ๊ฐ„์ œ๊ฐ€ ์‹œ์ž‘๋˜๊ฑฐ๋‚˜ ์ข…๋ฃŒ๋  ๋•Œ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋Š” CronJob API ์œ„์— ๋งค์šฐ ์–‡์€ ๋ž˜ํผ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@mattfarina ๊ฐ€ ์ด๊ฒƒ์„ ํฌํ•จํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ธฐ๋กœ ํ•œ ๊ทธ์˜ ๊ฒฐ์ •์„ ๋ฒˆ๋ณตํ•˜๋„๋ก ๊ฒฉ๋ คํ•˜์‹ญ์‹œ์˜ค.

๋ถ„๋ช…ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ์ด ๊ฒฐ์ •์€ sig-architecture ํšŒ์˜ ์ค‘ ํ•˜๋‚˜์—์„œ ์ง‘ํ•ฉ์ ์œผ๋กœ ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค. Matt๋Š” ์ด๋ฒˆ ํ˜ธ์—์„œ ๊ทธ ๊ฒฐ์ •์„ ํ‘œํ˜„ํ•œ ์œ ์ผํ•œ ์‚ฌ๋žŒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์ข…๊ณผ ํœ˜ํŒŒ๋žŒ์ด ์žˆ๋Š” ์‹œ๊ฐ„๋Œ€ ๋ฌธ์ œ๋Š” Linux ์„ธ๊ณ„์—์„œ ์˜ค๋žซ๋™์•ˆ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Kubernetes ๋ฐฐํฌ์˜ ํ•„์ˆ˜ ์กฐ๊ฑด์ธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

TimezoneAwareCronjobController๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ์‚ฐ์ž๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ? @iterion ์ด ์ž‘์„ฑํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” ์žฌํ™œ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
TZ ์ฒ˜๋ฆฌ๋ฅผ ํŒจํ‚ค์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ด๋™ํ•˜๋ฉด Kubernetes์—์„œ ์ผ๊ธ‰ cronjob ์ง€์›์„ ์ค‘๋‹จ์‹œํ‚จ ๋ฐฐํฌ ์ธ์ˆ˜๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

FWIW, https://gopkg.in/robfig/cron.v2 (๊ธฐ์กด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ด์ „ ํ•˜์œ„ ์ง‘ํ•ฉ์ž„)๋Š” TZ ๋ฐ ์•ฝ๊ฐ„ ๋” ํ’๋ถ€ํ•œ ์‹œ๊ฐ„ ์ •์˜ ์„ธํŠธ ์ „๋‹ฌ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
์ผ๋ถ€ ๋‚ด๋ถ€ ์ž‘์—… ๋ถ€ํ•˜์— ๋Œ€ํ•ด cron ์ž‘์—…์„ ์ƒ์„ฑํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋‚ด๋ถ€์— ์žˆ์œผ๋ฉฐ, ์ด๋Ÿฌํ•œ ์ž‘์—…์— ๋Œ€ํ•œ ์‹œ๊ฐ„๋Œ€๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ๋›ฐ์–ด๋‚œ ๊ธฐ๋Šฅ ์š”์ฒญ์ž…๋‹ˆ๋‹ค. ์‹ค์ˆ˜๋กœ ์ž‘์—…์„ ๊ฑด๋„ˆ๋›ฐ๊ฑฐ๋‚˜ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด cronjob ์ •์˜๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ๊ธฐ์กด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ž‘์—… ์ผ์ •์„ ํ›”์น˜๊ณ  cronjob๋ณด๋‹ค ์ง์ ‘ ์ž‘์—… ์ •์˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์‹ค์ œ๋กœ ๋” ์‰ฌ์šธ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

K8์„ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ์ดํ›„๋กœ 1๋…„์— ๋‘ ๋ฒˆ ์ด ๋ฌธ์ œ๋กœ ๋Œ์•„์˜ค๋Š”๋ฐ, ๋งˆ์นจ๋‚ด ๋ชจ๋“  CronJobs์˜ ์ผ์ •์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๊ณ  ๋งˆ์นจ๋‚ด ์žฌ๊ฐœ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ฒฝ์šฐ ํฌ๋กœ๋…ธ์Šค๊ฐ€ ์™€ ์˜ crontab ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ , ์–ด๋–ป๊ฒŒ K8S ์—ฌ์ „ํžˆ์ด ์ง€์›๋˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์žฅ๊ธฐ ๋ฌธ์ œ(์ž์‹ ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ)

์ด ๋ฌธ์ œ๊ฐ€ ๋‹ค์‹œ ์—ด๋ฆฌ๊ธธ ๋ฐ”๋ผ๋ฉฐ ๋งค์ผ UTC ์‹œ๊ฐ„์„ ๋ณด๋Š” ๊ฒƒ์ด ์กฐ๊ธˆ ์ด์ƒํ•ฉ๋‹ˆ๋‹ค.

๋งค์›” 1์ผ ํ˜„์ง€ ์‹œ๊ฐ„์œผ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” cronjob์ด ์žˆ์ง€๋งŒ UTC ์‹œ๊ฐ„์€ ์ง€๋‚œ๋‹ฌ ๋งˆ์ง€๋ง‰ ๋‚  16:00์ž…๋‹ˆ๋‹ค. ์ง€๋‚œ ๋‹ฌ์˜ ๋งˆ์ง€๋ง‰ ๋‚ ์„ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•ฉ๋‹ˆ๊นŒ? Cronjob์€ L์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋Œ€์ฒด ์†”๋ฃจ์…˜์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ๋ฐ ์—ฌ๊ธฐ์—์„œ ๋‚ด ์งˆ๋ฌธ์„ ์ฐธ์กฐ

์•„์ง ์ด๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋Š” ๋ˆ„๊ตฐ๊ฐ€๋ฅผ ์œ„ํ•ด; ๋„ค์ดํ‹ฐ๋ธŒ Kubernetes cronjob ์ปจํŠธ๋กค๋Ÿฌ์™€ ๋‹ซํžŒ ์›๋ž˜ PR์—์„œ ํŒŒ์ƒ๋œ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/hiddeco/cronjobber

ํŽธ์ง‘(2019-05-12): @mterron ๋•๋ถ„์— Cronjobber ๋Š” ์ด์ œ ์‚ฌ์ด๋“œ์นด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ŠคํŠธ ๋…๋ฆฝ ์‹œ๊ฐ„๋Œ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

@hiddeco ๊ธฐ์กด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ปจํŠธ๋กค๋Ÿฌ ์ œ์–ด ํ‘œ์ค€ CJ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ๋”

@andrewsav ๋Š” ๋ฐ”๋žŒ์งํ•˜์ง€๋งŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด CJ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ '์ œ์–ด'ํ•˜๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ CronJob ์˜ ์ผ์ •์„ ์‹œ๊ฐ„๋Œ€ ์˜คํ”„์…‹์œผ๋กœ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ผ์ • ์กฐํ•ฉ์— ๋Œ€ํ•ด ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

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

@hiddeco

๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ผ์ • ์กฐํ•ฉ์— ๋Œ€ํ•ด ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค.

์„ค๋ช…ํ•ด์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”?

@AndrewSav ๊ฐ„๋‹จํ•œ ์˜ˆ: 0 0 1 * * NZDT (UTC+13)์—์„œ ์‹คํ–‰๋˜๋Š” 0 0 1 * * ๋Š” ์ด์ „ ๋‹ฌ์˜ ๋งˆ์ง€๋ง‰ ๋‚ ์— ์‹คํ–‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์›” ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ค์ „ 11์‹œ(UTC ๊ธฐ์ค€)

์ผ์ •์˜ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€ํ•˜๋ฉด ๋™๊ธฐํ™”๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ์–‘๋„ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์‹œ๊ฐ„๋Œ€ ์˜์—ญ์ด DST์—์„œ ST๋กœ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ทธ๊ฒƒ์„ ๊ทน๋„๋กœ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์ž˜๋ชป๋œ ์‹œ๊ฐ„์— ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๋” ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ๋Š” ๋งŽ์€ ๊ณต๊ฐ„์„ ์—ฝ๋‹ˆ๋‹ค. ๋ณ„๋ง์”€์„ ์š”.

ํ•ด๊ฒฐ์ฑ…์€ ์‹œ๊ฐ„๋Œ€์— ๋”ฐ๋ผ "๊ฐ€๋Šฅํ•œ" ์‹œ๊ฐ„๋งˆ๋‹ค cron์„ ์‹คํ–‰ํ•˜๊ณ  ํ˜„์žฌ ์‹œ๊ฐ„์ด ์˜ˆ์ƒ ์‹œ๊ฐ„์ด ์•„๋‹Œ ๊ฒฝ์šฐ ๊ฑด๋„ˆ๋›ฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ˆ˜์ค€์—์„œ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

DST์˜ ๊ฒฝ์šฐ ์ด๋Š” ํ•˜๋ฃจ์— ํ•œ ๋ฒˆ์ด ์•„๋‹ˆ๋ผ ๋‘ ๋ฒˆ ์‹คํ–‰๋˜๊ณ  DST์— ๋”ฐ๋ผ ์ฒซ ๋ฒˆ์งธ ๋˜๋Š” ๋‘ ๋ฒˆ์งธ๋ฅผ ๊ฑด๋„ˆ๋›ด๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

์‹œ๊ฐ„๋Œ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ DST๋Š” kubernetes ๋ฐฐํฌ๊ฐ€ ์˜์กดํ•ด์•ผ ํ•˜๋Š” OS ๋ฐฐํฌ์—์„œ ๋งค์šฐ ์ž˜ ์œ ์ง€ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค. "๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ์—ด์‹ฌํžˆ ์ผํ•œ๋‹ค"๋Š” ๋ณ€๋ช…์€ ์œ ํšจํ•œ IMO๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

๊ฐœ๋…์ด PeriodicJob ์ธ์ง€ RepeatingJob ์ธ์ง€ ๋…ผ์Ÿํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋Œ€์‹  CronJob ํ•ฉ๋‹ˆ๋‹ค. ๋‹ฌ๋ ฅ๊ณผ ์‹œ๊ณ„๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์‹œ๊ฐ„๋Œ€ ์ธ์‹์ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค๋Š” ์‚ฌ์‹ค์€ ๋ถ€์ธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜; kubernetes์—์„œ CronJob์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜; kubernetes์—์„œ CronJob์„ ์™„์ „ํžˆ ์ œ๊ฑฐํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ๋„์›€์ด ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. k8์—์„œ ์ ์ ˆํ•œ ์†”๋ฃจ์…˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์†”๋ฃจ์…˜์— ์ „ํ˜€ ์ถ”๊ฐ€ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. Cronjob์€ ์‹œ๊ฐ„๋Œ€์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ ์˜ค๋Š˜๋‚  ๋ชจ๋“  OS๋Š” ์—ฐ๊ด€๋œ OS ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ ์‹œ๊ฐ„๋Œ€๋ฅผ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ถ”๋ก ์ด ์ผ๊ด€๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๋…ผ๋ฆฌ์— ๋”ฐ๋ฅด๋ฉด K8์—๋Š” ์กด์žฌํ•ด์„œ๋Š” ์•ˆ ๋˜๋Š” ๊ธฐ๋Šฅ์ด ๋งŽ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ ๋ฒ„๊ทธ์ž…๋‹ˆ๋‹ค. Cronjob ์ด๋ฆ„ ์ž์ฒด๋Š” Cron ์‚ฌ์–‘์„ ๋”ฐ๋ฅด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ kubernetes ์‚ฌ์šฉ์ž๋Š” ํ‘œ์ค€ ์‹œ๊ฐ„๋Œ€ ์ง€์›์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•ต์‹ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๊ฒƒ์„ ํฌํ•จํ•˜์ง€ ์•Š๊ธฐ๋กœ ์„ ํƒํ•œ ๊ฒƒ์€ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” UTC ์‹œ๊ฐ„์— ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž์˜ 90% ์ด์ƒ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ์žฌ๊ฒ€ํ† ํ•  ๊ฒƒ์„ ์ด‰๊ตฌํ•˜๊ณ  ์‹ถ๋‹ค. ๋‚ด๊ฐ€ ๊ฒช๊ณ  ์žˆ๋Š” ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๋Š” ์ผ๋ณธ์—์„œ ํŠน์ • ์ž‘์—…์ด ๋งค์›” 1์ผ ์˜ค์ „ 1์‹œ์— ์‹คํ–‰๋˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ํ•ฉ๋ฆฌ์ ์ธ/ํ‘œ์ค€ ์‚ฌ์šฉ ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค. cron์ด UTC๋กœ ์ •์˜๋˜์–ด ์žˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด๊ฒƒ์„ ์ง€์ •ํ•  ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค. 0 0 1 * * ๋Š” ์ผ๋ณธ ์‹œ๊ฐ„์œผ๋กœ ์˜ค์ „ 9์‹œ์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. (์ผ๋ถ€ cron ๊ตฌํ˜„์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์›”์˜ ๋งˆ์ง€๋ง‰ ๋‚ ์— 0 0 L * * ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค)

@johnnyshields ์— ๋‹ค์‹œ ์—ด์–ด๋‹ฌ๋ผ๊ณ  @soltysh ์— ์š”์ฒญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‹ค์‹œ ๊ณ ๋ คํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๊ฐ€๋Šฅ์„ฑ์€ ํฌ๋ฐ•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŒ€์€ ํ•จ๊ป˜ ๋ชจ์—ฌ ์˜๋…ผํ•œ ํ›„ ๋„ˆ๋ฌด ๋งŽ์€ ์ถ”๊ฐ€ ์ž‘์—…์ด ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ทธ ์ดํ›„๋กœ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ฏ€๋กœ ๊ฒฐ์ •๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

CronJobber https://github.com/hiddeco/cronjobber ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ๊ธฐ์—ฌํ•˜์‹ญ์‹œ์˜ค! ๋ชจ๋‘๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

์ตœ์‹  ๋ฒ„์ „์˜ CronJob ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” PR์€ ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๊ทธ๋Œ€๋กœ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‹ค์‹œ ๊ณ ๋ คํ•˜๊ณ  ์‹ถ์ง€๋งŒ ๊ฐ€๋Šฅ์„ฑ์€ ํฌ๋ฐ•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŒ€์€ ํ•จ๊ป˜ ๋ชจ์—ฌ ์˜๋…ผํ•œ ํ›„ ๋„ˆ๋ฌด ๋งŽ์€ ์ถ”๊ฐ€ ์ž‘์—…์ด ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋ผ๊ณ  ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ทธ ์ดํ›„๋กœ ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์ด ์•„๋‹ˆ๋ฏ€๋กœ ๊ฒฐ์ •๋„ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ตœ์†Œํ•œ ์ผ๊ด€์„ฑ์ด ์žˆ์–ด์•ผ ํ•˜๊ณ  ํฌ๋ก ์žก์˜ ํ˜„์žฌ ๊ตฌํ˜„์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” (์ตœ์†Œํ•œ ๋งํ•ด์„œ) ๋งค์šฐ ์˜คํ•ด์˜ ์†Œ์ง€๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@mterron ์˜ ๋ฌธ์ œ๋Š” ๊ฑฐ์˜ 1๋…„ ์ „์— ํŒจ์น˜๋˜์—ˆ๊ณ  ๊ทธ ์ดํ›„๋กœ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ๋™์•ˆ ๊ฐœ์„  ๋ฐ ๋ณด์•ˆ ์ˆ˜์ •์ด ํฌํ•จ๋œ ์ˆ˜์‹ญ ๊ฐœ์˜ kubernetes ๋ฆด๋ฆฌ์Šค๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์˜์—ญ์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๋ชจ๋“  ์ตœ์‹  ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@AndrewSav ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ ๋„์›€์„ ์š”์ฒญํ•œ ์ด์œ ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์ผ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ ์œ„ํ—˜์ด ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Kubernetes๋Š” ํ•ญ์ƒ ๋ณ€๊ฒฝ๋˜์ง€๋งŒ ๋ณด์•ˆ ์ธก๋ฉด์—์„œ ๋ณ€๊ฒฝ์ด ์˜๋ฏธ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

rebase๋Š” ๋ฉ‹์ง€๊ณ  ์ž์œ ๋กญ๊ฒŒ ๊ธฐ์—ฌํ•˜๊ณ  ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mterron ๊ทธ ์ž‘๊ฐ€๋‹˜์ด์„ธ์š” ? ๊ทธ๋ž˜์„œ ๋‹น์‹ ์ด ๊ทธ๋ ‡๊ฒŒ ํ•  ์‹œ๊ฐ„์„ ๋‚ผ ์ˆ˜ ์—†๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์‚ฌ๋žŒ๋“ค์ด ๋” ์ด์ƒ ํ™œ๋™ํ•˜์ง€ ์•Š๋Š” ์ผ์— ๊ธฐ์—ฌํ•  ๊ฐ€๋Šฅ์„ฑ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ์ข‹๊ฒ ์ง€๋งŒ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ฒ˜์Œ ์ถ”์ง„๋˜์—ˆ์„ ๋•Œ ๋„๋ฐ•์„ ํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ์— ๋„ฃ์„๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์„ ์ž ์‹œ ํ•˜๋‹ค๊ฐ€ ์œ ์ง€๋  ๊ฐ€๋Šฅ์„ฑ์ด ํฌ์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. 1๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ ๋‚˜๋Š” ๋‚ด๊ฐ€ ํ‹€๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋‹น์‹ ์˜ ์ž‘์—…์— ๊ฐ์‚ฌํ•˜์ง€๋งŒ ํ˜„์žฌ์˜ ํ˜•ํƒœ๋กœ๋Š” ์ง€์† ๊ฐ€๋Šฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์‹œ์ž‘๋˜๊ณ  ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ง€์†์ ์œผ๋กœ rebaseํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์€ ์ •๋ง ๋ฉ‹์ง„ ์ผ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋‹ˆ์š”, ์ €๋Š” ์ €์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ €๋Š” ์ œ๊ฐ€ ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์— ๊ธฐ์—ฌํ•˜๋Š” ์‚ฌ์šฉ์ž์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.
๋‚˜๋Š” ๋‹น์‹ ์ด ์–ด๋””์—์„œ ์™”๋Š”์ง€ ์ดํ•ดํ•˜์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด ์—ฌ๊ฐ€ ์‹œ๊ฐ„์— ์ง€์—ญ ์‚ฌํšŒ์˜ ์ด์ต์„ ์œ„ํ•ดํ•˜๋Š” ์ผ์— ๋Œ€ํ•œ ๊ธฐ๋Œ€๊ฐ€ ์กฐ๊ธˆ ๋†’๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@mterron ์ œ ๊ธฐ๋Œ€์น˜์—

@AndrewSav ๋‹น์‹ ์€ cronjobber์™€ ์—…์ŠคํŠธ๋ฆผ cronjob ์ปจํŠธ๋กค๋Ÿฌ ์‚ฌ์ด์— diff๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง€๋‚œ ๋ฒˆ (1.17)์—๋Š” ์ฐจ์ด๊ฐ€ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์—…์ŠคํŠธ๋ฆผ cronjob ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ •์˜์— ๋”ฐ๋ผ ํšจ๊ณผ์ ์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์—…์ŠคํŠธ๋ฆผ ์ปจํŠธ๋กค๋Ÿฌ์—๋Š” ๋ฌผ๋ก  cronjobber๊ฐ€ ์ƒ์†ํ•˜๋Š” ๋”์ฐํ•œ ์„ฑ๋Šฅ ํŠน์„ฑ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

@benlangfeld

cronjobber์™€ ์—…์ŠคํŠธ๋ฆผ cronjob ์ปจํŠธ๋กค๋Ÿฌ ๊ฐ„์— diff๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์—…์ŠคํŠธ๋ฆผ cronjob ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ •์˜์— ๋”ฐ๋ผ ํšจ๊ณผ์ ์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋งํ•œ ๊ฒƒ์— ๋Œ€ํ•œ ๊ณต์ •ํ•œ ํ•ด์„์ด ์•„๋‹™๋‹ˆ๋‹ค.

diff์˜ ์ฃผ์ œ์— ๋Œ€ํ•ด: ๋‹น์‹ ์€ ๋ฌด์—‡๊ณผ ๋ฌด์—‡์„ ๊ตฌ๋ณ„ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ํ•ด๋‹น ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—๋Š” 50๊ฐœ๊ฐ€ ๋„˜๋Š” ํŒŒ์ผ์ด ์žˆ์œผ๋ฉฐ ๋ชจ๋“  ์ด๋ฆ„์ด kubernetes ์†Œ์Šค์˜ ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™”๊ฐ€ ์—†์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ช…ํ™•ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด์ „ ์˜๊ฒฌ์—์„œ๋ณด๋‹ค ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ๊ฐ ์ธก๋ฉด์—์„œ ๋ถ„๊ธฐ/์ปค๋ฐ‹ํ•˜๋Š” ํŒŒ์ผ์„ ๋น„๊ตํ•˜๊ณ  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•œ ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

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

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

'ํฌํฌ'์˜ ์ €์ž์ธ @AndrewSav ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์–ธ๊ธ‰ํ•œ ๋‚ด์šฉ์— ์ •์ค‘ํ•˜๊ฒŒ ๋™์˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์—ฌ๋Ÿฌ OSS ํ”„๋กœ์ ํŠธ์˜ ๊ด€๋ฆฌ์ž๋กœ์„œ ๊ท€ํ•˜์˜ ํƒœ๋„์— ๋†€๋ž์Šต๋‹ˆ๋‹ค.

์ฒซ์งธ, cronjobber๋Š” Kubernetes CronJob ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ํŒŒ์ƒ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ง์ ‘์ ์ธ ์ˆ˜์ • ์‚ฌํ•ญ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ์ˆ™ํ•œ(๊ทธ๋ฆฌ๊ณ  ๊ฒ€์ฆ๋œ) ์†”๋ฃจ์…˜์— ์ตœ์†Œํ•œ์˜ ์‹œ๊ฐ„์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์— ์–ธ๊ธ‰๋œ ์ด์œ ๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ ์ €๋Š” ์—…์ŠคํŠธ๋ฆผ์ด ๋งŽ์ด ๋ณ€๊ฒฝ๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‘˜์งธ, Y ์‹œ๊ฐ„๋Œ€ Z ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ X ์ž‘์—…์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋กœ์ผ“ ๊ณผํ•™์ด ์•„๋‹ˆ๋ฉฐ ๊ฐœ๋… ์‹œ๊ฐ„์— ๋Œ€ํ•œ ์‚ฌ์–‘์€ ๋ช‡ ๋…„ ๋™์•ˆ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ' ์ ์ ˆํ•œ ์‹œ๊ฐ„์— Kubernetes ๊ธฐ๋ณธ ์ž‘์—…์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์‹œ๊ฐ„๋Œ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ตœ์‹  ์ƒํƒœ์ด๋ฉฐ @mterron ๋•๋ถ„์— ๋„์šฐ๋ฏธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ).

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

@hiddeco

๋‚˜๋Š” ๋‹น์‹ ์ด ์ง€๊ธˆ๊นŒ์ง€ ๋งํ•œ ๋ชจ๋“  ๊ฒƒ์— ์ •์ค‘ํ•˜๊ฒŒ ๋™์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค

์•„๋ฌด๊ฒƒ? ๊ฐ•๋ ฅํ•œ ๋ฐœ์–ธ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜์— ์„ค๋ช…๋œ ์ด์œ ๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ ์—…์ŠคํŠธ๋ฆผ์ด ๋งŽ์ด ๋ณ€๊ฒฝ๋  ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(๋˜๋Š” ๊ทธ๋ ‡์ง€๋„ ์•Š์Œ).

_๋งŽ์ด_ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ณ ์ • ์ƒํƒœ๋กœ ์œ ์ง€๋˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. kubernetes ํŒ€์€ "์ฝ”์–ด Kubernetes์— ๋Œ€ํ•ด ๊ณ ๋ ค๋˜๊ธฐ ์ „์—" "๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์ฑ„ํƒ๋œ" ์†”๋ฃจ์…˜์„ ์›ํ•œ๋‹ค๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ์ ๊ทน์ ์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ์†”๋ฃจ์…˜(๊ฑฐ์˜ 1๋…„ ๋™์•ˆ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์—†์Œ)์€ ๊ฑฐ์˜ "๋„๋ฆฌ ์ฑ„ํƒ"๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Kubernetes CronJob ์ปจํŠธ๋กค๋Ÿฌ์™€ ํ•ด๋‹น ์ข…์†์„ฑ์ด ์ „ํ˜€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์Œ์„ ์ง€๊ธˆ๊นŒ์ง€ ์•„๋ฌด๋„ ์ž…์ฆํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์˜ํ–ฅ์„ ๋ฐ›์€ ๋ชจ๋“  ํŒŒ์ผ๊ณผ ๋ชจ๋“  ๊ธฐ๋ณธ ์ข…์†์„ฑ์„ ๋น„๊ตํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‘˜์งธ, ์‹œ๊ฐ„๋Œ€ Z๋ฅผ ๊ณ ๋ คํ•˜๋ฉด์„œ Y ์‹œ๊ฐ„์— ์ž‘์—… X๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋กœ์ผ“ ๊ณผํ•™์ด ์•„๋‹ˆ๋ฉฐ ๊ฐœ๋… ์‹œ๊ฐ„์— ๋Œ€ํ•œ ์‚ฌ์–‘์€ ๋ช‡ ๋…„ ๋™์•ˆ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์—ฌ์ „ํžˆ Kubernetes ๊ธฐ๋ณธ ์ž‘์—…์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์‹œ๊ฐ„(๋ฐ ํ‘œ์ค€ ์‹œ๊ฐ„๋Œ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ตœ์‹  ์ƒํƒœ์ด๋ฏ€๋กœ @mterron ๋•๋ถ„์— ๋„์šฐ๋ฏธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ).

์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ง€๋‚˜์น˜๊ฒŒ ๋‚™๊ด€์ ์œผ๋กœ ๋“ค๋ฆฐ๋‹ค. ์ด๊ฒƒ์€ "์‚ฌ์–‘" ๋ณ€๊ฒฝ์— ๊ด€ํ•œ ๊ฒฝ์šฐ๋Š” ๋“œ๋ญ…๋‹ˆ๋‹ค. ๋‹น์‹ ์„ ์ฃฝ์ด๋Š” ๊ฒƒ์€ ์ž‘์€ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค. ๋ฒ„๊ทธ๋Š” "์„ฑ์ˆ™ํ•˜๊ณ  ์‹œ๊ฐ„์ด ์ž…์ฆ๋œ" ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ง€์†์ ์œผ๋กœ ๋ฐœ๊ฒฌ๋˜๊ณ  ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค. ์ž‘์—… ์ƒ์„ฑ์€ ๋กœ์ผ“ ๊ณผํ•™์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ kubernetes ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ด€๋ จ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์€ ๋น ๋ฅด๊ฒŒ ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž‘๋…„์—๋Š” ํด๋ผ์ด์–ธํŠธ API(kubectl)๋ฅผ ์Šคํ…Œ์ด์ง•์œผ๋กœ ์˜ฎ๊ธฐ๋ ค๋Š” ๋…ธ๋ ฅ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. cron jobber์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๊นŒ? ๋ชจ๋ฅด๊ฒ ์–ด์š”. ์‚ฌ์šฉ๋œ cron ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์ด ์—…์ŠคํŠธ๋ฆผ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํฌ๋ก  ์žก๋ฒ„์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๊นŒ? ๋‹ค์‹œ, ๋‚˜๋Š” ๋ชจ๋ฅธ๋‹ค.

๋‚ด๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ™•์ธํ•  ๋•Œ ์™„๋ฒฝํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๋‚ด ์‹œ๊ฐ„์€ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์ด๋ฏธ ํ•ด์•ผ ํ•  ์ผ๋ณด๋‹ค ๋” ๋งŽ์€ ์ผ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. PR์„ ๋ณ‘ํ•ฉํ•˜๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์—…์„ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๊ท€ํ•˜์˜ ํ‘œ์ค€์— ๋งž์ง€ ์•Š์œผ๋ฉด ๊ท€ํ•˜๋ฅผ ์œ„ํ•ด ์œ ์‚ฌํ•œ ์†”๋ฃจ์…˜์„ ์ž‘์„ฑํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌํ•  ์‚ฌ๋žŒ์„ ๊ณ ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์œ„์˜ ์˜๊ฒฌ์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด ๋‚˜์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ œ ์ž์‹ ์„ ๋˜ํ’€์ดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฃผ์ œ์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์ด๋ฏธ ์–ธ๊ธ‰๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?

์ด๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ง€๋‚˜์น˜๊ฒŒ ๋‚™๊ด€์ ์œผ๋กœ ๋“ค๋ฆฐ๋‹ค. ์ด๊ฒƒ์€ "์‚ฌ์–‘" ๋ณ€๊ฒฝ์— ๊ด€ํ•œ ๊ฒฝ์šฐ๋Š” ๋“œ๋ญ…๋‹ˆ๋‹ค. ๋‹น์‹ ์„ ์ฃฝ์ด๋Š” ๊ฒƒ์€ ์ž‘์€ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค. ๋ฒ„๊ทธ๋Š” "์„ฑ์ˆ™ํ•˜๊ณ  ์‹œ๊ฐ„์ด ์ž…์ฆ๋œ" ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ง€์†์ ์œผ๋กœ ๋ฐœ๊ฒฌ๋˜๊ณ  ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค. ์ž‘์—… ์ƒ์„ฑ์€ ๋กœ์ผ“ ๊ณผํ•™์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ kubernetes ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ๊ด€๋ จ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์€ ๋น ๋ฅด๊ฒŒ ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž‘๋…„์—๋Š” ํด๋ผ์ด์–ธํŠธ API(kubectl)๋ฅผ ์Šคํ…Œ์ด์ง•์œผ๋กœ ์˜ฎ๊ธฐ๋ ค๋Š” ๋…ธ๋ ฅ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ํฌ๋ก  ์žก๋ฒ„์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๊นŒ? ๋ชจ๋ฅด๊ฒ ์–ด์š”. ์‚ฌ์šฉ๋œ cron ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์ด ์—…์ŠคํŠธ๋ฆผ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํฌ๋ก  ์žก๋ฒ„์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๊นŒ? ๋‹ค์‹œ, ๋‚˜๋Š” ๋ชจ๋ฅธ๋‹ค.

์†”์งํžˆ ์ด๊ฒƒ์€ ๋ฐฉํ•ด์ฃผ์˜๋ฅผ ์ดˆ๋ž˜ํ•˜๋Š” Whatabouttism์œผ๋กœ ๋‚˜์—๊ฒŒ์˜ต๋‹ˆ๋‹ค. ์ด ๋…ผ๋ฆฌ๋Š” ๋ฌด์—‡์ด๋“  ๋ฐ˜๋Œ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ ๋‹ฌ์„ฑํ•˜๋ ค๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„๋Œ€๋ฅผ ์ธ์‹ํ•˜๋Š” cronjob์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๋งŒํผ ๋ณต์žกํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฃผ๋ฅ˜ *nix ์‹œ์Šคํ…œ(k8์ด ์‹คํ–‰๋˜๋Š” ์‹œ์Šคํ…œ)์€ ์ˆ˜์‹ญ ๋…„ ๋™์•ˆ ํ™•๊ณ ํ•œ ์‹œ๊ฐ„๋Œ€ ์ง€์›์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค(๋†€๋ž๊ฒŒ๋„ *nix ์‹œ์Šคํ…œ์€ 40๋…„ ์ด์ƒ ๋™์•ˆ ์œ ์‚ฌํ•œ ์šฐ๋ ค ์‚ฌํ•ญ์ด ์žˆ๋Š” ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ์ฃผ๋กœ ์‹คํ–‰๋˜์–ด ์™”์Šต๋‹ˆ๋‹ค).

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์œ„์˜ ์˜๊ฒฌ์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด ๋‚˜์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์œ ์šฉํ•˜๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ ์ œ ์ž์‹ ์„ ๋˜ํ’€์ดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฃผ์ œ์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒƒ์ด ์ด๋ฏธ ์–ธ๊ธ‰๋˜์—ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?

๊ทธ๋ฆฌ๊ณ  ad-nauseam์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํ˜„์žฌ ๊ตฌํ˜„์€ ํ‘œ์ค€ ์‹œ๊ฐ„๋Œ€๋ฅผ ์™„์ „ํžˆ ๋ฌด์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด ๋…ผ๋ฆฌ๋Š” ๋ฌด์—‡์ด๋“  ๋ฐ˜๋Œ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿด ์ˆ˜ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์›ํ•œ๋‹ค๋ฉด ๊ทธ๊ฒƒ์„ ์‹œ์—ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์•”์‹œ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋งํ•œ ๊ฒƒ์„ ๊ณ ์ˆ˜ํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋‹น์‹ ์ด ์—ฌ๊ธฐ์„œ ๋‹ฌ์„ฑํ•˜๋ ค๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ „ํ˜€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

์˜ค, ๋‚˜๋Š” ๋‹จ์ง€ ๋‚˜๋ฅผ ํ–ฅํ•œ hiddeco์˜ ๋Œ“๊ธ€์— ๋‹ตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ad-nauseam์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํ˜„์žฌ ๊ตฌํ˜„์€ ์‹œ๊ฐ„๋Œ€๋ฅผ ์™„์ „ํžˆ ๋ฌด์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ์“ธ๋ชจ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„๋Œ€๋ฅผ ์ธ์‹ํ•˜๋Š” ๊ตฌํ˜„์ด ๋” ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ›จ์”ฌ ๋” ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค

๋‹ค์‹œ ๋งํ•˜๋ฉด, ๋‹น์‹ ๊ณผ ๋‚ด๊ฐ€ kubernetes cronjob์ด ํ‘œ์ค€ ์‹œ๊ฐ„๋Œ€๋ฅผ ์ง€์›ํ•œ๋‹ค๋Š” ๊ธฐ๋ณธ ์„ค์ •์ด ์žˆ๋‹ค๊ณ  ๋งํ•˜๋ฉด ๋งž์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” "์“ธ๋ชจ์—†๋Š” ๊ฒƒ์— ๊ฐ€๊น๋‹ค"๋Š” ๊ฒƒ์ด ๋„ˆ๋ฌด ๊ฐ•ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ง€์›๋˜๋Š” ์‹œ๊ฐ„๋Œ€ ์ธ์‹ ๊ตฌํ˜„์ด ํ›จ์”ฌ ๋” ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๊ฐ•๋ ฅํžˆ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋‹น์‹ ์˜ ์š”์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์š”์ ์€ ์šฐ๋ฆฌ๊ฐ€ ๋…ผ์˜ํ•˜๊ณ  ์žˆ๋Š” "ํฌํฌ"๊ฐ€ "๋„๋ฆฌ ์ฑ„ํƒ"๋˜์—ˆ๋‹ค๋Š” ์ฆ๊ฑฐ๊ฐ€ ์—†๊ณ  ๋”ฐ๋ผ์„œ kubernetes ํŒ€์ด ์ด๋ฅผ ์ฑ„ํƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์ •๋ง ์œ ๊ฐ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์ด ์ œ๊ฐ€ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. kubernetes์— ํ†ตํ•ฉ ์ฐธ์กฐ.

๋ฒ„๊ทธ๋Š” "์„ฑ์ˆ™ํ•˜๊ณ  ์‹œ๊ฐ„์ด ์ž…์ฆ๋œ" ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ง€์†์ ์œผ๋กœ ๋ฐœ๊ฒฌ๋˜๊ณ  ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค.

์ฒซ์งธ, "์„ฑ์ˆ™ํ•œ" ๋ฐ "์‹œ๊ฐ„์ด ์ž…์ฆ๋œ" ๋‹จ์–ด๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋˜๋Š” ํ•ด๋‹น ์ƒํƒœ๊ณ„์— ๋Œ€ํ•œ ๋ฌธ์žฅ์—์„œ ์„ค ์ž๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋‘˜์งธ, ์–ธ์ œ๋ถ€ํ„ฐ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ๋ฒ„๊ทธ๊ฐ€ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๊นŒ? @fejta-bot์€ ์ž๋™์œผ๋กœ "์ˆ˜์ •"(๋‹ซ๊ธฐ)ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„๊ทธ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ž˜๋ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์–ธ์ œ/์–ด๋–ค ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ–๊ณ /๋Œ“๊ธ€์„ ๋‹ฌ ๊ฒƒ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์ด https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#cron -job-limitations ์•„๋ž˜์— ๋ฌธ์„œํ™”๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ €๋Š”๋Š” Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์ด ์ œ๊ณต ๋ฆฌ๋ˆ…์Šค์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—๋Š” Kubernetes์— ๊ทธ "cronjobs๋Š”"์‹œ๊ฐ„๋Œ€ ์ง€์›์ด ์žˆ์–ด์•ผ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋จผ ๋ฏธ๋ž˜์— Windows์—์„œ Kubernetes(๋˜๋Š” ๋ณ€ํ˜•)๋ฅผ ์‹คํ–‰ํ•  ๊ณ„ํš์ด ์žˆ๋Š” ๋‹น์‚ฌ์ž๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๊ฐœ๋…์„ ๊ฑฐ๋ถ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ? ์ด ๋ฌธ์ œ๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋Š” ๋งค์šฐ ์•ฝํ•œ ์ด์œ . ํ•ด๊ฒฐ๋œ ๋ฌธ์ œ์™€ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œํ•œ "triage/unresolved" ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

Go 1.15 ์ดํ›„๋กœ ์ฝ”์–ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— time/tzdata ํŒจํ‚ค์ง€๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ...?

์•„์นจ 7์‹œ์— ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ €๋… 7์‹œ๊นŒ์ง€ ์˜ค๋ฒ„ ํ”„๋กœ๋น„์ €๋‹ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?
๋‚ด ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ๋Š” ๊ณณ์—๋Š” ์—ฌ๋ฆ„ ์‹œ๊ฐ„๊ณผ ๊ฒจ์šธ ์‹œ๊ฐ„์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ์ „ํ˜€ ์˜์กดํ•  ์ˆ˜ ์—†๋‹ค.

cronjob์œผ๋กœ ์‹œ๊ฐ„๋Œ€๋ฅผ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ด์ƒํ•œ ๊ฒฐ์ •์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ข‹์€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. K8s CronJobs ์‚ฌ์šฉ์„ ์ค‘์ง€ํ•˜๊ณ  ๋Œ€์‹  Apache Airflow๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ํ•œ ์ดํ›„๋กœ ์‚ถ์€ ํ›จ์”ฌ ๋‚˜์•„์กŒ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์™€ ํ•จ๊ป˜!

์ด ๋ฌธ์ œ๋Š” https://github.com/hiddeco/cronjobber์—์„œ ์™ธ๋ถ€์ ์œผ๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

@mattfarina

  1. ์†”๋ฃจ์…˜์ด ๋„๋ฆฌ ์ฑ„ํƒ๋˜๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ(์†Œ๊ทœ๋ชจ, ๋‹ค์ค‘ ํด๋Ÿฌ์Šคํ„ฐ ๋“ฑ ํฌํ•จ) ํ•ต์‹ฌ Kubernetes์— ๋Œ€ํ•ด ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปค๋ฎค๋‹ˆํ‹ฐ ์†”๋ฃจ์…˜์˜ ์ฑ„ํƒ์€ ์–ธ์ œ, ์–ด๋–ป๊ฒŒ ์ธก์ •๋ฉ๋‹ˆ๊นŒ?

@mattfarina @soltysh with KEP-19: ํ‘œ์ค€ ์‹œ๊ฐ„๋Œ€๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•  ๊ฐœ์„  ์‚ฌํ•ญ ์ค‘ ํ•˜๋‚˜๋กœ ์–ธ๊ธ‰ cronjob ์ปจํŠธ๋กค๋Ÿฌ v2 ์— ๋Œ€ํ•œ ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์—ด๊ณ  ์žฌ๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๋ฅผ ๊ณ ๋ ค ์‚ฌํ•ญ/๊ฐœ์„  ๊ฐ€๋Šฅ์„ฑ์œผ๋กœ ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ ‘๊ทผํ•  ๊ฒƒ์ธ์ง€ ๋˜๋Š” ์–ธ์ œ ์ ‘๊ทผํ•  ๊ฒƒ์ธ์ง€๋Š” ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. CronJob GA ์ด์ „์—๋Š” ์ด๋Ÿฌํ•œ ์ผ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  100% ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@soltysh ์•„์ง ์ œ๋Œ€๋กœ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด๋ผ๋Š” ๊ฒƒ์ด ๋„๋ฆฌ ์ž…์ฆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์— ๋Œ€ํ•ด ๊ณต์„ ์ฐจ๋ผ๊ณ  ์ฃผ์žฅํ•˜๋Š” ๊ฒƒ์€ ๋ฉ”์ธํ…Œ์ด๋„ˆ์™€ ์‚ฌ์šฉ์ž ์‚ฌ์ด์˜ ์—„์ฒญ๋‚œ ๋‹จ์ ˆ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

@benlangfeld ์ €๋Š” ์ด์— ๋Œ€ํ•ด ๋งค์šฐ ๊ฐœ๋ฐฉ์ ์ด์ง€๋งŒ ์‹œ๊ฐ„์ด ์—ฌ๊ธฐ์„œ ์ฃผ์š” ์ œํ•œ ์š”์†Œ์ž…๋‹ˆ๋‹ค.์‹ค๋ง:

@benlangfeld ์ €๋Š” ์ด์— ๋Œ€ํ•ด ๋งค์šฐ ๊ฐœ๋ฐฉ์ ์ด์ง€๋งŒ ์‹œ๊ฐ„์ด ์ฃผ์š” ์ œํ•œ ์š”์†Œ์ž…๋‹ˆ๋‹ค ๐Ÿ˜ž

์ด๋ฏธ ์ œ์•ˆ๋œ ์ˆ˜์ • ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ˆ˜๋ฝํ•˜๋ ค๋ฉด ์–ด๋–ค ์ž…๋ ฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ?

์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋‹ค์‹œ ์ž‘์„ฑ๋˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ง€๊ธˆ์˜ ์ฃผ์š” ์ดˆ์ ์ž…๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ์€ ์ƒˆ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ต์ฒดํ•ด์•ผ ํ•  ์˜ค๋ž˜๋œ ๊ฒƒ์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰