summary: "GitOps 1편의 개념을 바탕으로, Kubernetes Linux 환경 설치와 Kustomize 기반 GitOps 구성 방법을 다룹니다."
"Git이 운영의 단일 진실(SSOT)이라면, 클러스터와 매니페스트 구조는 그 진실을 정확히 실행할 수 있어야 합니다"
1편에서 GitOps의 핵심 개념(선언형, SSOT, 동기화 루프)을 설명했다면,
2편에서는 kubeadm 기반 Kubernetes Linux 환경을 준비하고 Kustomize base + overlays 구조로 GitOps 저장소를 구성하는 과정을 다룹니다.
#1. 전체 구성
- Kubernetes Runtime: kubeadm + containerd
- GitOps 구조: Kustomize
base + overlays - 배포 동기화: Argo CD Application
핵심 원칙:
- 공통 정의는
base - 환경 차이는
overlays - 배포 트리거는 Git 변경
#2. Kubernetes Linux 환경 설치
기준: Ubuntu 24.04 LTS, 모든 노드(Control Plane / Worker) 공통
2-1. OS 기본 설정
sudo apt update
sudo apt upgrade -y
sudo timedatectl set-timezone Asia/Seoul
sudo hostnamectl set-hostname <NODE_HOSTNAME>
# swap 비활성화
sudo swapoff -a
sudo sed -i.bak '/swap/d' /etc/fstab
# 커널 모듈
cat <<'EOF' | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# sysctl
cat <<'EOF' | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system2-2. containerd 설치
sudo apt install -y ca-certificates curl gnupg apt-transport-https software-properties-common
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y containerd.io
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl enable --now containerd2-3. kubeadm / kubelet / kubectl 설치
# 설치할 Kubernetes 메이저/마이너 버전 (예: v1.30, v1.31)
# 최신 지원 버전은 공식 문서/릴리즈 노트에서 확인 후 지정
K8S_VERSION="v1.30"
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
sudo mkdir -p /etc/apt/keyrings
curl -fsSL "https://pkgs.k8s.io/core:/stable:/${K8S_VERSION}/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:/${K8S_VERSION}/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 systemctl enable --now kubelet2-4. Control Plane 초기화
sudo kubeadm config images pull
sudo kubeadm init \
--pod-network-cidr=192.168.0.0/16 \
--control-plane-endpoint=<CONTROL_PLANE_ENDPOINT>kubeconfig 설정:
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config초기화 실패 시 containerd 재설정:
sudo rm /etc/containerd/config.toml
sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd2-5. CNI 및 기본 스토리지
# Calico
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
# Local Path Provisioner
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/v0.0.24/deploy/local-path-storage.yaml
kubectl annotate storageclass local-path storageclass.kubernetes.io/is-default-class="true"주: 위 CNI/스토리지 매니페스트 버전은 작성 시점 기준 예시입니다. 클러스터 버전 업그레이드 또는 보안 패치가 필요한 경우, 각 프로젝트의 최신 릴리즈 노트/공식 설치 문서를 확인해 최신 안정 버전으로 교체해 사용하세요.
2-6. Worker Node 조인
sudo kubeadm join <CONTROL_PLANE_IP>:6443 \
--token <TOKEN> \
--discovery-token-ca-cert-hash sha256:<HASH>클러스터 상태 확인:
kubectl get nodes -o wide
kubectl get pods -A#3. Kustomize GitOps 레포지토리 구조
gitops-repo/
├── apps/
│ ├── backend/
│ │ ├── base/
│ │ └── overlays/
│ │ ├── dev-ko/
│ │ ├── dev-en/
│ │ ├── staging/
│ │ └── prod/
│ ├── front/
│ │ ├── base/
│ │ └── overlays/
│ ├── edge/
│ │ ├── base/
│ │ └── overlays/
│ ├── foundation/
│ │ ├── base/
│ │ └── overlays/
│ └── database/
│ ├── base/
│ └── overlays/
└apps/*/base: 공통 리소스apps/*/overlays/<env>: 환경별 패치
#4. Kustomize 작성 예시
4-1. base
# apps/backend/base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml# apps/backend/base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-backend
spec:
selector:
matchLabels:
app: app-backend
template:
metadata:
labels:
app: app-backend
spec:
containers:
- name: backend
image: registry.example.com/app-backend:latest
ports:
- containerPort: 80804-2. overlay
# apps/backend/overlays/dev-ko/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: app-dev-ko
resources:
- ../../base
patchesStrategicMerge:
- patch-deployment.yaml
images:
- name: registry.example.com/app-backend
newTag: dev-ko-2026-03-02# apps/backend/overlays/dev-ko/patch-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-backend
spec:
replicas: 2
template:
spec:
containers:
- name: backend
env:
- name: SPRING_PROFILES_ACTIVE
value: dev
- name: LOCALE
value: ko#5. Argo CD 구성 파일 구조
k8s/argocd/
├── install/
│ ├── kustomization.yaml
│ ├── configs/
│ │ ├── argocd-cm.yaml
│ │ └── argocd-rbac-cm.yaml
│ └── patches/
│ └── argocd-server-nodeport.yaml
└── apps/
├── kustomization.yaml
├── values.env
├── kustomizeconfig/
├── foundation-application.yaml
├── database-application.yaml
├── backend-application.yaml
├── frontend-application.yaml
└── edge-application.yaml#6. Argo CD 적용 명령어
사전 리소스 적용:
./scripts/install.sh ENV_FILE=prod.envArgo CD 앱 변수 설정:
vi k8s/argocd/apps/values.envArgo CD 설치:
kubectl apply -k k8s/argocd/install
kubectl -n claritrace-argocd rollout status deploy/argocd-serverApplication 반영:
kubectl apply -k k8s/argocd/apps초기 admin 비밀번호 확인:
kubectl -n claritrace-argocd get secret argocd-initial-admin-secret \
-o jsonpath='{.data.password}' | base64 -d && echo#7. 참고: HostPath 기반 PVC 초기 디렉터리 준비
# 디렉터리 생성
sudo mkdir -p /data/app/dev-en/db
sudo mkdir -p /data/app/dev-en/storage
# DB 권한
sudo chown -R 1001:1001 /data/app/dev-en/db
sudo chmod -R 775 /data/app/dev-en/db
# Storage 권한
sudo chmod -R 777 /data/app/dev-en/storage환경마다
/data/app/<env>/...패턴으로 경로를 분리해 사용합니다.
#8. 정리
- Kubernetes Linux 설치는 kubeadm + containerd 기준으로 고정
- GitOps 레포는 Kustomize
base + overlays구조로 분리 - Argo CD는
install과apps를 분리해 관리
이 구조를 기준으로 하면 환경별 차이를 오버레이로 통제하면서 선언형 배포 흐름을 유지할 수 있습니다.