• Aiden's Lab แ„‚แ…ฒแ„‰แ…ณแ„…แ…ฆแ„แ…ฅ
  • Posts
  • ๐Ÿ”ญGitOpsแ„…แ…ณแ†ฏ แ„‹แ…ตแ„’แ…ขแ„’แ…กแ„‚แ…ณแ†ซ แ„ƒแ…ฆ แ„แ…ฉแ†จ แ„‘แ…ตแ†ฏแ„‹แ…ญแ„’แ…กแ†ซ แ„‘แ…ตแ†ฏแ„‰แ…ฎ แ„€แ…ขแ„‚แ…งแ†ทแ„€แ…ช แ„‹แ…ญแ†ผแ„‹แ…ฅแ„…แ…ณแ†ฏ แ„Œแ…ฅแ†ผแ„…แ…ตแ„’แ…ขแ„‡แ…ฉแ„Œแ…ก!

๐Ÿ”ญGitOpsแ„…แ…ณแ†ฏ แ„‹แ…ตแ„’แ…ขแ„’แ…กแ„‚แ…ณแ†ซ แ„ƒแ…ฆ แ„แ…ฉแ†จ แ„‘แ…ตแ†ฏแ„‹แ…ญแ„’แ…กแ†ซ แ„‘แ…ตแ†ฏแ„‰แ…ฎ แ„€แ…ขแ„‚แ…งแ†ทแ„€แ…ช แ„‹แ…ญแ†ผแ„‹แ…ฅแ„…แ…ณแ†ฏ แ„Œแ…ฅแ†ผแ„…แ…ตแ„’แ…ขแ„‡แ…ฉแ„Œแ…ก!

GitOpsแ„‹แ…ด แ„‘แ…ตแ†ฏแ„‰แ…ฎ แ„€แ…ขแ„‚แ…งแ†ทแ„€แ…ช แ„‹แ…ญแ†ผแ„‹แ…ฅแ„ƒแ…ณแ†ฏแ„‹แ…ณแ†ฏ แ„‡แ…ฎแ†ซแ„‰แ…ฅแ†จแ„’แ…ขแ„‰แ…ฅ แ„‹แ…กแ†ฏแ„€แ…ต แ„‰แ…ฑแ†ธแ„€แ…ฆ แ„Œแ…ฅแ†ผแ„…แ…ตแ„’แ…ขแ†ปแ„‰แ…ณแ†ธแ„‚แ…ตแ„ƒแ…ก.

์•ˆ๋…•ํ•˜์„ธ์š”, Aidenโ€™s Lab ๋‰ด์Šค๋ ˆํ„ฐ์ž…๋‹ˆ๋‹ค.

GitOps๋Š” DevOps ์—…๊ณ„์—์„œ ๊พธ์ค€ํžˆ ์ฃผ๋ชฉ๋ฐ›๋Š” ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค. GitOps๋ž€, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ถ€ํ„ฐ ์ธํ”„๋ผ ๊ตฌ์„ฑ๊นŒ์ง€ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ Git ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” DevOps ๋ฐฉ๋ฒ•๋ก  ์ค‘ ํ•˜๋‚˜์ธ๋ฐ์š”.

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

์ด๋ฒˆ ์•„ํ‹ฐํด์—์„œ๋Š” ์‹ค์งˆ์ ์œผ๋กœ ๋„์›€์ด ๋˜๋Š” GitOps ๊ด€๋ จ ์ •๋ณด๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์ „๋‹ฌํ•ด๋“œ๋ฆฌ๊ธฐ ์œ„ํ•ด CNCF ์žฌ๋‹จ ๊ณต์ธ GitOps ์ž๊ฒฉ์ฆ Certified GitOps Associate (CGOA)์˜ ์ปค๋ฆฌํ˜๋Ÿผ์„ ์ฐธ๊ณ ํ•ด์„œ ๊ตฌ์„ฑํ–ˆ๋Š”๋ฐ์š”. ํ•ด๋‹น ์ž๊ฒฉ์ฆ์„ ์ค€๋น„ํ•˜๊ณ  ๊ณ„์‹  ๋ถ„๋“ค์—๊ฒŒ๋„ ์œ ์šฉํ•˜๊ฒ ์ฃ ?

์•„๋ž˜์™€ ๊ฐ™์ด GitOps ๊ด€๋ จ 5๊ฐ€์ง€ ์†Œ์ฃผ์ œ์— ๋Œ€ํ•ด ์•Œ๊ธฐ ์‰ฝ๊ฒŒ ํ’€์–ด์„œ ์ •๋ฆฌํ–ˆ์œผ๋‹ˆ, ์ด๋ฒˆ ์•„ํ‹ฐํด์„ ๋๊นŒ์ง€ ์ฝ์œผ์‹œ๋ฉด GitOps์— ๋Œ€ํ•ด ํƒ„ํƒ„ํ•œ ๊ธฐ๋ฐ˜ ์ง€์‹์„ ์–ป์–ด๊ฐ€์‹ค ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค.

  1. GitOps์˜ ํ•ต์‹ฌ ์›์น™

  2. GitOps ๊ด€๋ จ ์šฉ์–ด

  3. GitOps ๋ฐฐํฌ ํŒจํ„ด

  4. GitOps ๊ด€๋ จ ๋ฐฉ๋ฒ•๋ก 

  5. GitOps ๊ด€๋ จ ๋„๊ตฌ

GitOps์˜ ํ•ต์‹ฌ ์›์น™

GitOps์— ๋Œ€ํ•ด ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„  ๊ฐ€์žฅ ๋จผ์ € GitOps์˜ ํ•ต์‹ฌ ์›์น™ 4๊ฐ€์ง€๋ฅผ ์งš๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1. ์„ ์–ธ์ (Declarative) ๊ด€๋ฆฌ

GitOps์˜ ์ฒซ ๋ฒˆ์งธ ์ฃผ์š” ์›์น™์€ ์‹œ์Šคํ…œ์˜ ์ตœ์ข… ์ƒํƒœ๋ฅผ ์†Œ์Šค์ฝ”๋“œ๋กœ, ๋‹ฌ๋ฆฌ ๋งํ•˜์ž๋ฉด ์„ ์–ธ์ (Declarative)์œผ๋กœ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์ด '์–ด๋–ป๊ฒŒ' ์›ํ•˜๋Š” ์ƒํƒœ๋กœ ๋„๋‹ฌํ• ์ง€๋ฅผ ๊ธฐ์ˆ ํ•˜๋Š” ์ ˆ์ฐจ์ (Procedural) ๋ฐฉ์‹๊ณผ ๋‹ฌ๋ฆฌ, '์–ด๋–ค' ์ƒํƒœ๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋ช…์‹œํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•˜๋Š”๋ฐ์š”.

์šฐ๋ฆฌ์—๊ฒŒ ์ต์ˆ™ํ•œ Kubernetes์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜ํ•œ YAML ํŒŒ์ผ์ด ์ด๋Ÿฐ ์„ ์–ธ์  ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GitOps๋Š” ์ด๋ ‡๊ฒŒ ์„ ์–ธ๋œ ์ตœ์ข… ๋ชฉํ‘œ ์ƒํƒœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‹œ์Šคํ…œ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๊ณ ์š”.

2. ๋ฒ„์ „ ๊ด€๋ฆฌ

๋‹ค์Œ ์ฃผ์š” ์›์น™์€ ๋ฒ„์ „ ๊ด€๋ฆฌ์ž…๋‹ˆ๋‹ค. GitOps์—์„œ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋Š” ์ตœ์ข… ๋ชฉํ‘œ ์ƒํƒœ(๋˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์ƒํƒœ๋ผ๊ณ  ํ•ด์„œ Desired State๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.)์— ๋Œ€ํ•œ ๋ชจ๋“  ์ •๋ณด๋Š” Git ์ €์žฅ์†Œ์— ์ €์žฅ ๋ฐ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ตœ์ข… ์ƒํƒœ๋Š” ์˜ค์ง Git ์ €์žฅ์†Œ์—์„œ๋งŒ ์ €์žฅ๋˜๊ณ  ๋ณ€๊ฒฝ๋œ๋‹ค๋Š” ๋œป์ธ๋ฐ์š”. ์ด๋ฅผ ์„ค๊ณ„ ์ด๋ก ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ „๋ฌธ์ ์ธ ๋ง๋กœ ๋ฐ”๊ฟ” ๋งํ•˜๋ฉด, 'Git์ด ๋‹จ์ผ ์ง„์‹ค ๊ณต๊ธ‰์›(Single Source of Truth, SSoT)์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค'๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์ด ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ์ง„์งœ ์ •๋ณด๋Š” ์˜ค์ง Git ํ•œ ๊ณณ์—์„œ๋งŒ ๊ด€๋ฆฌํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฐ Desired State๋Š” Git ํžˆ์Šคํ† ๋ฆฌ์— ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ๊ฐ ๋ฒ„์ „์ด ๊ธฐ๋ก๋˜๋Š”๋ฐ์š”. ๊ทธ ๋•์— ํŠน์ • ์ƒํƒœ๊ฐ€ ์–ธ์ œ, ์™œ, ์–ด๋–ป๊ฒŒ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์ถ”์ ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ˆ˜์ • ํ›„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์ด์ „ ์ƒํƒœ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๋กค๋ฐฑ(Rollback)ํ•˜๊ธฐ๋„ ์šฉ์ดํ•˜์ฃ .

3. Pull ๋ฐฉ์‹ ์ž๋™ํ™”

Pull ๋ฐฉ์‹ ์ž๋™ํ™”๋ž€ ์ „ํ†ต์ ์ธ ์ง€์†์  ๋ฐฐํฌ(CD)์˜ ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹๊ณผ GitOps์˜ ์—…๋ฐ์ดํŠธ ๋ฐฉ์‹์€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์—์„œ ์ถœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ๋Š” CD ํŒŒ์ดํ”„๋ผ์ธ์€ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฐ€์–ด๋„ฃ๋Š”(Push) ๋ฐฉ์‹์ธ๋ฐ์š”. GitOps๋Š” ์ด์™€ ๋ฐ˜๋Œ€๋กœ, ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์— ์„ค์น˜๋œ Argo CD๋‚˜ Flux์™€ ๊ฐ™์€ ์—์ด์ „ํŠธ๊ฐ€ Git ์ €์žฅ์†Œ๋กœ๋ถ€ํ„ฐ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ตœ์‹  ์ƒํƒœ๋ฅผ ๋‹น๊ฒจ์˜ค๋Š”(Pull) ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๊ฑด ๊ธฐ์กด์˜ DevOps ๋ฐฉ์‹๊ณผ ํ™•์—ฐํžˆ ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Pull ๋ฐฉ์‹ ์ž๋™ํ™”๊ฐ€ GitOps์˜ ์ฃผ์š” ์›์น™์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€ Pull ๋ฐฉ์‹์€ ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์— ์œ„์น˜ํ•œ ์‹œ์Šคํ…œ(์˜ˆ: CD ํŒŒ์ดํ”„๋ผ์ธ)์— ํด๋Ÿฌ์Šคํ„ฐ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ž ์žฌ์ ์ธ ๋ณด์•ˆ ์œ„ํ—˜๋„ ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฒฝ๊ณ„๋ฅผ ๋”์šฑ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ณ , ๊ณต๊ฒฉ ํ‘œ๋ฉด์„ ์ค„์ด๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด์ฃ .

4. ์ง€์†์  ์กฐ์ •(Continuously Reconciled)

GitOps์˜ ๋งˆ์ง€๋ง‰ ํ•ต์‹ฌ ์›์น™์ธ ์ง€์†์  ์กฐ์ •์€, ํด๋Ÿฌ์Šคํ„ฐ์˜ ์‹ค์ œ ์ƒํƒœ(Actual State)๊ฐ€ Git์—์„œ ์ •์˜๋œ ์ตœ์ข… ๋ชฉํ‘œ ์ƒํƒœ(Desired State)์™€ ์ผ์น˜ํ•  ๋•Œ๊นŒ์ง€ ๋Š์ž„์—†์ด ์กฐ์ •(Reconcile)ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ Argo CD๋‚˜ Flux์™€ ๊ฐ™์€ GitOps ์—์ด์ „ํŠธ๊ฐ€ ์ด ๋‘ ์ƒํƒœ๋ฅผ ๊ณ„์† ๋น„๊ตํ•˜๋‹ค๊ฐ€ ๋งŒ์•ฝ ๋ถˆ์ผ์น˜(๋‚˜์ค‘์— ์–ธ๊ธ‰ํ•˜๊ฒ ์ง€๋งŒ, ์ด๋Ÿฐ ์ƒํƒœ ๋ถˆ์ผ์น˜๋ฅผ State Drift๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.)๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์ž๋™์œผ๋กœ ์กฐ์ •ํ•˜๊ธฐ๋„ ํ•˜์ฃ .

์ง€์†์ ์œผ๋กœ ์กฐ์ •์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ณผ์ •์€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ผ๊ด€์„ฑ๊ณผ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ํ•ต์‹ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.

GitOps ๊ด€๋ จ ์šฉ์–ด

์œ„์—์„œ GitOps์˜ ํ•ต์‹ฌ ์›์น™์„ ์„ค๋ช…ํ•˜๋Š” ๊ณผ์ •์—์„œ ์•„๋งˆ ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์šฉ์–ด๋ฅผ ๋งŒ๋‚˜์…จ์„ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ์š”. ๊ทธ๋ž˜์„œ GitOps์—์„œ ๊ผญ ์•Œ์•„์•ผ ํ•˜๋Š” ํ•ต์‹ฌ ์šฉ์–ด 4๊ฐ€์ง€๋ฅผ ์งš๊ณ  ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค.

1. Desired State

ํด๋Ÿฌ์Šคํ„ฐ์˜ Desired State๋ž€, ๊ฐœ๋ฐœ์ž ๋˜๋Š” ๊ด€๋ฆฌ์ž๊ฐ€ ์ตœ์ข… ๋ชฉํ‘œ๋กœ ์ •์˜ํ•œ ์ƒํƒœ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ GitOps์—์„  Git ์ €์žฅ์†Œ์— ์ฝ”๋“œ๋กœ ์ •์˜๋œ ์ตœ์ข… ๋ชฉํ‘œ ์ƒํƒœ๋ฅผ ์˜๋ฏธํ•˜์ฃ .

Git ์ €์žฅ์†Œ์—์„œ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— Desired State์˜ ๋ณ€๊ฒฝ ์ด๋ ฅ๋„ ๋‹น์—ฐํžˆ ๊ด€๋ฆฌ์™€ ์ถ”์ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

GitOps์˜ ๋ชจ๋“  ํ™œ๋™์€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์‹ค์ œ ์ƒํƒœ(Actual State)๋ฅผ Desired State์™€ ์ผ์น˜์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

2. State Drift

State Drift(์ƒํƒœ ๋“œ๋ฆฌํ”„ํŠธ)๋Š” Git ์ €์žฅ์†Œ์— ์„ ์–ธ๋œ Desired State์™€ ํ˜„์žฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์‹ค์ œ ์ƒํƒœ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ํ˜„์ƒ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ์ž์— ์˜ํ•œ ์ฝ”๋“œ ์ˆ˜๋™ ๋ณ€๊ฒฝ์ด๋‚˜ ์„ค์ • ์˜ค๋ฅ˜, ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ์žฅ์•  ๋“ฑ ๋‹ค์–‘ํ•œ ์›์ธ์œผ๋กœ State Drift๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”.

Argo CD๋‚˜ Flux ๊ฐ™์€ GitOps ์—์ด์ „ํŠธ๋Š” ์ด๋Ÿฐ Drift๋ฅผ ์ง€์†์ ์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ , ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฒฝ๊ณ  ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

3. Feedback Loop

GitOps์˜ ๋งˆ์ง€๋ง‰ ํ•ต์‹ฌ ์›์น™์—์„œ๋„ ์–ธ๊ธ‰ํ–ˆ๋˜ '์กฐ์ •(Reconcile)์˜ ๋ฐ˜๋ณต'์€ Feedback Loop๋ผ๋Š” ๊ฐœ๋…์„ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Feedback Loop๋ž€ ์ง€์†์ ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์‹ค์ œ ์ƒํƒœ๋ฅผ ์ธก์ •ํ•˜๊ณ , ์ด๋ฅผ Desired State์™€ ๋น„๊ตํ•˜์—ฌ ๊ทธ ์ฐจ์ด๋ฅผ ์ค„์ด๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์™ธ๋ถ€์˜ ๋ณ€ํ™”๋‚˜ ๋‚ด๋ถ€์˜ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์•ˆ์ •์ ์ธ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์ฃ .

4. Rollback

ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ ค์•ผ ํ•  ๋•Œ, GitOps๋Š” ์•„์ฃผ ํšจ๊ณผ์ ์œผ๋กœ Rollbackํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Desired State๊ฐ€ Git์—์„œ ๊ด€๋ฆฌ๋˜๋ฏ€๋กœ, git revert๋‚˜ ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ๋Š” git reset ๋ช…๋ น์–ด๋กœ ์ด์ „ ์ปค๋ฐ‹์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ธ๋ฐ์š”.

์ด๋ ‡๊ฒŒ Rollback๋˜๋ฉด GitOps ์—์ด์ „ํŠธ๊ฐ€ ๊ทธ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํ•ด๋‹น ๋ฒ„์ „์œผ๋กœ ์ž๋™ ๋ณต๊ตฌํ•˜๋ฏ€๋กœ ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ธ ์žฅ์•  ๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

GitOps ๋ฐฐํฌ ํŒจํ„ด

GitOps ๋ฐฉ๋ฒ•๋ก ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐํฌ ํŒจํ„ด์€ ๋‹ค์–‘ํ•œ๋ฐ์š”. ๊ทธ ์ค‘์—์„œ๋„ GitOps์˜ ํ•ต์‹ฌ ๋ฐฐํฌ ํŒจํ„ด 4๊ฐ€์ง€๋ฅผ ์ปดํŒฉํŠธํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1. ๋ฐฐํฌ ๋ฐ ๋ฆด๋ฆฌ์ฆˆ ํŒจํ„ด

  • ํ™˜๊ฒฝ๋ณ„ ๋ธŒ๋žœ์น˜ ํŒจํ„ด

    • ๊ฐœ๋ฐœ(dev), ์Šคํ…Œ์ด์ง•(staging), ์šด์˜(prod) ๋“ฑ ๊ฐ ๋ฐฐํฌ ํ™˜๊ฒฝ์— ํ•ด๋‹นํ•˜๋Š” ๋ณ„๋„์˜ Git ๋ธŒ๋žœ์น˜๋ฅผ ์šด์˜ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

    • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋Œ€๊ฐœ Pull Request๋ฅผ ํ†ตํ•ด dev์—์„œ staging์œผ๋กœ, ๋‹ค์‹œ staging์—์„œ prod ์ˆœ์„œ๋กœ ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค.

    • ๊ฐ ํ™˜๊ฒฝ์˜ ์ƒํƒœ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๊ฒฉ๋ฆฌํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์žฅ์ ์ž…๋‹ˆ๋‹ค.

  • ํ™˜๊ฒฝ๋ณ„ ๋””๋ ‰ํ† ๋ฆฌ ํŒจํ„ด

    • ์—ฌ๋Ÿฌ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋‹จ์ผ main ๋ธŒ๋žœ์น˜ ๋‚ด์—์„œ overlays/dev, overlays/prod์™€ ๊ฐ™์ด ๊ฐ ํ™˜๊ฒฝ์— ํ•ด๋‹นํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด ์„ค์ •์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

    • Kustomize์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ณตํ†ต๋œ ๊ธฐ๋ณธ ์„ค์ •์— ๊ฐ ํ™˜๊ฒฝ๋ณ„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ง์”Œ์šฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

    • ๋ธŒ๋žœ์น˜ ๊ด€๋ฆฌ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์žฅ์ ์ž…๋‹ˆ๋‹ค.

  • App of Apps ํŒจํ„ด

    • ๋‹ค์ˆ˜์˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๊ณ  ๊ด€๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ์œ ์šฉํžˆ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

    • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•˜์œ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ํ•˜๋‚˜์˜ ์ƒ์œ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‘๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

    • Agro CD์™€ ๊ฐ™์€ ๋„๊ตฌ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ณต์žกํ•œ ์‹œ์Šคํ…œ์˜ ๋ฐฐํฌ๋ฅผ ์ค‘์•™์—์„œ ์ผ๊ด€๋˜๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์žฅ์ ์ž…๋‹ˆ๋‹ค.

2. ์ ์ง„์  ๋ฐฐํฌ(Progressive Delivery) ํŒจํ„ด

  • ์นด๋‚˜๋ฆฌ ๋ฐฐํฌ ํŒจํ„ด

    • ์ƒˆ๋กœ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฒ„์ „์„ ์ผ๋ถ€ ์‚ฌ์šฉ์ž์—๊ฒŒ๋งŒ ๋จผ์ € ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

    • Git ์ €์žฅ์†Œ์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์—์„œ ํŠธ๋ž˜ํ”ฝ ๊ฐ€์ค‘์น˜(์˜ˆ: stable: 90%, canary: 10%)๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ƒˆ ๋ฒ„์ „์˜ ์•ˆ์ •์„ฑ์„ ์‹ค์ œ ํŠธ๋ž˜ํ”ฝ์œผ๋กœ ๊ฒ€์ฆํ•˜์—ฌ ์œ„ํ—˜์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์žฅ์ ์ž…๋‹ˆ๋‹ค.

  • Blue/Green ๋ฐฐํฌ ํŒจํ„ด

    • ํ˜„์žฌ ์šด์˜ ์ค‘์ธ ๋ฒ„์ „(Blue)๊ณผ ๋™์ผํ•œ ํ™˜๊ฒฝ์— ์ƒˆ๋กœ์šด ๋ฒ„์ „(Green)์„ ๋ฐฐํฌํ•œ ํ›„, ํŠธ๋ž˜ํ”ฝ์„ ํ•œ ๋ฒˆ์— ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

    • GitOps ํ™˜๊ฒฝ์—์„œ๋Š” Git์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ ๋ผ์šฐํŒ… ๋Œ€์ƒ์„ Green ๋ฒ„์ „์œผ๋กœ ๋ณ€๊ฒฝํ•จ์œผ๋กœ์จ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ฆ‰์‹œ ํŠธ๋ž˜ํ”ฝ์„ ๋‹ค์‹œ Blue ๋ฒ„์ „์œผ๋กœ ๋˜๋Œ๋ฆด ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค์šดํƒ€์ž„ ์—†๋Š” ์•ˆ์ „ํ•œ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด ์žฅ์ ์ž…๋‹ˆ๋‹ค.

3. Pull vs Event-driven

์šฐ๋ฆฌ๊ฐ€ ์œ„์—์„œ ์‚ดํŽด๋ณธ Pull ๋ฐฉ์‹์€ ์ •ํ•ด์ง„ ์ฃผ๊ธฐ๋งˆ๋‹ค Git ์ €์žฅ์†Œ ๋‚ด ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— Event-driven ๋ฐฉ์‹์€ ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋™๊ธฐํ™”๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

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

๊ทธ๋ž˜์„œ Event-driven ๋ฐฉ์‹์ด ๋ณด๋‹ค ๋” ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ๊ณผ ์‹ ์†ํ•œ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

4. ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด

GitOps ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋‹ด๋Š” ์ €์žฅ์†Œ์™€, ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐฐํฌ ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•œ k8s ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๋‹ด๋Š” ์ €์žฅ์†Œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฐฉ์‹์€ ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ(Seperation of Concerns)๋ผ๋Š” ์›์น™์— ๋”ฐ๋ผ, ๊ฐœ๋ฐœํŒ€์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ์— ์ง‘์ค‘ํ•˜๊ณ  ์šด์˜ํŒ€์€ ๋ฐฐํฌ์™€ ์šด์˜์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š”๋ฐ์š”.

๊ฑฐ๊ธฐ์— ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋” ์—„๊ฒฉํžˆ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ๋ณด์•ˆ์—๋„ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

GitOps ๊ด€๋ จ ๋ฐฉ๋ฒ•๋ก 

์ด ์‹œ์ ์—์„œ GitOps์™€ ๊นŠ์ด ์—ฐ๊ด€๋œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๋ก ์„ ํ•จ๊ป˜ ๋ณด๋ฉด GitOps์— ๋Œ€ํ•ด ๋” ํšจ๊ณผ์ ์œผ๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—” GitOps ๊ด€๋ จ ์ฃผ์š” ๋ฐฉ๋ฒ•๋ก  4๊ฐ€์ง€๋ฅผ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

1. Configuration as Code (CaC)

CaC๋Š” ์ธํ”„๋ผ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์„ฑ์„ ์Šคํฌ๋ฆฝํŠธ๋‚˜ ์†Œ์Šค์ฝ”๋“œ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค. GitOps๋Š” Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ YAML ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ตฌ์„ฑ์„ ์ฝ”๋“œ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์ •์˜ํ•˜๊ณ , Git์œผ๋กœ ๋ฒ„์ „ ๊ด€๋ฆฌํ•˜์—ฌ CaC๋ฅผ ์‹คํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”.

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

2. Infrastructure as Code (IaC)

VM์ด๋‚˜ ๋„คํŠธ์›Œํฌ์™€ ๊ฐ™์€ ์ธํ”„๋ผ๋ฅผ ์ฝ”๋“œ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ธ IaC ์—ญ์‹œ GitOps์—์„œ ์†์‰ฝ๊ฒŒ ์‹คํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Terraform์ด๋‚˜ Pulumi์™€ ๊ฐ™์€ IaC ๋„๊ตฌ๋กœ ์ƒ์„ฑํ•œ ์ธํ”„๋ผ ์ฝ”๋“œ๋ฅผ Git ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋ฉด์„œ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ธํ”„๋ผ ์ฝ”๋“œ๋„ ๋”์šฑ ์•ˆ์ •์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

๊ทธ๋ž˜์„œ GitOps์™€ IaC๋Š” ํ•จ๊ป˜ ํ™œ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

3. DevOps ๋ฐ DevSecOps

GitOps๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ Git ์ €์žฅ์†Œ์— ์ฝ”๋“œ๋ฅผ Pushํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ๋ฐฐํฌ์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ , ํด๋Ÿฌ์Šคํ„ฐ ์šด์˜์ž๋Š” Git์„ ํ†ตํ•ด ๋ชจ๋“  ๋ฐฐํฌ ์ƒํƒœ๋ฅผ ๋ช…ํ™•ํžˆ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด ํŒ€ ๊ฐ„์˜ ํ˜‘์—…์„ ์ด‰์ง„์‹œํ‚ต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ GitOps๋Š” DevOps๋ฅผ Git ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•œ ๋ฐฉ๋ฒ•๋ก ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ฃ .

๋˜ํ•œ, ์ •์  ๋ถ„์„์ด๋‚˜ ์ทจ์•ฝ์  ์Šค์บ”๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ๊ฒ€์‚ฌ๋„ Git Pull Request ๊ธฐ๋ฐ˜์˜ ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ์— ํฌํ•จ๋˜๊ธฐ ์šฉ์ดํ•ฉ๋‹ˆ๋‹ค. Git ์ €์žฅ์†Œ์˜ ์ ‘๊ทผ ์ œ์–ด์™€ ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๊ทœ์น™ ๋“ฑ์€ ๋ˆ„๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์—„๊ฒฉํžˆ ํ†ต์ œํ•  ์ˆ˜๋„ ์žˆ๊ณ ์š”. ๊ทธ๋ž˜์„œ GitOps๋Š” ๊ฐœ๋ฐœ ์ดˆ๊ธฐ ๋‹จ๊ณ„๋ถ€ํ„ฐ ๋ณด์•ˆ์„ ๊ณ ๋ คํ•˜๋Š” DevSecOps ๋ฌธํ™”๋ฅผ ์‹คํ˜„ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

4. ์ง€์†์  ํ†ตํ•ฉ(CI)๊ณผ ์ง€์†์  ๋ฐฐํฌ(CD)

GitOps์—์„œ์˜ CI์™€ CD์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

GitOps ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ CI ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ฃผ์š” ์—ญํ• ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค์ฝ”๋“œ ๋นŒ๋“œ๋ถ€ํ„ฐ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ/ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ, ๊ทธ๋ฆฌ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ์„ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ด๋ฏธ์ง€๋กœ ๋งŒ๋“ค์–ด ์ด๋ฏธ์ง€ ์ €์žฅ์†Œ์— Pushํ•˜๋Š” ๊ฒƒ๊นŒ์ง€์ž…๋‹ˆ๋‹ค.์ด๋ ‡๊ฒŒ GitOps์—์„œ์˜ CI์˜ ์ฑ…์ž„์€ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ์š”. ๋ฐ”๊ฟ” ๋งํ•˜์ž๋ฉด, CI ํŒŒ์ดํ”„๋ผ์ธ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํด๋Ÿฌ์Šคํ„ฐ์— ์ง์ ‘ ๋ฐฐํฌํ•˜์ง„ ์•Š์Šต๋‹ˆ๋‹ค.

GitOps์—์„œ CD์˜ ์—ญํ• ์€ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” GitOps ์—์ด์ „ํŠธ๊ฐ€ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐœ๋ฐœ์ž๊ฐ€ Git ์ €์žฅ์†Œ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๊ฒฝ์šฐ, GitOps ์—์ด์ „ํŠธ๊ฐ€ ํ•ด๋‹น ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•ด์„œ ์ƒˆ๋กœ์šด Kubernetes ๋ฆฌ์†Œ์Šค๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•˜๋Š” ๊ฑฐ์ฃ .

์ด๋ ‡๊ฒŒ GitOps์—์„œ ์™ธ๋ถ€ CI ํŒŒ์ดํ”„๋ผ์ธ์€ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘๊ทผํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€๋กœ ์นจํˆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ๋ฉด์„ ์ค„์—ฌ ๋ณด์•ˆ ์ธก๋ฉด์—์„œ ์œ ๋ฆฌํ•ด์ง‘๋‹ˆ๋‹ค.

GitOps ๊ด€๋ จ ๋„๊ตฌ

์—ฌ๊ธฐ๊นŒ์ง€ ์˜ค์‹œ๋А๋ผ ๊ณ ์ƒ ๋งŽ์œผ์…จ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ์•„ํ‹ฐํด์˜ ๋งˆ์ง€๋ง‰ ์„น์…˜์œผ๋กœ, GitOps ๊ด€๋ จ ๋„๊ตฌ๋“ค์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ ๋‚ฏ์ต์€ ๋„๊ตฌ๋“ค๋„ ๋งŒ๋‚˜์‹ค ๊ฑฐ์˜ˆ์š”.

๋งค๋‹ˆํŽ˜์ŠคํŠธ ํฌ๋งคํŒ…(Formatting) ๋ฐ ํŒจํ‚ค์ง•(Packaging)

ํฌ๋งคํŒ…์ด๋ผ ํ•จ์€ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์›ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฑธ ๋งํ•ฉ๋‹ˆ๋‹ค. ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํฌ๋งคํŒ…์ด๋ผ๊ณ  ํ•˜๋ฉด ๋งคํ‹ฐํŽ˜์ŠคํŠธ ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜์‹œํ‚ค๋Š” ์ž‘์—…์„ ์˜๋ฏธํ•˜์ฃ .

๊ฐ ํ™˜๊ฒฝ๋งˆ๋‹ค Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ YAML ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•  ๊ฒฝ์šฐ, ์ผ์ผ์ด ํ™˜๊ฒฝ์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ง์ ‘ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฑด ์†์ด ๋งŽ์ด ๊ฐ€๊ณ  ์‹ค์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ๋„ ์‰ฌ์šด๋ฐ์š”. ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํฌ๋งคํŒ… ํˆด์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ Kustomize๊ฐ€ ์žˆ์ฃ .

Kustomize๋Š” Base๊ฐ€ ๋˜๋Š” YAML ํŒŒ์ผ์„ dev, staging, prod์™€ ๊ฐ™์€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์— ๋งž์ถฐ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•ด ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. Kustomize๋Š” ์ด๋ฏธ ์ง€๋‚œ๋ฒˆ์— ๋‹ค๋ฃฌ ์ ์ด ์žˆ๋Š”๋ฐ์š”, ๋งŒ์•ฝ Kustomize์˜ ํ•ต์‹ฌ ์ปจ์…‰๊ณผ ์‹ค์Šต ๊ฐ€์ด๋“œ๊ฐ€ ๊ถ๊ธˆํ•˜์‹œ๋‹ค๋ฉด ์ด์ „ ์•„ํ‹ฐํด์—์„œ ํ™•์ธํ•ด๋ณด์„ธ์š”.

Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‹ค์–‘ํ•œ Kubernetes ๋ฆฌ์†Œ์Šค๋กœ ๊ตฌ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค๋ฅธ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด ๊ณต์œ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ๊ตฌ์„ฑ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ YAML ํŒŒ์ผ์„ ์ง์ ‘ ์˜ฎ๊ฒจ์•ผ ํ• ๊นŒ์š”? ๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ, ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ๋“ค์„ ํ•˜๋‚˜์˜ ๋‹จ์œ„๋กœ ๋ฌถ์–ด์„œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ํŽธ๋ฆฌํ•˜์ง€ ์•Š์„๊นŒ์š”? ์ด๋Ÿฐ ๋ฌธ์ œ ์˜์‹์—์„œ ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒจํ‚ค์ง•์ด๊ณ , ๋Œ€ํ‘œ์ ์ธ ํˆด๋กœ Helm์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Helm์€ Kubernetes ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ผ๊ณ ๋„ ํ•˜๋Š”๋ฐ์š”. ์šฐ๋ฆฌ๊ฐ€ Python์œผ๋กœ ๊ฐœ๋ฐœํ•  ๋•Œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋Š” Pip์ฒ˜๋Ÿผ, Helm์€ ์›๊ฒฉ์— ์ €์žฅ๋œ Kubernetes ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์†์‰ฝ๊ฒŒ ๋‹ค์šด๋กœ๋“œ๋ฐ›๊ณ  ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

Helm์œผ๋กœ ๊ณต์œ ๋˜๋Š” Kubernetes ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฆฌ์†Œ์Šค ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ๋“ค์˜ ๋‚ด์šฉ์€ ๊ณ ์ •๋˜์–ด ์žˆ์ง€ ์•Š๊ณ  ํŠน์ • ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋„๋ก ํ…œํ”Œ๋ฆฟํ™”๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋™์ผํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๊ณ  ํ•ด๋„ ํด๋Ÿฌ์Šคํ„ฐ๋‚˜ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์„ค์ •์œผ๋กœ ์‰ฝ๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์žฅ์ ์ž…๋‹ˆ๋‹ค.

GitOps ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ๋Š” Kustomize์™€ Helm์ด ์ฐธ์กฐํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ/ํ™˜๊ฒฝ ์ „์šฉ ์„ค์ • ๊ฐ’๋“ค์„ Git์— ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•จ์œผ๋กœ์จ ๋ณ€๊ฒฝ ์ด๋ ฅ ๊ธฐ๋ก ๋ฐ ์ถ”์ ์„ ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

State Store ์‹œ์Šคํ…œ

ํด๋Ÿฌ์Šคํ„ฐ์˜ Desired State๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ์‹œ์Šคํ…œ์„ State Store๋ผ๊ณ  ํ•˜๋Š”๋ฐ์š”. ์•„๋งˆ ๋ˆˆ์น˜์ฑ„์…จ๊ฒ ์ง€๋งŒ, GitOps์—์„œ State Store๋Š” Git ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์ด๋ ฅ ์ถ”์ ์ด๋‚˜ Pull Request๋ฅผ ํ†ตํ•œ ํ˜‘์—…์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— Git์€ State Store๋กœ ์†์ƒ‰์ด ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์ƒํƒœ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ๋„ ํ•„์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ง๊ด€์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ๋„ ์žฅ์ ์ž…๋‹ˆ๋‹ค.

์กฐ์ • ์—”์ง„(Reconciliation Engine)

GitOps์˜ ํ•ต์‹ฌ ์š”์†Œ๋ผ ํ•  ์ˆ˜ ์žˆ๋Š” ์กฐ์ • ์—”์ง„์€ Argo CD์™€ Flux๊ฐ€ ๋Œ€ํ‘œ์ ์ž…๋‹ˆ๋‹ค.

Argo CD๋Š” ์ง๊ด€์ ์ธ ์›น UI๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐฐํฌ ์ƒํƒœ์™€ ๋™๊ธฐํ™” ์ƒํƒœ, ๋ฆฌ์†Œ์Šค ๊ด€๊ณ„ ๋“ฑ์„ ํ•œ ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ณ , ์—ฌ๋Ÿฌ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ค‘์•™์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. GitOps ๋ฐฐํฌ ํŒจํ„ด์—์„œ ์‚ดํŽด๋ดค๋˜ App of Apps ํŒจํ„ด๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Flux๋Š” GitOps Toolkit์ด๋ผ๋Š” ๋…๋ฆฝ๋œ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ GitOps ๋„์ž…์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ์„ ํƒํ•ด์„œ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์œ ์—ฐํ•˜๋‹ค๋Š” ๊ฒƒ์ด ํŠน์ง•์ธ๋ฐ์š”.

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

์•Œ๋ฆผ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•œ ์ƒํ˜ธ์šด์šฉ์„ฑ(Interoperability with Notification)

๋Œ€๋ถ€๋ถ„์˜ GitOps ๋„๊ตฌ๋Š” Slack์ด๋‚˜ Microsoft Teams, ์ด๋ฉ”์ผ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์•Œ๋ฆผ ์ฑ„๋„๊ณผ ์—ฐ๋™ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ์„ฑ๊ณต์ด๋‚˜ State Drift ๊ฐ์ง€, ๋™๊ธฐํ™” ์‹คํŒจ ๊ฐ™์€ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‹ด๋‹น์ž์—๊ฒŒ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์•Œ๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์ฃ .

์ด๋Ÿฐ ์•Œ๋ฆผ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•œ ์ƒํ˜ธ์šด์šฉ์„ฑ ๋•๋ถ„์— ํŒ€์€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์ธ์ง€ํ•˜๊ณ  ํ•„์š”ํ•œ ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋งˆ๋ฌด๋ฆฌ

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

๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ GitOps๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ์— ํ•„์ˆ˜์ ์ธ ๊ฐœ๋…๊ณผ ์šฉ์–ด๋“ค์„ ์ด์ •๋ฆฌํ•ด๋ดค๋Š”๋ฐ์š”. ์ด๋ฒˆ ๊ธฐํšŒ์— GitOps์— ๋Œ€ํ•ด ๊ฐ์„ ํ™•์‹คํ•˜๊ฒŒ ์žก์œผ์…จ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๋ณธ ์•„ํ‹ฐํด์„ ์ฝ๊ณ  GitOps์— ๋Œ€ํ•ด ํฅ๋ฏธ๊ฐ€ ๋” ์ƒ๊ธฐ์…จ๋‹ค๋ฉด Argo CD์™€ Flux๊ฐ€ ๊ฐ๊ฐ GitOps๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€ ๊ทธ ์ฐจ์ด์ ์„ ์•Œ์•„๋ณด์‹œ๋Š” ๊ฑธ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค. GitOps์— ๋Œ€ํ•œ ์ด๋ก  ์ง€์‹์„ ๋„˜์–ด์„œ GitOps๊ฐ€ ์–ด๋–ป๊ฒŒ ์“ฐ์ด๋Š”์ง€ ๋” ๊นŠ์ด ์ดํ•ดํ•˜์‹œ๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”.

๊ทธ๋Ÿผ ๋‹ค์Œ ์•„ํ‹ฐํด์—์„œ ๋” ํฅ๋ฏธ๋กœ์šด ์ฃผ์ œ๋กœ ์ฐพ์•„์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

โœจ์ด๋ฒˆ ๋‰ด์Šค๋ ˆํ„ฐ๋Š” ์–ด๋– ์…จ๋‚˜์š”?

์ด๋ฒˆ ๊ธ€์—์„œ ๋‹ค๋ฃฌ ์ฃผ์ œ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”! ๋‰ด์Šค๋ ˆํ„ฐ๋ฅผ ๋” ๋‚˜์€ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜ ํผ์—์„œ ์งง์€ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ณ  ์žˆ์–ด์š”.

๐Ÿ‘‰ ํ”ผ๋“œ๋ฐฑ ๋ณด๋‚ด๊ธฐ (1~2๋ถ„ ์†Œ์š”)

์—ฌ๋Ÿฌ๋ถ„๋“ค์˜ ์†Œ์ค‘ํ•œ ์˜๊ฒฌ์€ Aidenโ€™s Lab ๋‰ด์Šค๋ ˆํ„ฐ์—๊ฒŒ ํฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค!

๐Ÿ”ญAidenโ€™s Lab์—์„œ ๋” ๋งŽ์€ ์•„ํ‹ฐํด์„ ๋งŒ๋‚˜๋ณด์„ธ์š”

๋ฐœํ–‰๋œ ๋‰ด์Šค๋ ˆํ„ฐ๋ฅผ ์•„์นด์ด๋น™ํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋ฅผ ์šด์˜ ์ค‘์ž…๋‹ˆ๋‹ค.