본문 바로가기
IT/k8s

[K8s] 맨땅에 쿠버네티스 구축하기 Day 2: Master 초기화부터 Worker Join까지 (feat. Calico)

by 수누다 2026. 1. 27.

들어가며

안녕하세요, 13년 차 시스템 엔지니어 수누다입니다.

지난 [Day 1]에서는 리눅스 커널 튜닝과 컨테이너 런타임 설정을 통해 '기초 공사'를 마쳤습니다. 오늘은 드디어 쿠버네티스(Kubernetes)라는 OS를 이 서버들 위에 실제로 올리는 날입니다.

흩어져 있던 3대의 서버가 비로소 하나의 '클러스터(Cluster)'로 묶이는 마법 같은 과정을 시작해 보겠습니다.

1. 쿠버네티스 설치 도구 다운로드 (All Nodes)

먼저 3대의 서버(Master, Worker 1, 2) 모두에 핵심 도구 3인방을 설치해야 합니다.

  • kubeadm: 클러스터를 구축해 주는 도구
  • kubelet: 파드(Pod)를 실행하고 관리하는 노드 에이전트
  • kubectl: 클러스터에 명령을 내리는 커맨드 라인 도구
# 1. 필수 패키지 설치 & GPG 키 추가 (구글 공식 가이드 기준)
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

# (참고: 실제 레포지토리 등록 과정은 K8s 공식 문서 버전에 맞춰 진행하세요)

# 2. 도구 설치
sudo apt install -y kubelet kubeadm kubectl

# 3. 버전 고정 (매우 중요 ⭐)
sudo apt-mark hold kubelet kubeadm kubectl

💡 엔지니어의 Tip: 왜 버전을 고정하나요?
apt upgrade 명령어를 쳤다가 쿠버네티스 버전이 의도치 않게 올라가면, 노드 간 버전 불일치로 클러스터가 깨질 수 있습니다. apt-mark hold는 이를 방지하는 엔지니어의 안전벨트입니다.

2. 마스터 노드 초기화 (Master Only)

이제 대장 서버(k8s-master)를 깨울 차례입니다. 이 명령어는 오직 마스터 노드에서만 실행합니다.

sudo kubeadm init \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=192.168.20.141
  • --pod-network-cidr=10.244.0.0/16: 파드들이 내부적으로 사용할 IP 대역입니다. (나중에 설치할 CNI 설정과 맞춰야 합니다.)
  • --apiserver-advertise-address: 마스터 노드가 통신할 자신의 실제 IP를 명시합니다.

"혹시 초기화 화면을 캡처하지 못하고 닫으셨나요? 당황하지 마세요. kubeadm token create --print-join-command를 입력하면 언제든 Join 명령어를 다시 볼 수 있습니다. 저도 다시 출력해서 캡처했습니다."

 

🚀 초기화 후 필수 작업 (Config 설정)

init이 성공하면 "To start using your cluster..."라는 문구가 나옵니다. 이때 아래 명령어를 바로 실행해줘야 kubectl 명령어가 먹힙니다.

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

3. 네트워크 플러그인 (Calico) 설치

초기화가 끝나도 kubectl get nodes를 쳐보면 상태가 NotReady일 겁니다. 노드끼리 통신할 도로(CNI)가 없어서 그렇습니다. 가장 대중적인 Calico를 설치하겠습니다.

# 1. Calico yaml 파일 다운로드
curl https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml -O

# 2. CIDR 수정 (핵심 ⭐)
# Calico 기본 대역(192.168...)을 우리가 init 때 설정한 10.244...로 바꿔줍니다.
sed -i 's/192.168.0.0\/16/10.244.0.0\/16/g' calico.yaml

# 3. 설치 적용
kubectl apply -f calico.yaml

 

4. 워커 노드 합류 (Worker Join)

이제 혼자 있는 마스터에게 일꾼(Worker)들을 붙여줄 차례입니다.
마스터 초기화(step 2) 마지막에 나왔던 kubeadm join ... 명령어를 복사해서 워커 노드 1, 2에 붙여넣으세요. (반드시 sudo를 붙여야 합니다!)

# Worker Node 터미널에서 실행
sudo kubeadm join 192.168.20.141:6443 \
  --token <토큰값> \
  --discovery-token-ca-cert-hash <해시값>

⚠️ 엔지니어의 '삽질 방지' Tip: 토큰을 잃어버렸다면?

초기화할 때 나온 Join 명령어를 복사해두지 못했거나, 토큰 유효기간(24시간)이 지났나요? 당황하지 마세요. 마스터 노드에서 아래 명령어로 언제든 다시 만들 수 있습니다.
kubeadm token create --print-join-command

마무리: 성공 확인

마스터 노드에서 아래 명령어를 입력했을 때, 3대 모두 Ready 상태가 뜬다면 성공입니다!

kubectl get nodes

[결과 예시]

NAME          STATUS   ROLES           AGE   VERSION
k8s-master    Ready    control-plane   10m   v1.28.2
k8s-worker1   Ready    <none>          2m    v1.28.2
k8s-worker2   Ready    <none>          2m    v1.28.2

이제 우리는 완벽하게 작동하는 쿠버네티스 클러스터를 손에 넣었습니다. 다음 [Day 3]에서는 이 위에 실제로 서비스를 띄우고(Nginx), 외부에서 접속해보는 테스트를 진행하겠습니다.