[AEWS] #8μ£Όμ°¨ μ  ν‚¨μŠ€, ArgoCD μ‹€μŠ΅

25년도 AWS EKS Hands-on Study μŠ€ν„°λ”” 정리 λ‚΄μš©μž…λ‹ˆλ‹€.

 

μ  ν‚¨μŠ€

JenkinsλŠ” μ˜€ν”ˆμ†ŒμŠ€λ‘œ μ œκ³΅λ˜λŠ” μžλ™ν™” μ„œλ²„λ‘œ μ†Œν”„νŠΈμ›¨μ–΄ 개발 κ³Όμ •μ—μ„œ 반볡적인 μž‘μ—…μ„ μžλ™ν™”ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€.

 

μ½”λ“œ λΉŒλ“œ, ν…ŒμŠ€νŠΈ, νŒ¨ν‚€μ§•, 배포와 같은 CI(Continuous Integration) μž‘μ—…μ„ μžλ™μœΌλ‘œ μˆ˜ν–‰ν•˜λ„λ‘ νŒŒμ΄ν”„λΌμΈμ„ ꡬ성할 수 μžˆλ‹€.

λ‹€μ–‘ν•œ ν”ŒλŸ¬κ·ΈμΈμ„ 톡해 Git, Docker, Kubernetes λ“± μ—¬λŸ¬ 도ꡬ와 μ‰½κ²Œ μ—°λ™λ˜λ©° μ»€μŠ€ν„°λ§ˆμ΄μ§•μ„ ν•  수 μžˆλ‹€.

일반적으둜 κ°œλ°œμžκ°€ μ½”λ“œλ₯Ό ν‘Έμ‰¬ν•˜λ©΄ Jenkinsκ°€ 이λ₯Ό κ°μ§€ν•˜κ³  λΉŒλ“œ 및 ν…ŒμŠ€νŠΈλ₯Ό μˆ˜ν–‰ν•˜λ©° κ·Έ κ²°κ³Όλ₯Ό λ°”νƒ•μœΌλ‘œ λ‹€μŒ 단계λ₯Ό μžλ™μœΌλ‘œ μ‹€ν–‰ν•œλ‹€.

 

cat <<EOT > docker-compose.yaml
services:

  jenkins:
    container_name: jenkins
    image: jenkins/jenkins
    restart: unless-stopped
    networks:
      - kind
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - jenkins_home:/var/jenkins_home

  gogs:
    container_name: gogs
    image: gogs/gogs
    restart: unless-stopped
    networks:
      - kind
    ports:
      - "10022:22"
      - "3000:3000"
    volumes:
      - gogs-data:/data

volumes:
  jenkins_home:
  gogs-data:

networks:
  kind:
    external: true
EOT

 

docker compose up -d
docker compose ps
docker inspect kind

 

μ  ν‚¨μŠ€ μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€ 

docker compose exec --privileged -u root jenkins bash

curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update && apt install docker-ce-cli curl tree jq yq -y

# μ  ν‚¨μŠ€ μœ μ €κ°€ 도컀 μ‹€ν–‰ν•  수 μžˆλŠ” κΆŒν•œ λΆ€μ—¬
groupadd -g 2000 -f docker
chgrp docker /var/run/docker.sock
ls -l /var/run/docker.sock
usermod -aG docker jenkins
cat /etc/group | grep docker

# μ  ν‚¨μŠ€ μ»¨ν…Œμ΄λ„ˆ μž¬κΈ°λ™
docker compose restart jenkins

 

 

docker compose exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

docker compose logs jenkins -f

 

μ  ν‚¨μŠ€ ν”ŒλŸ¬κ·ΈμΈ μ„€μΉ˜μ—μ„œ μ—λŸ¬κ°€ λ‚œλ‹€λ©΄?

μ™œμΈμ§€ μž˜μ€ λͺ¨λ₯΄κ² λŠ”데...

μ™€μ΄νŒŒμ΄ ν™˜κ²½μ—μ„œ ν”ŒλŸ¬κ·ΈμΈ μ„€μΉ˜ν•˜λ©΄ 자꾸 νƒ€μž„μ•„μ›ƒμ΄ λ‚˜λ©΄μ„œ μ œλŒ€λ‘œ ν”ŒλŸ¬κ·ΈμΈ λ‹€μš΄λ‘œλ“œκ°€ μ•ˆλ˜μ—ˆλ‹€.

μ§‘μ—μ„œ μ“°λŠ”κ±°λΌ ν”„λ‘μ‹œλ„ λ”°λ‘œ μ•ˆλ‘κ³  방화벽도.. 별도 백신이 λŒμ•„κ°€λŠ”κ²Œ μ—†λŠ”λ° μ’€ μ΄μƒν•΄μ„œ

ν•«μŠ€νŒŸ ν‚€κ³  μ—°κ²°ν•˜λ‹ˆκΉŒ μ œλŒ€λ‘œ λ‹€μš΄μ΄ λ˜μ—ˆλ‹€.

 

ν˜Ήμ‹œλ‚˜ μ•ˆλ˜μ‹ λ‹€λ©΄ ν•«μŠ€νŒŸ ν‚€κ³  127.0.0.1:8080으둜 λ“€μ–΄κ°€μ„œ λ‹€μ‹œ λ‹€μš΄λ°›μœΌμ‹œκΈΈ

ν•«μŠ€νŒŸ ν‚€κ³  λ‹€μš΄λ°›μœΌλ‹ˆκΉŒ λͺ¨λ‘ λ‹€μš΄μ΄ λ˜μ—ˆλ‹€.

 

 

kind ν΄λŸ¬μŠ€ν„°

kind get nodes --name myk8s
myk8s-control-plane
myk8s-worker
myk8s-worker2

kubens default
Context "kind-myk8s" modified.
Active namespace is "default".

 

 

νŒŒμ΄ν”„λΌμΈμ΄ λŒμ•„κ°€κ³  도컀 ν—ˆλΈŒμ— 이미지가 μ˜¬λΌκ°„ 것을 확인할 수 μžˆλ‹€.

 

ν•˜μ§€λ§Œ! 배포λ₯Ό ν•˜κ²Œ 되면 μ΄λ ‡κ²Œ μ—λŸ¬κ°€ λœ¨λŠ”λ° μ΄μœ λŠ” 도컀 ν—ˆλΈŒκ°€ ν”„λΌμ΄λΉ—μœΌλ‘œ μ§€μ •ν•΄λ‘μ–΄μ„œ κΆŒν•œμ΄ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

 

μ™€μ΄νŒŒμ΄ 이슈둜 νŒŒλ“œ λœ¨λŠ”λ°λ§Œ 10뢄이 κ±Έλ ΈμŠ΅λ‹ˆλ‹€. 휴

 

μ•± μ—…λ°μ΄νŠΈ

λ ˆν¬μ— 2번째 λ²„μ „μœΌλ‘œ 올리고 νŒŒμ΄ν”„λΌμΈμ„ 돌리면 2.0.0 이미지가 λ°°ν¬λ˜λŠ” 것을 확인할 수 μžˆλ‹€.

 

ArgoCD

ArgoCDλŠ” GitOps 방식을 기반으둜 ν•œ μΏ λ²„λ„€ν‹°μŠ€ μ „μš© Continuous Delivery 도ꡬ이닀.

Git μ €μž₯μ†Œμ— μ„ μ–Έν˜•μœΌλ‘œ μž‘μ„±λœ Kubernetes λ§€λ‹ˆνŽ˜μŠ€νŠΈ νŒŒμΌμ„ κΈ°μ€€μœΌλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μƒνƒœλ₯Ό μ§€μ†μ μœΌλ‘œ λͺ¨λ‹ˆν„°λ§ν•˜λ©° μ‹€μ œ ν΄λŸ¬μŠ€ν„° μƒνƒœκ°€ Gitκ³Ό λ‹€λ₯Ό 경우 이λ₯Ό μžλ™μœΌλ‘œ λ™κΈ°ν™”ν•˜μ—¬ 일관성을 μœ μ§€ν•œλ‹€.

ArgoCDλŠ” μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€(UI)와 CLIλ₯Ό μ œκ³΅ν•˜λ©° 배포 이λ ₯ 관리, λ‘€λ°±, ν—¬μŠ€ 체크 λ“± 배포 κ΄€λ ¨ κΈ°λŠ₯을 μ‹œκ°μ μœΌλ‘œ μ œκ³΅ν•˜λŠ” 것이 큰 μž₯점이닀.

Git을 μ€‘μ‹¬μœΌλ‘œ λͺ¨λ“  배포 과정을 좔적 κ°€λŠ₯ν•˜κ²Œ λ§Œλ“€κΈ° λ•Œλ¬Έμ—, 운영 μ•ˆμ •μ„±κ³Ό λ³€κ²½ 이λ ₯을 λ™μ‹œμ— 확보할 수 μžˆλ‹€.

μ‹€μŠ΅

kubectl create ns argocd
cat <<EOF > argocd-values.yaml
dex:
  enabled: false

server:
  service:
    type: NodePort
    nodePortHttps: 30002
  extraArgs:
    - --insecure  # HTTPS λŒ€μ‹  HTTP μ‚¬μš©
EOF

helm repo add argo https://argoproj.github.io/argo-helm
helm install argocd argo/argo-cd --version 7.8.13 -f argocd-values.yaml --namespace argocd # 7.7.10

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d ;echo
XxJMMJUv8MHZa-kk

open "http://127.0.0.1:30002"

 

κΉƒμ˜΅μŠ€ 방식을 μ‚¬μš©ν•˜λŠ” 이유

GitOpsλŠ” Git을 단일 진싀 κ³΅κΈ‰μ›μ˜ μ†ŒμŠ€λ₯Ό 톡해 λͺ¨λ“  인프라 및 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 배포 ꡬ성을 μ„ μ–Έν˜•(Declarative)으둜 κ΄€λ¦¬ν•˜λŠ” 방식이닀. 운영 ν™˜κ²½μ˜ μƒνƒœλ₯Ό Git μ €μž₯μ†Œμ— μ •μ˜ν•˜κ³ , 이 μ €μž₯μ†Œλ₯Ό κΈ°μ€€μœΌλ‘œ μžλ™μœΌλ‘œ 동기화 및 배포λ₯Ό μ§„ν–‰ν•œλ‹€. μ΄λŸ¬ν•œ λ°©μ‹μ—λŠ” λ‹€μŒκ³Ό 같은 λͺ…ν™•ν•œ μ΄μœ μ™€ 이점이 μ‘΄μž¬ν•œλ‹€.

 

GitOpsμ—μ„œλŠ” λͺ¨λ“  변경이 Git μ»€λ°‹μœΌλ‘œ κ΄€λ¦¬λ˜λ―€λ‘œ, λˆ„κ°€ μ–Έμ œ μ–΄λ–€ 섀정을 λ³€κ²½ν–ˆλŠ”μ§€μ— λŒ€ν•œ 이λ ₯이 μžλ™μœΌλ‘œ λ‚¨λŠ”λ‹€. μ΄λŠ” λ³€κ²½ 이λ ₯ 관리, 감사 둜그(audit log), λ‘€λ°± 등에 맀우 μœ λ¦¬ν•˜λ©° 운영 μ•ˆμ •μ„±μ„ λ†’μ΄λŠ” 데 κΈ°μ—¬ν•œλ‹€.

 

Git μ €μž₯μ†Œμ˜ μ„€μ •κ³Ό μ‹€μ œ Kubernetes ν΄λŸ¬μŠ€ν„° μƒνƒœκ°€ λΆˆμΌμΉ˜ν•  경우, ArgoCD와 같은 도ꡬ가 이λ₯Ό κ°μ§€ν•˜κ³  동기화(Diff 및 Sync) κΈ°λŠ₯을 톡해 μ›λž˜ μ •μ˜λœ μƒνƒœλ‘œ 볡ꡬ할 수 μžˆλ‹€. 이λ₯Ό 톡해 잘λͺ»λœ μˆ˜λ™ λ³€κ²½μ΄λ‚˜ μž₯μ• λ‘œλΆ€ν„° λΉ λ₯΄κ²Œ 볡ꡬ할 수 μžˆλŠ” 볡원λ ₯을 μ œκ³΅ν•œλ‹€.

 

μš΄μ˜μžκ°€ kubectl λ˜λŠ” UIλ₯Ό 톡해 μˆ˜λ™μœΌλ‘œ λ¦¬μ†ŒμŠ€λ₯Ό μˆ˜μ •ν•˜λ©΄ Gitκ³Ό μ‹€μ œ ν΄λŸ¬μŠ€ν„° κ°„μ˜ μƒνƒœκ°€ μ–΄κΈ‹λ‚˜κ²Œ λœλ‹€. GitOpsλŠ” μ΄λŸ¬ν•œ μˆ˜λ™ κ°œμž…μ„ μ΅œμ†Œν™”ν•˜κ³  λ°˜λ“œμ‹œ 깃을 톡해 섀정을 λ³€κ²½ν•˜λ„λ‘ μœ λ„ν•˜μ—¬ μ‚¬λžŒμ˜ μ‹€μˆ˜λ₯Ό 쀄인닀. μœ„ μ‹€μŠ΅μ—μ„œλ„ ConfigMap을 μˆ˜λ™μœΌλ‘œ μˆ˜μ •ν•œ 경우 ArgoCDλŠ” 일뢀 차이만 κ°μ§€ν•˜κ±°λ‚˜ μ „ν˜€ κ°μ§€ν•˜μ§€ λͺ»ν•˜λŠ” 상황이 λ°œμƒν•œλ‹€.

 

λͺ¨λ“  인프라 변경이 Git을 톡해 μ΄λ£¨μ–΄μ§€λ―€λ‘œ, μ½”λ“œ 리뷰와 승인 절차λ₯Ό 거친 ν›„ μ μš©λ˜λŠ” 과정을 톡해 νŒ€ κ°„ μ•ˆμ „ν•˜κ²Œ ν˜‘μ—…ν•  수 μžˆλŠ” κΈ°λ°˜μ„ λ§ˆλ ¨ν•΄μ€€λ‹€.