CHANBEEN.COM ๐Ÿ’ป
Ansible๋กœ ์‹œ์ž‘ํ•˜๋Š” ์˜จํ”„๋ ˆ๋ฏธ์Šค CI/CD ์‚ฝ์งˆ๊ธฐ, ๋งจ๋•…์—์„œ GitOps ํ•˜๊ธฐ
2025-11-17#Kubernetes#ArgoCD

Ansible๋กœ ์‹œ์ž‘ํ•˜๋Š” ์˜จํ”„๋ ˆ๋ฏธ์Šค CI/CD ์‚ฝ์งˆ๊ธฐ, ๋งจ๋•…์—์„œ GitOps ํ•˜๊ธฐ

๋“ค์–ด๊ฐ€๋ฉฐ

์•ˆ๋…•ํ•˜์„ธ์š”,
์ตœ๊ทผ ํšŒ์‚ฌ์—์„œ ์‚ฌ๋‚ด ๊ฐœ๋ฐœ๋ง์„ ์™ธ๋ถ€๋ง์œผ๋กœ ์ „ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ๋‹ด๋‹นํ•˜๋ฉด์„œ,
์ธํ”„๋ผ๋ฅผ ์ง์ ‘ ๊ตฌ์ถ•ํ•  ๊ธฐํšŒ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

์ด์™• ํ•˜๋Š” ๊ฑฐ, "์„œ๋ฒ„์— CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ž๋™ํ™”ํ•ด๋ณด์ž!" ๋ผ๋Š” ์›๋Œ€ํ•œ ๋ชฉํ‘œ๋ฅผ ์„ธ์šฐ๊ฒŒ ๋˜์—ˆ์ฃ ...

์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•œ ์Šคํƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • IaC: Ansible (์„œ๋ฒ„ ํ”„๋กœ๋น„์ €๋‹ ์ž๋™ํ™”)
    • ์„ ์–ธ์  IaC์ธ Terrafrom์€ ์‚ฌ๋‚ด ๋ณด์•ˆ์ƒ ํŒจํ‚ค์ง€ ์„ค์น˜ ๋“ฑ os๋ฅผ ๊ฑด๋“œ๋ฆด ์—ผ๋ ค๊ฐ€ ์žˆ์–ด ์ œ์™ธํ–ˆ์Šต๋‹ˆ๋‹ค!
    • ์ ˆ์ฐจ์  IaC์ธ Ansible๋กœ ์ง„ํ–‰ํ•˜๋ฉด playbook์ƒ ์ดํ•ด๋„ ์‰ฝ์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
  • CI: GitLab (SCM + Container Registry), Jenkins
    • GitLab์„ ๊ธฐ๋ณธ VCS๋กœ ์‚ฌ์šฉํ•˜๊ณ , Webhook์œผ๋กœ Jenkins์— ์—ฐ๊ฒฐํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • CD: ArgoCD, K3s
    • ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค์ƒ k8s๊ฐ€ ๊ฒฝ๋Ÿ‰ํ™”๋œ k3s๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ArgoCD๋Š” QA ํ™˜๊ฒฝ์„ ๋ชจ๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ตฌ์ถ•์—๋Š” ์„ฑ๊ณตํ–ˆ๊ณ , ํ˜„์žฌ ์ž˜ ๋Œ์•„๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ ๊ณผ์ •์—์„œ ๊ฒช์—ˆ๋˜ ์‹œํ–‰์ฐฉ์˜ค๋“ค์„ ๋ช‡ ๊ฐ€์ง€ ์ •๋ฆฌํ•ด ๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜‚

ํŠนํžˆ GitLab ํฌํŠธ ์ถฉ๋Œ๊ณผ K3s์˜ ๋Ÿฐํƒ€์ž„ ์ด์Šˆ์—์„œ ์กฐ๊ธˆ ์‚ฝ์งˆ์„ ํ–ˆ๋Š”๋ฐ์š”.
์ €์ฒ˜๋Ÿผ ์ฒ˜์Œ ๊ตฌ์ถ•ํ•˜๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๋กœ๊ทธ๋ฅผ ๋‚จ๊ฒจ๋ด…๋‹ˆ๋‹ค.
์ด๋Ÿฐ๊ฑด AI๋„ ์ž˜ ๋ชจ๋ฅด๋”๋ผ๊ตฌ์š”โ“


0. ์ „์ฒด ์ธํ”„๋ผ ๊ตฌ์ƒํ•˜๊ธฐ

ํ”Œ๋กœ์šฐ์ฐจํŠธ

  1. Code Push : Project A์— ์ฝ”๋“œ push๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  2. Image Build & Push : Jenkins๊ฐ€ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , GitLab Container Registry์— ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  3. Manifest Update : ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด, Jenkins๊ฐ€ Project B์˜ deployment.yaml ํƒœ๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ์ปค๋ฐ‹ํ•ฉ๋‹ˆ๋‹ค.
  4. CD Sync: ArgoCD๊ฐ€ Project B์˜ Git ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฐ์ง€ํ•˜๊ณ , K3s ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชจ๋“  ํ™˜๊ฒฝ์„ Ansible ํ•˜๋‚˜๋กœ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ์ด๋ฒˆ ํฌ์ŠคํŒ…์˜ ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค!


1. Ansible๋กœ ์ธํ”„๋ผ ์ž๋™ํ™”ํ•˜๊ธฐ

์šฐ์„  ๋ชจ๋“  ์„ค์น˜ ๊ณผ์ •์€ Ansible๋กœ ์ฝ”๋“œํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜์ค‘์— ์„œ๋ฒ„๊ฐ€ ๋ฐ”๋€Œ๋”๋ผ๋„ playbook ํ•˜๋‚˜๋ฉด ๋˜‘๊ฐ™์€ ํ™˜๊ฒฝ์„ ์ฐ์–ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ๋„ˆ๋ฌด ๋งค๋ ฅ์ ์ด์ง€ ์•Š๋‚˜์š”?

๋ฉ”์ธ ์„œ๋ฒ„์—์„œ ๋ฐ”๋กœ ๋Œ๋ฆด ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ansible_connection=local ์˜ต์…˜์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
๋งˆ์Œ๊ฐ™์•„์„  ์ตœ์†Œ 2๊ฐœ์˜ ์ธ์Šคํ„ด์Šค ํ™˜๊ฒฝ์—์„œ ์ž‘์—…์„ ํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ... ์–ด์ฉ” ์ˆ˜ ์—†์ฃ !

ansible_connection=local ์ด๋ž€?
> Ansible์ด SSH๋ฅผ ํ†ตํ•˜์ง€ ์•Š๊ณ , ๋กœ์ปฌํ˜ธ์ŠคํŠธ์— ์ง์ ‘ ๋ช…๋ น์„ ๋‚ด๋ฆด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

# main-playbook.yml
- name: 1. Docker ์„ค์น˜ ๋ฐ ํ™˜๊ฒฝ ๊ตฌ์„ฑ
  hosts: localhost
  become: yes
  roles:
    - 1-docker

- name: 2. GitLab, Jenkins ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ (Docker Compose)
  hosts: localhost
  roles:
    - 2-cicd-tools

- name: 3. K3s ๋ฐ ArgoCD ํ™˜๊ฒฝ ๊ตฌ์ถ• (K8s)
  hosts: localhost
  become: yes
  roles:
    - 3-k3s
    - 4-argocd

์œ„์ฒ˜๋Ÿผ mainPlayBook ์„ค์ •์„ ํ•ด ๋†“๊ณ ,
๊ฐ roles ๋‚ด์— ์Šคํฌ๋ฆฝํŠธ๋“ค์„ ์ž‘์„ฑ ํ•ด ๋†จ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์ด ์Šคํฌ๋ฆฝํŠธ ํ•˜๋‚˜๋งŒ ์‹คํ–‰ํ•˜๋ฉด

  1. Docker๊ฐ€ ์„ค์น˜๋˜๊ณ ,
  2. GitLab๊ณผ Jenkins๊ฐ€ Docker Compose๋กœ ๋œจ๊ณ ,
  3. K3s๊ฐ€ ์„ค์น˜๋œ ๋’ค,
  4. ArgoCD๊นŒ์ง€ ์ž๋™์œผ๋กœ ๋ฐฐํฌ๋˜๋„๋ก ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

์ธํ”„๋ผ ์„ค์น˜ ๋!
์ด๋ผ๋ฉฐ ์ข‹์•„ํ–ˆ๋˜ ๊ฒƒ๋„ ์ž ์‹œ...


2. GitLab Container Registry์™€ Nginx์˜ ์ถฉ๋Œ

Jenkins์—์„œ ์—ด์‹ฌํžˆ ๋นŒ๋“œํ•œ Docker ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ๋‚ด GitLab Registry์— push ํ•˜๋ ค๋Š”๋ฐ,
๊ณ„์† 404 Not Found ์—๋Ÿฌ๊ฐ€ ๋œจ๋Š” ๊ฒ๋‹ˆ๋‹ค.
๋กœ๊ทธ์ธ์€ ๋˜๋Š”๋ฐ ํ‘ธ์‹œ๋งŒ ์•ˆ ๋˜๋Š”... ์ •๋ง ๊ธฐ์ดํ•œ ์ƒํ™ฉ์ด์—ˆ์ฃ .

์›์ธ

๋ฒ”์ธ์€ ๋ฐ”๋กœ ํฌํŠธ ์„ค์ •์ด์—ˆ์Šต๋‹ˆ๋‹ค.
GitLab ์›น UI ํฌํŠธ์™€ Registry ํฌํŠธ๋ฅผ ๋‘˜ ๋‹ค 8081๋กœ ์„ค์ •ํ•ด๋ฒ„๋ฆฐ ๊ฒŒ ํ™”๊ทผ์ด์—ˆ์–ด์š”.

GitLab ๋‚ด๋ถ€์˜ Nginx๊ฐ€ docker push ์š”์ฒญ์„ ๋ฐ›๊ณ ๋Š”,
"์–ด? ์ด๊ฑฐ ์›น ํŽ˜์ด์ง€ ์š”์ฒญ์ธ๊ฐ€?" ํ•˜๊ณ  ์—‰๋šฑํ•œ ๊ณณ์œผ๋กœ ๋ณด๋‚ด๋ฒ„๋ฆฌ๊ณ  ์žˆ์—ˆ๋˜ ๊ฒ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ: ํฌํŠธ ๋ถ„๋ฆฌ

๊ฒฐ๊ตญ docker-compose.yml์„ ์ˆ˜์ •ํ•ด์„œ ๋‘ ์„œ๋น„์Šค์˜ ํฌํŠธ๋ฅผ ๋ช…ํ™•ํžˆ ์ฐข์–ด๋†“์•˜์Šต๋‹ˆ๋‹ค.

  • GitLab Web: 8081
  • Registry: 5005
services:
  gitlab:
    ports:
      - "8081:8081" # ์›น ์ ‘์†์šฉ
      - "5005:5005" # ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์šฉ
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://xxx.xxx.xxx.xxx:8081'
        registry_external_url 'http://xxx.xxx.xxx.xxx:5005'
        gitlab_registry_enable = true

๊ทธ๋ฆฌ๊ณ , ๋ณ„๋„ ๋„๋ฉ”์ธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„ SSL ์ธ์ฆ์„œ ๋ฐœ๊ธ‰์ด ์–ด๋ ค์›Œ HTTP๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ์š”.
Docker๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ HTTPS๋งŒ ์‹ ๋ขฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ˜ธ์ŠคํŠธ์˜ /etc/docker/daemon.json์— ์•„๋ž˜ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

"insecure-registries": ["xxx.xxx.xxx.xxx:5005"]

insecure-registries ๋ž€?
HTTP๋กœ ํ†ต์‹ ํ•˜๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ ‘์†์„ ํ—ˆ์šฉํ•˜๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค.
์™ธ๋ถ€ ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์€ ์ฐจ๋‹จ๋œ ํ์‡„๋ง ํ™˜๊ฒฝ์ด๋ผ, ๋ณด์•ˆ๋ณด๋‹ค๋Š” ํŽธ์˜์„ฑ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.


3. ์ธ์ฆ.. Token์ด ์™œ ์ด๋ ‡๊ฒŒ ๋งŽ์•„?

ํฌํŠธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋‚˜๋‹ˆ, ์ด๋ฒˆ์—” denied ์—๋Ÿฌ๊ฐ€ ์ €๋ฅผ ๋ฐ˜๊ฒจ์ค๋‹ˆ๋‹ค.
์•Œ๊ณ  ๋ณด๋‹ˆ GitLab์—๋Š” ํ† ํฐ์˜ ์ข…๋ฅ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€์˜€๊ณ , ์ €๋Š” ๊ทธ๊ฑธ ํ˜ผ๋™ํ•ด์„œ ์“ฐ๊ณ  ์žˆ์—ˆ๋”๋ผ๊ณ ์š”.

Deploy Token vs Access Token

ํ† ํฐ ์ข…๋ฅ˜ ์šฉ๋„ ํ•„์š”ํ•œ ๊ถŒํ•œ
Deploy Token ์ด๋ฏธ์ง€ Push (Docker Login) write_registry
Project Access Token Git Push (Manifest Update) write_repository
  1. ์ด๋ฏธ์ง€ ์˜ฌ๋ฆด ๋•Œ: Jenkins๊ฐ€ Docker ์ด๋ฏธ์ง€๋ฅผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์˜ฌ๋ฆด ๋• Deploy Token์„ ์จ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. Git ์ˆ˜์ •ํ•  ๋•Œ: Jenkins๊ฐ€ ArgoCD๊ฐ€ ๋ฐ”๋ผ๋ณด๋Š” deployment.yaml ํŒŒ์ผ(๋ฒ„์ „ ํƒœ๊ทธ)์„ ์ˆ˜์ •ํ•ด์„œ Git์— ์˜ฌ๋ฆด ๋• Project Access Token์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Protected Branch ํ•จ์ •

"ํ† ํฐ ๊ถŒํ•œ ๋‹ค ์คฌ๋Š”๋ฐ ์™œ ์•ˆ ๋˜์ง€?" ์˜ ์›์ธ์ด์—ˆ๋Š”๋ฐ,
GitLab์˜ main์ด๋‚˜ develop ๋ธŒ๋žœ์น˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Protected ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

Settings > Repository > Protected branches ๋ฉ”๋‰ด์—์„œ
ํ•ด๋‹น ํ† ํฐ์ด Protected ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก Roles ๊ถŒํ•œ์„ ํ™•์ธ ํ•ด ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.
์ €๋Š” Maintainers๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ • ํ•ด ๋†“๊ณ  ์™œ.. ๊ณ„์† Denied๊ฐ€ ๋‚˜์˜ค์ง€ ํ•˜๋ฉด์„œ ์ฐพ์•„๋‹ค๋…”๋„ค์š”.. ๐Ÿ˜…


4. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” Docker๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค

ArgoCD๊นŒ์ง€ ์—ฐ๋™์„ ๋งˆ์ณค์Šต๋‹ˆ๋‹ค.
์ด์ œ K3s ํด๋Ÿฌ์Šคํ„ฐ์— ํŒŒ๋“œ(Pod)๊ฐ€ ์˜ˆ์˜๊ฒŒ ๋– ์•ผ ํ•˜๋Š”๋ฐ...
ImagePullBackOff ์ƒํƒœ์—์„œ ๋ฌดํ•œ ๋กœ๋”ฉ์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

๋ถ„๋ช… ์œ„์—์„œ daemon.json์— insecure-registries ์„ค์ •์„ ํ–ˆ์ž–์•„์š”?
ํ˜ธ์ŠคํŠธ์—์„œ๋Š” docker pull์ด ์ž˜ ๋˜๋Š”๋ฐ, ์™œ K3s๋งŒ ๋ชป ๊ฐ€์ ธ์˜ฌ๊นŒ์š”?

'containerd'

๋ฒ”์ธ์€ K3s์˜ ๋Ÿฐํƒ€์ž„์ด์—ˆ์Šต๋‹ˆ๋‹ค.
K3s๋Š” ๊ธฐ๋ณธ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์œผ๋กœ Docker๊ฐ€ ์•„๋‹Œ containerd๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ /etc/docker/daemon.json์„ ์ˆ˜์ •ํ•ด๋ด์•ผ K3s๋Š” ์ณ๋‹ค๋„ ์•ˆ ๋ณด๋Š” ๊ฒƒ์ด์—ˆ์ฃ ...

๋„์ปค ์ง€์›์ค‘๋‹จ ๊ด€๋ จ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ธ”๋กœ๊ทธ ์ฃผ์†Œ
https://kubernetes.io/blog/2022/02/17/dockershim-faq

ํ•ด๊ฒฐ: registries.yaml

K3s๋ฅผ ์œ„ํ•œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„ค์ •์€ /etc/rancher/k3s/registries.yaml์ด๋ผ๋Š” ๋ณ„๋„ ํŒŒ์ผ์— ํ•ด์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

mirrors:
  "xxx.xxx.xxx.xxx:5005":
    endpoint:
      - "http://xxx.xxx.xxx.xxx:5005"

์ด ์„ค์ •์„ ํ•ด์ฃผ๊ณ  K3s๋ฅผ ์žฌ์‹œ์ž‘ํ•˜๋‹ˆ, ๊ทธ์ œ์•ผ ์ด๋ฏธ์ง€๋ฅผ ์ •์ƒ์ ์œผ๋กœ ๋‹น๊ฒจ์˜ค๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ถ”๊ฐ€๋กœ K8s ๋‚ด๋ถ€์— ํ‚ค๊ฐ’์„ ๊ฐ€์ง„ imagePullSecrets๋ฅผ ์ƒ์„ฑํ•˜์—ฌ deployment์— ๋„ฃ์–ด์ฃผ์–ด์•ผ Registry์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


5. ๋ฐ์ดํ„ฐ ๋‚ ์•„๊ฐ€๋ฉด ์•ˆ ๋˜๋‹ˆ๊นŒ (๋ฐฑ์—… ์ž๋™ํ™”)

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

๊ทธ๋Ÿฐ๋ฐ Jenkins ๋ฐฑ์—… ์‹œ ์ฃผ์˜ํ•  ์ ์ด,
Jenkins๋Š” ์œ ํœด ์ƒํƒœ์ผ ๋•Œ๋„ SCM ํด๋ง์ด๋‚˜ ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ ๊ธฐ๋ก, ๋‚ด๋ถ€ DB ๊ฐฑ์‹  ๋“ฑ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์„ ๊ณ„์† ์ˆ˜ํ–‰ํ•˜๋ฉฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ ์œ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋•Œ tar๋กœ ํŒŒ์ผ์„ ๋ฌถ์œผ๋ ค ํ•˜๋ฉด "File changed as we read it" ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด ๊นจ์ ธ์„œ ๋ง‰์ƒ ๋ณต๊ตฌํ•˜๋ ค ํ•  ๋•Œ ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ, ๋ฐฑ์—… ์Šคํฌ๋ฆฝํŠธ ๋‚ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ž ์‹œ ๋ฉˆ์ถ”๋Š” ์ฝ”๋“œ๋ฅผ ๋„ฃ๋Š” ๋ฐฉ์‹์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

#!/bin/bash
# Jenkins ์ž ์‹œ ์ค‘์ง€
docker-compose stop jenkins

tar -czf $BACKUP_DIR/jenkins_backup_$TIMESTAMP.tar.gz -C $SOURCE_DIR .

# ๋ฐฑ์—… ํ›„ ์žฌ์‹œ์ž‘
docker-compose start jenkins

"์„œ๋น„์Šค๊ฐ€ ์ค‘๋‹จ๋˜๋Š” ๊ฑฐ ์•„๋‹Œ๊ฐ€์š”?" ๋ผ๊ณ  ํ•˜์‹ค ์ˆ˜ ์žˆ์ง€๋งŒ,
์ƒˆ๋ฒฝ 2์‹œ์— ๋นŒ๋“œ ๋Œ๋ฆด ์‚ฌ๋žŒ์€ ์—†๋‹ค๊ณ  ํŒ๋‹จํ•ด์„œ ๊ณผ๊ฐํ•˜๊ฒŒ ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค.
๋ฐ˜๋ฉด GitLab์€ gitlab-backup create๋ผ๋Š” ๋ช…๋ น์–ด๊ฐ€ ์žˆ์–ด์„œ ์ค‘๋‹จ ์—†์ด ํŽธํ•˜๊ฒŒ ๊ฐ€๋Šฅํ•˜๋”๋ผ๊ตฌ์š”. ๐Ÿ‘


๋งˆ๋ฌด๋ฆฌ

[Code Push] -> [Jenkins Build] -> [Docker Push] -> [Manifest Update] -> [ArgoCD Sync] -> [K3s Deploy]
ํ”Œ๋กœ์šฐ์ฐจํŠธ

์ด ํ•œ ์ค„์˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ์™„์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๊ฒช์—ˆ๋˜ ์ˆ˜๋งŽ์€ ์—๋Ÿฌ...
๋‹น์‹œ์—” ๋จธ๋ฆฌ๋ฅผ ์ฅ์–ด๋œฏ์—ˆ์ง€๋งŒ, ๋•๋ถ„์— Docker์™€ K3s, GitLab์˜ ๊ถŒํ•œ ์ฒด๊ณ„ ๋“ฑ์„ ๋ถ€๋”ชํžˆ๋ฉฐ ์ดํ•ดํ•˜๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ˜น์‹œ ์ €์ฒ˜๋Ÿผ ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์—์„œ ๋งจ๋•…์— CI/CD๋ฅผ ๊ตฌ์ถ•ํ•˜๋ ค๋Š” ๋ถ„๋“ค์ด ๊ณ„์‹ ๋‹ค๋ฉด,
์ด ์‚ฝ์งˆ ๊ธฐ๋ก์ด ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋„์›€์ด ๋˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๐Ÿ˜Š

ํ‹€๋ฆฐ ๋ถ€๋ถ„์ด๋‚˜ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”!
๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.