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μ ν΅ν΄ μ΄λ£¨μ΄μ§λ―λ‘, μ½λ 리뷰μ μΉμΈ μ μ°¨λ₯Ό κ±°μΉ ν μ μ©λλ κ³Όμ μ ν΅ν΄ ν κ° μμ νκ² νμ ν μ μλ κΈ°λ°μ λ§λ ¨ν΄μ€λ€.
'Infra > AWS' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[AEWS] #9μ£Όμ°¨ EKS λΈλ£¨ κ·Έλ¦° λ§μ΄κ·Έλ μ΄μ with Terraform (0) | 2025.04.03 |
---|---|
[AEWS] #7μ£Όμ°¨ Fargate λ°°ν¬ μ€μ΅ (1) | 2025.03.23 |
[AEWS] #6μ£Όμ°¨ Kyverno μ€μ΅ (5) (0) | 2025.03.16 |
[AEWS] #6μ£Όμ°¨ IRSA μ€μ΅ (4) (1) | 2025.03.16 |
[AEWS] #6μ£Όμ°¨ EKS μΈμ¦/μΈκ° (3) (1) | 2025.03.16 |