OpenShift์šฉ GitOps ์†Œ๊ฐœ

์˜ค๋Š˜์€ GitOps์˜ ์›์น™๊ณผ ๋ชจ๋ธ, ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๋ชจ๋ธ์ด OpenShift ํ”Œ๋žซํผ์—์„œ ๊ตฌํ˜„๋˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๋Œ€ํ™”ํ˜• ๊ฐ€์ด๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งํฌ.

OpenShift์šฉ GitOps ์†Œ๊ฐœ

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

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

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

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

GitOps ์›์น™

  • ์‹œ์Šคํ…œ ์ •์˜๋Š” ์†Œ์Šค ์ฝ”๋“œ๋กœ ์„ค๋ช…๋ฉ๋‹ˆ๋‹ค.

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

  • ์›ํ•˜๋Š” ์‹œ์Šคํ…œ ์ƒํƒœ์™€ ๊ตฌ์„ฑ์ด Git์—์„œ ์„ค์ •๋˜๊ณ  ๋ฒ„์ „์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

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

  • ํ’€ ์š”์ฒญ์„ ํ†ตํ•ด ๊ตฌ์„ฑ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Git ํ’€ ์š”์ฒญ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ €์žฅ์†Œ์˜ ๊ตฌ์„ฑ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ ์šฉ๋˜๋Š” ๋ฐฉ์‹์„ ์‰ฝ๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒ€ํ† ๋ฅผ ์œ„ํ•ด ๋‹ค๋ฅธ ํŒ€ ๊ตฌ์„ฑ์›์—๊ฒŒ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜ CI ํ…Œ์ŠคํŠธ ๋“ฑ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋™์‹œ์— ๊ด€๋ฆฌ ๊ถŒํ•œ์„ ์ขŒ์šฐ๋กœ ๋ถ„๋ฐฐํ•  ํ•„์š”๋„ ์—†์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ปค๋ฐ‹ํ•˜๋ ค๋ฉด ํ•ด๋‹น ๊ตฌ์„ฑ์ด ์ €์žฅ๋œ Git ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ๊ถŒํ•œ๋งŒ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • ์ œ์–ด๋˜์ง€ ์•Š๋Š” ๊ตฌ์„ฑ ๋“œ๋ฆฌํ”„ํŠธ ๋ฌธ์ œ ํ•ด๊ฒฐ

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

OpenShift์šฉ GitOps ๋ชจ๋ธ

ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋ฆฌ์†Œ์Šค ์กฐ์ •์ž

์ด ๋ชจ๋ธ์— ๋”ฐ๋ฅด๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” Git ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ Kubernetes ๋ฆฌ์†Œ์Šค(YAML ํŒŒ์ผ)๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์‹ค์ œ ๋ฆฌ์†Œ์Šค์™€ ๋น„๊ตํ•˜๋Š” ์ผ์„ ๋‹ด๋‹นํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถˆ์ผ์น˜๊ฐ€ ๊ฐ์ง€๋˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์•Œ๋ฆผ์„ ๋ณด๋‚ด๊ณ  ๋ถˆ์ผ์น˜๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•œ ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด GitOps ๋ชจ๋ธ์€ Anthos Config Management ๋ฐ Weaveworks Flux์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

OpenShift์šฉ GitOps ์†Œ๊ฐœ

์™ธ๋ถ€ ์ž์› ์กฐ์ •์ž(ํ‘ธ์‹œ)

์ด ๋ชจ๋ธ์€ "Git ์ €์žฅ์†Œ - Kubernetes ํด๋Ÿฌ์Šคํ„ฐ" ์Œ์—์„œ ๋ฆฌ์†Œ์Šค ๋™๊ธฐํ™”๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ด์ „ ๋ชจ๋ธ์˜ ๋ณ€ํ˜•์œผ๋กœ ๊ฐ„์ฃผ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฐจ์ด์ ์€ ๊ด€๋ฆฌ๋˜๋Š” ๊ฐ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ž์ฒด ๋ณ„๋„์˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ฐ€์งˆ ํ•„์š”๋Š” ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Git - k8s ํด๋Ÿฌ์Šคํ„ฐ ์Œ์€ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋™๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” CRD(์‚ฌ์šฉ์ž ์ •์˜ ๋ฆฌ์†Œ์Šค ์ •์˜)๋กœ ์ •์˜๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋ธ ๋‚ด์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” CRD์— ์ง€์ •๋œ Git ์ €์žฅ์†Œ๋ฅผ CRD์—๋„ ์ง€์ •๋œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค์™€ ๋น„๊ตํ•˜๊ณ  ๋น„๊ต ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ด GitOps ๋ชจ๋ธ์€ ArgoCD์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

OpenShift์šฉ GitOps ์†Œ๊ฐœ

OpenShift ํ”Œ๋žซํผ์˜ GitOps

๋ฉ€ํ‹ฐ ํด๋Ÿฌ์Šคํ„ฐ Kubernetes ์ธํ”„๋ผ ๊ด€๋ฆฌ

Kubernetes์˜ ํ™•์‚ฐ๊ณผ ๋ฉ€ํ‹ฐ ํด๋ผ์šฐ๋“œ ์ „๋žต ๋ฐ ์—ฃ์ง€ ์ปดํ“จํŒ…์˜ ์ธ๊ธฐ๊ฐ€ ๋†’์•„์ง์— ๋”ฐ๋ผ ๊ณ ๊ฐ๋‹น ํ‰๊ท  OpenShift ํด๋Ÿฌ์Šคํ„ฐ ์ˆ˜๋„ ์ฆ๊ฐ€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์—ฃ์ง€ ์ปดํ“จํŒ…์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ ๊ณ ๊ฐ์˜ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ˆ˜๋ฐฑ ๋˜๋Š” ์ˆ˜์ฒœ ๊ฐœ๋กœ ๋ฐฐํฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ทธ๋Š” ํผ๋ธ”๋ฆญ ํด๋ผ์šฐ๋“œ์™€ ์˜จํ”„๋ ˆ๋ฏธ์Šค์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ด๊ฑฐ๋‚˜ ์กฐ์ •๋œ OpenShift ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ํŠนํžˆ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ

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

์ด ๊ฒฝ์šฐ ๋‹ค์Œ ์ž‘์—…์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ํด๋Ÿฌ์Šคํ„ฐ(๊ฐœ๋ฐœ, ๋‹จ๊ณ„ ๋“ฑ) ๊ฐ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๋ฐ”์ด๋„ˆ๋ฆฌ, ๊ตฌ์„ฑ ๋“ฑ)์˜ ์ด๋™์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ OpenShift ํด๋Ÿฌ์Šคํ„ฐ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(๋ฐ”์ด๋„ˆ๋ฆฌ, ๊ตฌ์„ฑ ๋“ฑ)์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋กค์•„์›ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ด์ „์— ์•Œ๋ ค์ง„ ์ƒํƒœ๋กœ ๋กค๋ฐฑํ•ฉ๋‹ˆ๋‹ค.

OpenShift GitOps ์‚ฌ์šฉ ์‚ฌ๋ก€

1. Git ์ €์žฅ์†Œ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ ์šฉ

ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋Š” OpenShift ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ์„ Git ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๊ณ  ์ด๋ฅผ ์ž๋™์œผ๋กœ ์ ์šฉํ•˜์—ฌ ์†์‰ฝ๊ฒŒ ์ƒˆ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Git ์ €์žฅ์†Œ์— ์ €์žฅ๋œ ์•Œ๋ ค์ง„ ์ƒํƒœ์™€ ๋™์ผํ•œ ์ƒํƒœ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. Secret Manager์™€์˜ ๋™๊ธฐํ™”

๋˜ํ•œ ๊ด€๋ฆฌ์ž๋Š” OpenShift ๋น„๋ฐ€ ๊ฐœ์ฒด๋ฅผ Vault์™€ ๊ฐ™์€ ์ ์ ˆํ•œ ์†Œํ”„ํŠธ์›จ์–ด์™€ ๋™๊ธฐํ™”ํ•˜์—ฌ ์ด๋ฅผ ์œ„ํ•ด ํŠน๋ณ„ํžˆ ์ œ์ž‘๋œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์˜ ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ๋“œ๋ฆฌํ”„ํŠธ ๊ตฌ์„ฑ ์ œ์–ด

๊ด€๋ฆฌ์ž๋Š” OpenShift GitOps ์ž์ฒด๊ฐ€ ์‹ค์ œ ๊ตฌ์„ฑ๊ณผ ์ €์žฅ์†Œ์— ์ง€์ •๋œ ๊ตฌ์„ฑ ๊ฐ„์˜ ๋ถˆ์ผ์น˜๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๊ฒฝ๊ณ ํ•˜์—ฌ ๋“œ๋ฆฌํ”„ํŠธ์— ์‹ ์†ํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

4. ๊ตฌ์„ฑ ๋“œ๋ฆฌํ”„ํŠธ์— ๋Œ€ํ•œ ์•Œ๋ฆผ

๊ด€๋ฆฌ์ž๊ฐ€ ์Šค์Šค๋กœ ์ ์ ˆํ•œ ์กฐ์น˜๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์ทจํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์„ฑ ๋“œ๋ฆฌํ”„ํŠธ ์‚ฌ๋ก€๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ํŒŒ์•…ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

5. ๋“œ๋ฆฌํ”„ํŠธ ์‹œ ๊ตฌ์„ฑ ์ˆ˜๋™ ๋™๊ธฐํ™”

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

6. ๋“œ๋ฆฌํ”„ํŠธ ์‹œ ๊ตฌ์„ฑ ์ž๋™ ๋™๊ธฐํ™”

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

7. ์—ฌ๋Ÿฌ ํด๋Ÿฌ์Šคํ„ฐ - ํ•˜๋‚˜์˜ ์ €์žฅ์†Œ

๊ด€๋ฆฌ์ž๋Š” ์—ฌ๋Ÿฌ OpenShift ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ตฌ์„ฑ์„ ํ•˜๋‚˜์˜ Git ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ์„ ํƒ์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8. ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์„ฑ ๊ณ„์ธต ๊ตฌ์กฐ(์ƒ์†)

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

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ด€๋ฆฌ์ž๊ฐ€ Git ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ "ํ”„๋กœ๋•์…˜ ํด๋Ÿฌ์Šคํ„ฐ(ํ”„๋กœ๋•์…˜) โ†’ ์‹œ์Šคํ…œ X ํด๋Ÿฌ์Šคํ„ฐ โ†’ ์‹œ์Šคํ…œ X์˜ ํ”„๋กœ๋•์…˜ ํด๋Ÿฌ์Šคํ„ฐ" ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์„ค์ •ํ•˜๋ฉด ๋‹ค์Œ ๊ตฌ์„ฑ์˜ ์กฐํ•ฉ์ด ์‹œ์Šคํ…œ X์˜ ํ”„๋กœ๋•์…˜ ํด๋Ÿฌ์Šคํ„ฐ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ๋ชจ๋“  ํ”„๋กœ๋•์…˜ ํด๋Ÿฌ์Šคํ„ฐ์— ๊ณตํ†ต์ ์ธ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.
  • System X ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.
  • X ์‹œ์Šคํ…œ ํ”„๋กœ๋•์…˜ ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค.

9. ํ…œํ”Œ๋ฆฟ ๋ฐ ๊ตฌ์„ฑ ์žฌ์ •์˜

๊ด€๋ฆฌ์ž๋Š” ์ƒ์†๋œ ๊ตฌ์„ฑ ์ง‘ํ•ฉ๊ณผ ํ•ด๋‹น ๊ฐ’์„ ์žฌ์ •์˜ํ•˜์—ฌ ์ ์šฉํ•  ํŠน์ • ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์„ ๋ฏธ์„ธ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

10. ๊ตฌ์„ฑ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์„ ํƒ์  ํฌํ•จ ๋ฐ ์ œ์™ธ

๊ด€๋ฆฌ์ž๋Š” ํŠน์ • ํŠน์„ฑ์„ ๊ฐ€์ง„ ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•ด ํŠน์ • ๊ตฌ์„ฑ์„ ์ ์šฉํ•˜๊ฑฐ๋‚˜ ์ ์šฉํ•˜์ง€ ์•Š๋Š” ์กฐ๊ฑด์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

11. ํ…œํ”Œ๋ฆฟ ์ง€์›

๊ฐœ๋ฐœ์ž๋Š” ๊ฐ ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•(Helm Chart, ์ˆœ์ˆ˜ Kubernetes yaml ๋“ฑ)์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์˜ ์ด์ ์„ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OpenShift ํ”Œ๋žซํผ์˜ GitOps ๋„๊ตฌ

์•„๋ฅด๊ณ CD

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

๊ณต์‹ ์›น ์‚ฌ์ดํŠธ

์œ ๋Ÿ‰

Flux๋Š” On-Cluster Resource Reconcile ๋ชจ๋ธ์„ ๊ตฌํ˜„ํ•˜๋ฏ€๋กœ ์•ฝ์ ์ธ ์ •์˜ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ์ค‘์•™ ์ง‘์ค‘์‹ ๊ด€๋ฆฌ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, ์ค‘์•™ ์ง‘์ค‘ํ™”๊ฐ€ ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋Ÿฌ์Šคํ„ฐ ํ•˜๋‚˜๊ฐ€ ์‹คํŒจํ•˜๋”๋ผ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ด€๋ฆฌํ•˜๋Š” ๋Šฅ๋ ฅ์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

๊ณต์‹ ์›น ์‚ฌ์ดํŠธ

OpenShift์— ArgoCD ์„ค์น˜

ArgoCD๋Š” ๋›ฐ์–ด๋‚œ ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์›น ์ฝ˜์†”์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์—ฌ๊ธฐ์—์„œ๋Š” Flux ๋ฐ ๊ธฐํƒ€ ๋Œ€์•ˆ์„ ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

OpenShift 4 ํ”Œ๋žซํผ์— ArgoCD๋ฅผ ๋ฐฐํฌํ•˜๋ ค๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ์ž๋กœ์„œ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

OpenShift ํ”Œ๋žซํผ์— ArgoCD ๊ตฌ์„ฑ์š”์†Œ ๋ฐฐํฌ

# Create a new namespace for ArgoCD components
oc create namespace argocd
# Apply the ArgoCD Install Manifest
oc -n argocd apply -f https://raw.githubusercontent.com/argoproj/argo-cd/v1.2.2/manifests/install.yaml
# Get the ArgoCD Server password
ARGOCD_SERVER_PASSWORD=$(oc -n argocd get pod -l "app.kubernetes.io/name=argocd-server" -o jsonpath='{.items[*].metadata.name}')

OpenShift Route์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ArgoCD ์„œ๋ฒ„ ๊ฐœ์„ 

# Patch ArgoCD Server so no TLS is configured on the server (--insecure)
PATCH='{"spec":{"template":{"spec":{"$setElementOrder/containers":[{"name":"argocd-server"}],"containers":[{"command":["argocd-server","--insecure","--staticassets","/shared/app"],"name":"argocd-server"}]}}}}'
oc -n argocd patch deployment argocd-server -p $PATCH
# Expose the ArgoCD Server using an Edge OpenShift Route so TLS is used for incoming connections
oc -n argocd create route edge argocd-server --service=argocd-server --port=http --insecure-policy=Redirect

ArgoCD Cli ๋„๊ตฌ ๋ฐฐํฌ

# Download the argocd binary, place it under /usr/local/bin and give it execution permissions
curl -L https://github.com/argoproj/argo-cd/releases/download/v1.2.2/argocd-linux-amd64 -o /usr/local/bin/argocd
chmod +x /usr/local/bin/argocd

ArgoCD ์„œ๋ฒ„ ๊ด€๋ฆฌ์ž ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ

# Get ArgoCD Server Route Hostname
ARGOCD_ROUTE=$(oc -n argocd get route argocd-server -o jsonpath='{.spec.host}')
# Login with the current admin password
argocd --insecure --grpc-web login ${ARGOCD_ROUTE}:443 --username admin --password ${ARGOCD_SERVER_PASSWORD}
# Update admin's password
argocd --insecure --grpc-web --server ${ARGOCD_ROUTE}:443 account update-password --current-password ${ARGOCD_SERVER_PASSWORD} --new-password

์ด๋Ÿฌํ•œ ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ•œ ํ›„ ArgoCD WebUI ์›น ์ฝ˜์†” ๋˜๋Š” ArgoCD Cli ๋ช…๋ น์ค„ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ArgoCD ์„œ๋ฒ„๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
https://blog.openshift.com/is-it-too-late-to-integrate-gitops/

GitOps - ๋„ˆ๋ฌด ๋Šฆ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค

โ€œ๊ธฐ์ฐจ๊ฐ€ ๋– ๋‚ฌ๋‹คโ€ โ€“ ์ด๊ฒƒ์€ ๋ฌด์–ธ๊ฐ€๋ฅผ ํ•  ๊ธฐํšŒ๋ฅผ ๋†“์นœ ์ƒํ™ฉ์— ๋Œ€ํ•ด ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. OpenShift์˜ ๊ฒฝ์šฐ ์ด ๋ฉ‹์ง„ ์ƒˆ ํ”Œ๋žซํผ์„ ์ฆ‰์‹œ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์š•๊ตฌ๋กœ ์ธํ•ด ๊ฒฝ๋กœ, ๋ฐฐํฌ ๋ฐ ๊ธฐํƒ€ OpenShift ๊ฐœ์ฒด์˜ ๊ด€๋ฆฌ ๋ฐ ์œ ์ง€ ๊ด€๋ฆฌ์™€ ํ•จ๊ป˜ ๋ฐ”๋กœ ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐํšŒ๋Š” ์–ธ์ œ๋‚˜ ์™„์ „ํžˆ ์‚ฌ๋ผ์ง€๋Š” ๊ฑธ๊นŒ์š”?

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

oc create -f https://raw.githubusercontent.com/openshift/federation-dev/master/labs/lab-4-assets/namespace.yaml
oc create -f https://raw.githubusercontent.com/openshift/federation-dev/master/labs/lab-4-assets/deployment.yaml
oc create -f https://raw.githubusercontent.com/openshift/federation-dev/master/labs/lab-4-assets/service.yaml
oc expose svc/httpd -n simple-app

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

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

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

์ด ์˜ˆ์—์„œ๋Š” GitHub์— ์ƒˆ๋กœ์šด ๊ณต๊ฐœ ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ถ€๋ฅด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” blogpost๋ผ๋Š” ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

YAML ๊ฐ์ฒด ํŒŒ์ผ์ด ๋กœ์ปฌ๋กœ ๋˜๋Š” Git์— ์ €์žฅ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ oc ๋˜๋Š” kubectl ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ์Šคํฌ๋ฆฐ์ƒท์—์„œ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๋ฐฐํฌ, ์„œ๋น„์Šค ๋ฐ ๊ฒฝ๋กœ์— ๋Œ€ํ•ด YAML์„ ์š”์ฒญํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ „์— ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์ €์žฅ์†Œ๋ฅผ ๋ณต์ œํ•˜๊ณ  ์—ฌ๊ธฐ์— CD๋ฅผ ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค.

oc get namespace simple-app -o yaml --export > namespace.yaml
oc get deployment httpd -o yaml -n simple-app --export > deployment.yaml
oc get service httpd -o yaml -n simple-app --export > service.yaml
oc get route httpd -o yaml -n simple-app --export > route.yaml

์ด์ œ Argo CD๊ฐ€ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์—†๋Š” ํ•„๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด development.yaml ํŒŒ์ผ์„ ํŽธ์ง‘ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

sed -i '/sgeneration: .*/d' deployment.yaml

๋˜ํ•œ ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ์—ฌ๋Ÿฌ ์ค„์˜ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•œ ๋‹ค์Œ ingress: null์„ ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ๋‚ด์šฉ์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

export ROUTE="  ingress:                                                            
    - conditions:
        - status: 'True'
          type: Admitted"

sed -i "s/  ingress: null/$ROUTE/g" route.yaml

์ด์ œ ํŒŒ์ผ์„ ์ •๋ฆฌํ–ˆ์œผ๋‹ˆ ์ด์ œ Git ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๋Š” ์ผ๋งŒ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ ํ›„์—๋Š” ์ด ์ €์žฅ์†Œ๊ฐ€ ์œ ์ผํ•œ ์ •๋ณด ์†Œ์Šค๊ฐ€ ๋˜๋ฉฐ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ˆ˜๋™ ๋ณ€๊ฒฝ์€ ์—„๊ฒฉํžˆ ๊ธˆ์ง€๋ฉ๋‹ˆ๋‹ค.

git commit -am โ€˜initial commit of objectsโ€™
git push origin master

๋˜ํ•œ ArgoCD๋ฅผ ์ด๋ฏธ ๋ฐฐํฌํ–ˆ๋‹ค๋Š” ์‚ฌ์‹ค๋ถ€ํ„ฐ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค(์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ• - ์ด์ „ ์ฐธ์กฐ). ๊ฒŒ์‹œ). ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์˜ˆ์ œ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•˜์—ฌ ์šฐ๋ฆฌ๊ฐ€ ์ƒ์„ฑํ•œ ์ €์žฅ์†Œ๋ฅผ Argo CD์— ์ถ”๊ฐ€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ „์— ์ƒ์„ฑํ•œ ์ •ํ™•ํ•œ ์ €์žฅ์†Œ๋ฅผ ์ง€์ •ํ–ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.

argocd repo add https://github.com/cooktheryan/blogpost

์ด์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. GitOps ํˆดํ‚ท์ด ์‚ฌ์šฉํ•  ์ €์žฅ์†Œ์™€ ๊ฒฝ๋กœ, ๊ฐ์ฒด ๊ด€๋ฆฌ์— ํ•„์š”ํ•œ OpenShift, ์ €์žฅ์†Œ์˜ ํŠน์ • ๋ถ„๊ธฐ๊ฐ€ ํ•„์š”ํ•œ์ง€, ๋ฆฌ์†Œ์Šค๊ฐ€ ์ž๋™ ๋™๊ธฐํ™”๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

argocd app create --project default 
--name simple-app --repo https://github.com/cooktheryan/blogpost.git 
--path . --dest-server https://kubernetes.default.svc 
--dest-namespace simple-app --revision master --sync-policy none

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

์ด์ œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํŒŒ์ผ์— ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

argocd app sync simple-app --dry-run

์˜ค๋ฅ˜๊ฐ€ ์—†์œผ๋ฉด ๋™๊ธฐํ™”๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

argocd app sync simple-app

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ argocd get ๋ช…๋ น์„ ์‹คํ–‰ํ•œ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ƒํƒœ๊ฐ€ Healthy ๋˜๋Š” Synced๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ด์ œ Git ์ €์žฅ์†Œ์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ์ด๋ฏธ ๋ฐฐํฌ๋œ ๋ฆฌ์†Œ์Šค์— ํ•ด๋‹นํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

argocd app get simple-app
Name:               simple-app
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          simple-app
URL:                https://argocd-server-route-argocd.apps.example.com/applications/simple-app
Repo:               https://github.com/cooktheryan/blogpost.git
Target:             master
Path:               .
Sync Policy:        <none>
Sync Status:        Synced to master (60e1678)
Health Status:      Healthy
...   

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

argocd app set simple-app --sync-policy automated --auto-prune

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

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€