💻 쿠버네티스 클러스터 구축 전체 과정 정리
하이퍼바이저: VirtualBox NAT 네트워크
OS: Ubuntu Server 24.04
CRI: containerd
CNI: Calico
설치: kubeadm / kubelet / kubectl
myserver01 — master node(control-plane)
myserver02 — worker node
myserver03 — worker node
myserver01 = 10.0.2.15
myserver02 = 10.0.2.20
myserver03 = 10.0.2.25
설정 → 네트워크 → NAT 네트워크로 변경
복제 VM은 MAC 주소 중복 주의 → Refresh 여러 번! (고유 MAC 필수)
세 노드(myserver01/02/03) 동일하게 적용
초기 복제 직후 01/02/03 모두 10.0.2.15 → 아래처럼 조정:
myserver01 → 10.0.2.15 (유지)
myserver02 → 10.0.2.20
myserver03 → 10.0.2.25
# 적용
sudo netplan apply
# 확인
ip a
⚠️ 문제 발생! 도커 존재 → 도커 다 삭제
sudo apt-get purge -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo rm -f $(which docker)
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
sudo rm -rf /etc/docker
#도커 확인
docker --version
# 호스트 이름 설정
sudo hostnamectl set-hostname myserver02
# 확인
hostname
# 재부팅
sudo reboot
👀참고) /etc/hosts에 노드 이름 등록
: /etc/hosts는 IP ↔ 도메인/호스트명 매핑 테이블
- 직접 ip 입력하는 것 대신 호스트명으로 접속 가능
ex) ssh ubuntu@10.0.2.20 -> ssh ubuntu@myserver02
# 키 생성
ssh-keygen -t rsa -b 4096
# 확인
ls -l .ssh
# 각 노드에서 상호 교차 등록
# 01
ssh-copy-id ubuntu@myserver02
ssh-copy-id ubuntu@myserver03
# 02
ssh-copy-id ubuntu@myserver01
ssh-copy-id ubuntu@myserver03
# 03
ssh-copy-id ubuntu@myserver01
ssh-copy-id ubuntu@myserver02
➡️ ssh ubuntu@myserver0# 로 비밀번호 없이 바로 접근 가능
모든 노드(myserver01~03)에서 root로 적용:
# root 계정으로 진행
sudo -i
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# 설정 적용
modprobe overlay
modprobe br_netfilter
/etc/modules-load.d/
: 이 디렉터리에 있는 파일들은 시스템이 부팅될 때 자동으로 읽혀서, 여기에 적힌 커널 모듈들을 로드overlay
: 레이어드 파일 시스템을 구현하는 모듈
- 컨테이너 이미지가 여러 층(layer)으로 구성될 수 있게 함
br_netfilter
: 브릿지 네트워크를 통해 오가는 패킷에iptables
규칙이 적용될 수 있도록 해주는 모듈
- 쿠버네티스의 네트워크 정책과 서비스 라우팅에 필수적인 기능
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
# 변경사항 완전 적용
sysctl --system
net.ipv4.ip_forward = 1
: IP forwarding을 활성화
- 리눅스 커널이 라우터처럼 동작하여, 서로 다른 네트워크 인터페이스 간에 패킷을 전달할 수 있음
- Pod 간의 통신에 필수적인 기능
# 컨테이너 설치
sudo apt update && sudo apt install -y containerd
# 확인
containerd --version
systemctl status containerd
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
# sed 를 활용한 파일 편집 systemd cgroup 설정
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
# false -> true 변경 확인
sudo cat /etc/containerd/config.toml | grep SystemdCgroup
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates
# 공식 저장소 키 & 레포
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/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.30/deb/ /" | \
sudo tee /etc/apt/sources.list.d/kubernetes.list
# 저장소 활성화 옵션 추가
sudo tee /etc/apt/apt.conf.d/99allow-insecure-repositories <<EOF
APT::Get::AllowUnauthenticated "true";
Acquire::AllowInsecureRepositories "true";
Acquire::AllowDowngradeToInsecureRepositories "true";
EOF
# 업데이트 (인증 오류 무시)
sudo apt-get update --allow-unauthenticated
# 패키지 설치 (사용 가능한 버전 찾기)
sudo apt-get install -y --allow-unauthenticated kubelet kubeadm kubectl
# 설치된 버전들 확인
kubectl version --client --output=yaml
kubeadm version
kubelet --version
# CNI 설치 및 클러스터 초기화
# calico CNI 사용시 192.168.0.0/16 IP로 등록 / 쿠버네티스 Pod 네트워크 대역을 지정하는 설정
# Calico 공식 매니페스트(calico.yaml) 에 기본적으로 192.168.0.0/16 대역이 설정되어 있음
# containerd 로 설정하여 이미지를 받을수 있게 설정(20250922 기준 필요)
sudo kubeadm config images pull --cri-socket unix:///run/containerd/containerd.sock
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
sudo kubeadm init --apiserver-advertise-address=10.0.2.15 --pod-network-cidr=192.168.0.0/16 --cri-socket /run/containerd/containerd.sock
# 클러스터 관리 설정
# config : Kubernetes 클러스터 접속 정보를 담고 있는 설정 파일
# 사용자가 k8s 활용 가능하도록 설정을 저장할 디렉토리 생성
# 설정 디렉터리의 소유자와 그룹을 변경해 현재 사용자가 사용할 수 있도록 변경
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 확인
$ ls.kube/
config
방법 1) 직접 다운 받고 설치
$ curl https://docs.projectcalico.org/manifests/calico.yaml
$ kubectl apply -f calico.yaml
방법 2) 설정 파일 reset
sudo kubeadm reset -f
sudo systemctl stop kubelet
sudo systemctl stop containerd
sudo rm -rf /etc/kubernetes /var/lib/etcd
sudo systemctl start containerd
sudo kubeadm init --apiserver-advertise-address=10.0.2.15 --pod-network-cidr=192.168.0.0/16 --cri-socket /run/containerd/containerd.sock
방법 3) 이미지 레지스트리 교체 (도커 허브 풀 에러)
# 1) 매니페스트 내려받기
curl -fsSLO https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/calico.yaml
# 2) docker.io/calico → quay.io/calico 로 치환
sed -i 's#docker.io/calico#quay.io/calico#g' calico.yaml
# 3) 적용
kubectl apply -f calico.yaml
sudo kubeadm join 10.0.2.15:6443 \
--token <토큰> \
--discovery-token-ca-cert-hash sha256:<해시>
kubectl get nodes -o wide
모든 노드가 Ready면 성공! 🎉