스타트업 초기에는 EC2 인스턴스에 직접 배포하는 방식을 사용했으나, 서비스 규모가 커지면서 관리해야 할 인스턴스가 20개를 넘어가기 시작했습니다. 배포 때마다 사람이 수동으로 스크립트를 실행하다 보니 버전 불일치 문제와 휴먼 에러가 빈번하게 발생했습니다. 이에 컨테이너 오케스트레이션의 표준인 Kubernetes를 도입하고, ArgoCD를 활용한 GitOps 체계를 구축하여 배포 프로세스를 자동화하기로 결정했습니다.
실습 환경은 다음과 같습니다:
모든 노드에서 공통적으로 실행해야 할 설정입니다. 스왑 메모리를 비활성화하고 필수 커널 모듈을 로드합니다.
# 스왑 비활성화
sudo swapoff -a
sudo sed -i '/ swap / s/^\(দীর\)$/#\1/g' /etc/fstab
# 커널 모듈 로드
cat <
Docker 대신 가벼운 Containerd를 런타임으로 사용합니다.
sudo apt-get update
sudo apt-get install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# SystemdCgroup = true 로 변경 필요
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
마스터 노드에서 초기화를 진행합니다.
sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address={Master_Node_IP}
초기화가 완료되면 출력되는 kubeadm join ... 명령어를 복사해둡니다.
이후 Pod 통신을 위해 Calico CNI를 설치합니다.
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/custom-resources.yaml
별도의 네임스페이스를 생성하고 ArgoCD를 배포합니다.
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
기본적으로 ArgoCD 서버는 ClusterIP로 설정되어 있습니다. 테스트를 위해 NodePort로 변경하거나 LoadBalancer를 연결합니다.
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'
초기 admin 비밀번호는 다음 명령어로 확인합니다.
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
ArgoCD UI에 접속하여 Settings > Repositories에서 애플리케이션 매니페스트(YAML)가 저장된 Git 리포지토리를 등록합니다.
Private 리포지토리인 경우 PAT(Personal Access Token) 또는 SSH Key를 등록해야 합니다.
ArgoCD에서 새로운 App을 생성합니다.
생성 버튼을 누르면 ArgoCD가 Git 리포지토리의 내용을 읽어와 현재 클러스터 상태와 비교(Diff)하고, Sync를 수행하여 리소스를 생성합니다.
이 프로젝트를 통해 얻은 주요 성과는 다음과 같습니다.
git revert만으로 즉시 롤백이 가능해졌습니다.