๐น 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 ๋งค๋ํ์คํธ๋ฅผ ๋ถ๋ฆฌํ๋ฉด ์ด์์ด ๋์ฑ ํจ์จ์ ์