Kubernetes Tools/ArgoCD

[Ep.27] [Argo CD ์„ฑ๋Šฅ ์ตœ์ ํ™” #4] Argo CD์™€ Terraform์„ ํ™œ์šฉํ•œ ์ธํ”„๋ผ GitOps ์šด์˜

ygtoken 2025. 3. 17. 13:11
728x90

๐Ÿ”น Terraform๊ณผ GitOps๋ž€?

Terraform์€ ์ธํ”„๋ผ๋ฅผ ์ฝ”๋“œ(Infrastructure as Code, IaC)๋กœ ๊ด€๋ฆฌํ•˜๋Š” ์˜คํ”ˆ์†Œ์Šค ๋„๊ตฌ์ด๋ฉฐ,
GitOps๋Š” Git์„ ๋‹จ์ผ ์‹ ๋ขฐ ์›์ฒœ(Source of Truth)์œผ๋กœ ํ™œ์šฉํ•˜์—ฌ ์ธํ”„๋ผ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

Argo CD์™€ Terraform์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด Kubernetes ๋ฆฌ์†Œ์Šค๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ธํ”„๋ผ๋„ GitOps ๋ฐฉ์‹์œผ๋กœ ์šด์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โœ… Terraform + GitOps ์—ฐ๋™ ๋ฐฉ์‹ 

๊ตฌ์„ฑ ์š”์†Œ ์„ค๋ช…
Git ์ €์žฅ์†Œ Terraform ์ฝ”๋“œ ๋ฐ Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๊ด€๋ฆฌ
Terraform ํด๋ผ์šฐ๋“œ ์ธํ”„๋ผ(AWS, Azure, GCP ๋“ฑ) ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ
Argo CD GitOps ๋ฐฉ์‹์œผ๋กœ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ
CI/CD ์‹œ์Šคํ…œ (GitHub Actions, Jenkins) Terraform ์ ์šฉ ๋ฐ Kubernetes ๋ฐฐํฌ ์ž๋™ํ™”
Kubernetes ํด๋Ÿฌ์Šคํ„ฐ Argo CD ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐฐํฌ๋  ํ™˜๊ฒฝ

๐Ÿ”น Terraform๊ณผ Argo CD๋ฅผ ํ™œ์šฉํ•œ GitOps ์šด์˜ ํ๋ฆ„

1๏ธโƒฃ ๊ฐœ๋ฐœ์ž๊ฐ€ Terraform ๋ฐ Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ Git ์ €์žฅ์†Œ์— Push
2๏ธโƒฃ CI/CD ์‹œ์Šคํ…œ(GitHub Actions, Jenkins ๋“ฑ) ์ด Terraform์„ ์‹คํ–‰ํ•˜์—ฌ ์ธํ”„๋ผ๋ฅผ ๋ฐฐํฌ
3๏ธโƒฃ Argo CD๊ฐ€ ๋ณ€๊ฒฝ๋œ Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž๋™ ๋ฐฐํฌ


๐Ÿ”น 1. Terraform์„ ํ™œ์šฉํ•œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ํ”„๋กœ๋น„์ €๋‹

Terraform์„ ํ™œ์šฉํ•˜์—ฌ ํด๋ผ์šฐ๋“œ์— Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜ ์˜ˆ์ œ๋Š” AWS EKS ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•˜๋Š” Terraform ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

 

โœ… Terraform ์˜ˆ์ œ (AWS EKS ํด๋Ÿฌ์Šคํ„ฐ ์ƒ์„ฑ)

# AWS Provider ์„ค์ •: ์‚ฌ์šฉํ•  AWS ๋ฆฌ์ „์„ ์ง€์ •
provider "aws" {
  region = "us-west-2"  # AWS ๋ฆฌ์ „(us-west-2)์„ ์‚ฌ์šฉ
}

# AWS EKS(Elastic Kubernetes Service) ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค ์ •์˜
resource "aws_eks_cluster" "eks_cluster" {
  name     = "example-eks-cluster"  # ์ƒ์„ฑํ•  EKS ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ด๋ฆ„ ์ง€์ •
  role_arn = aws_iam_role.eks.arn  # ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์‚ฌ์šฉํ•  IAM ์—ญํ• (๊ถŒํ•œ)

  vpc_config {
    subnet_ids = aws_subnet.public[*].id  # VPC ์„œ๋ธŒ๋„ท ID ๋ชฉ๋ก์„ ์„ค์ • (ํผ๋ธ”๋ฆญ ์„œ๋ธŒ๋„ท ์‚ฌ์šฉ)
  }
}

# ํด๋Ÿฌ์Šคํ„ฐ ์—”๋“œํฌ์ธํŠธ ์ถœ๋ ฅ
output "cluster_endpoint" {
  value = aws_eks_cluster.eks_cluster.endpoint  # ์ƒ์„ฑ๋œ EKS ํด๋Ÿฌ์Šคํ„ฐ์˜ API ์„œ๋ฒ„ ์—”๋“œํฌ์ธํŠธ ์ถœ๋ ฅ
}

 

โœ… Terraform ์ ์šฉ ๋ฐฉ๋ฒ•

terraform init
terraform apply -auto-approve

๐Ÿ”น 2. Terraform๊ณผ Argo CD๋ฅผ ์—ฐ๋™ํ•˜์—ฌ GitOps ๋ฐฉ์‹์œผ๋กœ ์ธํ”„๋ผ ์šด์˜

Terraform์ด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ ํ›„, Argo CD๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… Terraform์„ ์ด์šฉํ•ด Argo CD๋ฅผ ์ž๋™ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•

์•„๋ž˜ ์˜ˆ์ œ๋Š” Terraform์„ ์‚ฌ์šฉํ•˜์—ฌ Argo CD๋ฅผ Helm Chart๋กœ Kubernetes์— ๋ฐฐํฌํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

 

โœ… Terraform์„ ํ™œ์šฉํ•œ Argo CD ๋ฐฐํฌ ์˜ˆ์ œ

# Kubernetes Provider ์„ค์ •: ๋กœ์ปฌ Kubeconfig๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ
provider "kubernetes" {
  config_path = "~/.kube/config"  # Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ์„ค์ • ํŒŒ์ผ ๊ฒฝ๋กœ
}

# Helm์„ ์‚ฌ์šฉํ•˜์—ฌ Argo CD ๋ฐฐํฌ
resource "helm_release" "argocd" {
  name       = "argocd"  # Helm ๋ฆด๋ฆฌ์Šค ์ด๋ฆ„
  repository = "https://argoproj.github.io/argo-helm"  # Argo CD Helm ์ฐจํŠธ ์ €์žฅ์†Œ
  chart      = "argo-cd"  # ๋ฐฐํฌํ•  Helm ์ฐจํŠธ ์ด๋ฆ„
  namespace  = "argocd"  # ๋ฐฐํฌํ•  ๋„ค์ž„์ŠคํŽ˜์ด์Šค
  create_namespace = true  # ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์—†์œผ๋ฉด ์ž๋™ ์ƒ์„ฑ

  # Argo CD์˜ ์„œ๋น„์Šค ํƒ€์ž…์„ LoadBalancer๋กœ ์„ค์ •
  set {
    name  = "server.service.type"  # ๋ณ€๊ฒฝํ•  Helm ์ฐจํŠธ์˜ ์„ค์ • ๊ฐ’
    value = "LoadBalancer"  # Argo CD ์„œ๋ฒ„๋ฅผ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก LoadBalancer๋กœ ์„ค์ •
  }
}

 

โœ… Terraform์„ ์‚ฌ์šฉํ•ด Argo CD ๋ฐฐํฌ ์ ์šฉ

terraform init
terraform apply -auto-approve

 

โœ… Argo CD ๋ฐฐํฌ ํ™•์ธ

kubectl get svc -n argocd

๐Ÿ”น 3. Argo CD์—์„œ Terraform์œผ๋กœ ํ”„๋กœ๋น„์ €๋‹๋œ ํด๋Ÿฌ์Šคํ„ฐ์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ

Terraform์„ ์ด์šฉํ•ด Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Argo CD๋ฅผ ๋ฐฐํฌํ•œ ํ›„,
Argo CD๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ GitOps ๋ฐฉ์‹์œผ๋กœ ์ž๋™ ๋ฐฐํฌ
ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… Argo CD Application์„ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž๋™ ๋ฐฐํฌ

apiVersion: argoproj.io/v1alpha1  # Argo CD API ๋ฒ„์ „
kind: Application  # Argo CD์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
metadata:
  name: example-app
  namespace: argocd
spec:
  project: default

  source:
    repoURL: https://github.com/example/repo.git  # Git ์ €์žฅ์†Œ URL
    targetRevision: main
    path: k8s  # Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ์ €์žฅ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ

  destination:
    server: https://kubernetes.default.svc  # ๋ฐฐํฌํ•  Kubernetes ํด๋Ÿฌ์Šคํ„ฐ
    namespace: example-app

  syncPolicy:
    automated:
      prune: true
      selfHeal: true

 

โœ… Argo CD๋ฅผ ํ™œ์šฉํ•œ ์ž๋™ ๋™๊ธฐํ™” ์‹คํ–‰

argocd app sync example-app

๐Ÿ”น 4. Argo CD & Terraform GitOps ์šด์˜ ์ตœ์ ํ™” ์ „๋žต

โœ… 1๏ธโƒฃ Git ์ €์žฅ์†Œ ๊ตฌ์กฐ ์ตœ์ ํ™”

Git ์ €์žฅ์†Œ์—์„œ Terraform ์ฝ”๋“œ์™€ Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

๐Ÿ“‚ Git Repository ๊ตฌ์กฐ ์˜ˆ์‹œ

๐Ÿ“ฆ gitops-repo
 โ”ฃ ๐Ÿ“‚ terraform (ํด๋Ÿฌ์Šคํ„ฐ ํ”„๋กœ๋น„์ €๋‹ ์ฝ”๋“œ)
 โ”ฃ ๐Ÿ“‚ argocd (Argo CD ๋ฐฐํฌ ๋งค๋‹ˆํŽ˜์ŠคํŠธ)
 โ”— ๐Ÿ“‚ applications (๋ฐฐํฌํ•  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ)

โœ… 2๏ธโƒฃ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• (Terraform + Argo CD ์—ฐ๋™)

Terraform๊ณผ Argo CD๋ฅผ CI/CD ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์•„๋ž˜๋Š” GitHub Actions๋ฅผ ํ™œ์šฉํ•œ Terraform ๋ฐ Argo CD ๋ฐฐํฌ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

 

โœ… GitHub Actions ์˜ˆ์ œ (.github/workflows/deploy.yml)

name: Deploy Infrastructure & Applications  # GitHub Actions ์›Œํฌํ”Œ๋กœ์šฐ ์ด๋ฆ„

on:
  push:
    branches:
      - main  # main ๋ธŒ๋žœ์น˜์— Push ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์‹คํ–‰

jobs:
  terraform:
    runs-on: ubuntu-latest  # CI/CD ์‹คํ–‰ ํ™˜๊ฒฝ (Ubuntu ์ตœ์‹  ๋ฒ„์ „ ์‚ฌ์šฉ)
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2  # ํ˜„์žฌ GitHub ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ฒดํฌ์•„์›ƒ

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v1  # Terraform ์„ค์น˜

      - name: Terraform Init & Apply
        run: |
          cd terraform  # terraform ๋””๋ ‰ํ„ฐ๋ฆฌ๋กœ ์ด๋™
          terraform init  # Terraform ์ดˆ๊ธฐํ™”
          terraform apply -auto-approve  # Terraform ์‹คํ–‰ (์ž๋™ ์Šน์ธ)
  
  argocd:
    needs: terraform  # terraform ์ž‘์—…์ด ๋๋‚œ ํ›„ ์‹คํ–‰ (์˜์กด์„ฑ ์„ค์ •)
    runs-on: ubuntu-latest  # CI/CD ์‹คํ–‰ ํ™˜๊ฒฝ (Ubuntu ์ตœ์‹  ๋ฒ„์ „ ์‚ฌ์šฉ)
    steps:
      - name: Install Argo CD CLI
        run: |
          curl -sSL -o /usr/local/bin/argocd \
          https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
          chmod +x /usr/local/bin/argocd  # Argo CD CLI๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ›„ ์‹คํ–‰ ๊ถŒํ•œ ๋ถ€์—ฌ

      - name: Deploy Application using Argo CD
        run: |
          argocd app sync example-app  # Argo CD๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ example-app ๋™๊ธฐํ™” ์‹คํ–‰

 

โœ… Terraform → Argo CD ์—ฐ๋™ ์ž๋™ํ™” ๊ณผ์ •:
1๏ธโƒฃ Terraform์„ ์‹คํ–‰ํ•˜์—ฌ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ Argo CD๋ฅผ ๋ฐฐํฌ
2๏ธโƒฃ Terraform ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด Argo CD๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž๋™ ๋ฐฐํฌ


๐Ÿ”น ๊ฒฐ๋ก : ์ด๋ฒˆ ๊ธ€์—์„œ ๋ฐฐ์šด ํ•ต์‹ฌ ๋‚ด์šฉ ์ •๋ฆฌ

๐ŸŸข Terraform์„ ํ™œ์šฉํ•˜์—ฌ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๋ฐ Argo CD๋ฅผ ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Œ
๐ŸŸข GitOps ๋ฐฉ์‹์œผ๋กœ Terraform๊ณผ Argo CD๋ฅผ ์—ฐ๋™ํ•˜๋ฉด ์ „์ฒด ์ธํ”„๋ผ์™€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Git์—์„œ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
๐ŸŸข CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜์—ฌ Terraform ์‹คํ–‰ ํ›„ Argo CD๊ฐ€ ์ž๋™์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋„๋ก ๊ตฌ์„ฑ ๊ฐ€๋Šฅ
๐ŸŸข Git ์ €์žฅ์†Œ๋ฅผ ๊ตฌ์กฐํ™”ํ•˜์—ฌ Terraform ์ฝ”๋“œ์™€ Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ์šด์˜์ด ๋”์šฑ ํšจ์œจ์ ์ž„

728x90