시리즈 안내
이 글은 “중소기업 쿠버네티스 구축” 시리즈의 2편입니다. 1편에서 4대 VM의 설계도를 그렸다면, 이번 편에서는 그 4대에 OS를 올린 직후 공통으로 해야 할 사전 준비 작업을 실제 명령어와 함께 진행합니다. 쿠버네티스를 설치하기 전, OS 차원의 토대를 다지는 단계입니다.
들어가며
쿠버네티스 설치는 의외로 명령어 한두 줄로 끝납니다. 그런데 그 전에 OS를 제대로 준비하지 않으면 설치는 되더라도 이상하게 동작하거나, 한참 뒤에 원인 모를 문제로 돌아옵니다.
이번 편에서 다루는 작업은 전부 “왜 해야 하는지”가 분명한 것들입니다. 단순히 “쿠버네티스 설치 가이드에 나와 있으니까”가 아니라, 각 작업이 무엇을 막아주는지 이해하고 넘어가겠습니다.
전제는 이렇습니다.
- 1편 설계대로 4대 VM에 Ubuntu Server 24.04 LTS 설치 완료
- 각 노드에 고정 IP 할당 완료 (마스터 .101, 워커 .111/.112/.116)
- SSH 접속 가능
이 글의 모든 작업은 4대 노드 모두에서 동일하게 실행합니다. 한 대씩 빠짐없이 적용하세요.
0. 작업 전 팁: sudo 비밀번호 매번 안 치기
본격적으로 시작하기 전에 소소하지만 유용한 팁 하나. 작업 중 sudo를 칠 때마다 비밀번호를 묻는 게 번거롭다면, 세션 동안만 유지시킬 수 있습니다.
sudo -v
한 번 비밀번호를 입력하면 15분간 sudo가 비밀번호를 묻지 않습니다. 작업 중간에 sudo -v를 다시 치면 타이머가 갱신됩니다.
운영 환경에서는 NOPASSWD(비밀번호 영구 생략) 설정을 권하지 않습니다. 편하긴 하지만 보안이 약해집니다. 작업 세션 동안만
sudo -v로 충분합니다.
1. 패키지 업데이트와 커널 업그레이드
가장 먼저 시스템을 최신 상태로 만듭니다.
sudo apt update && sudo apt upgrade -y
운영 환경은 처음부터 이걸 하고 가는 게 좋습니다. 개발 환경에서는 생략하기도 하지만, 운영은 커널·보안 패치를 최신으로 맞춰두고 시작해야 나중에 골치 아픈 일이 줄어듭니다. 커널이 업그레이드됐다면 이 단계 후 재부팅해서 새 커널로 올라온 뒤 다음 작업을 진행하세요.
sudo reboot
이어서 앞으로 필요한 기본 패키지를 미리 설치합니다.
sudo apt install -y curl wget vim net-tools nfs-common chrony
nfs-common: 나중에 NAS(MinIO 스토리지)를 마운트할 때 필요chrony: 시간 동기화 (바로 다음 절에서 설명)- 나머지는 운영 중 자주 쓰는 기본 도구
2. 호스트명과 /etc/hosts 설정
각 노드가 서로를 이름으로 알아볼 수 있게 합니다. 먼저 각 노드에서 자기 호스트명을 설정합니다.
# 마스터 노드에서
sudo hostnamectl set-hostname dzpik8smsys
# 앱 워커 #1에서
sudo hostnamectl set-hostname dzpik8swapp1
# ... 각 노드에서 자기 이름으로
그다음 4대 모두의 /etc/hosts에 전체 노드 정보를 등록합니다. 이러면 노드끼리 IP 대신 이름으로 통신할 수 있습니다.
sudo tee -a /etc/hosts <<EOF
10.0.12.101 dzpik8smsys
10.0.12.111 dzpik8swapp1
10.0.12.112 dzpik8swapp2
10.0.12.116 dzpik8sosys
EOF
호스트명과 IP는 1편에서 정한 설계값입니다. 실제 환경에 맞게 바꿔 쓰세요.
3. 시간 동기화 (chrony)
쿠버네티스에서 노드 간 시간이 어긋나면 인증서 검증부터 깨집니다. TLS 인증서는 “언제부터 언제까지 유효”라는 시간 정보를 담고 있는데, 노드 시계가 틀어지면 멀쩡한 인증서를 만료됐다고 판단하거나 그 반대가 됩니다. 그래서 시간 동기화는 선택이 아니라 필수입니다.
sudo timedatectl set-timezone Asia/Seoul
sudo systemctl enable --now chrony
설정 후 동기화 상태를 확인합니다.
timedatectl status
출력에서 NTP service: active와 System clock synchronized: yes가 보이면 정상입니다.
4. swap 비활성화
쿠버네티스는 기본적으로 swap이 켜져 있으면 정상 동작하지 않습니다(kubelet이 거부). 이유는 쿠버네티스가 메모리를 정밀하게 관리·예측하려 하는데, swap이 끼어들면 “메모리가 부족한데 디스크로 밀어내서 버티는” 상황이 생겨 스케줄링 판단이 어긋나기 때문입니다.
지금 당장 swap을 끄고:
sudo swapoff -a
재부팅 후에도 꺼진 상태를 유지하도록 /etc/fstab에서 swap 항목을 주석 처리합니다.
sudo sed -i '/swap/s/^/#/' /etc/fstab
확인:
free -h
Swap 행이 모두 0이면 정상입니다.
5. 커널 모듈 로드
쿠버네티스 네트워킹(특히 컨테이너 간 통신과 패킷 라우팅)에는 두 개의 커널 모듈이 필요합니다.
overlay: 컨테이너 이미지의 레이어드 파일시스템(OverlayFS)에 필요br_netfilter: 브리지를 통과하는 패킷이 iptables 규칙을 타도록 함 (Pod 네트워킹의 핵심)
지금 즉시 로드하고:
sudo modprobe overlay
sudo modprobe br_netfilter
재부팅 후에도 자동으로 로드되도록 설정 파일에 등록합니다.
echo -e "overlaynbr_netfilter" | sudo tee /etc/modules-load.d/k8s.conf
6. sysctl 네트워크 파라미터
커널 모듈을 올렸으면, 이제 네트워크 동작을 쿠버네티스에 맞게 조정합니다. 세 가지 값을 켭니다.
bridge-nf-call-iptables: 브리지 네트워크 트래픽이 iptables를 거치도록 (Pod 간 통신·정책 적용에 필수)bridge-nf-call-ip6tables: 위와 동일, IPv6용ip_forward: 노드가 패킷을 포워딩하도록 허용 (Pod 네트워크 라우팅에 필수)
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 --system
5번(커널 모듈)을 먼저 하지 않으면
bridge-nf-call-iptables설정이 적용되지 않습니다.br_netfilter모듈이 이 파라미터를 제공하기 때문입니다. 반드시 모듈 로드 → sysctl 순서로 진행하세요.
7. PV 저장소 디렉토리 준비
마지막으로, 나중에 쿠버네티스가 영속 볼륨(PV)을 저장할 디렉토리를 미리 만들어둡니다. 1편에서 /data를 별도 디스크로 분리했으니, 그 안에 저장소 경로를 잡습니다.
sudo mkdir -p /data/k3s-storage
sudo chmod 700 /data/k3s-storage
sudo chown root:root /data/k3s-storage
이 경로는 04편에서 local-path-provisioner의 기본 저장 위치로 지정할 예정입니다. 지금은 자리만 만들어두는 것입니다.
8. 작업 요약 스크립트
위 작업(2~7번)을 한 번에 적용할 수 있도록 묶으면 다음과 같습니다. 각 노드에서 호스트명만 바꿔가며 실행하면 됩니다.
#!/bin/bash
# K3s 노드 공통 사전 준비 (4대 모두 실행)
# 패키지
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget vim net-tools nfs-common chrony
# 시간 동기화
sudo timedatectl set-timezone Asia/Seoul
sudo systemctl enable --now chrony
# swap off
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab
# 커널 모듈
sudo modprobe overlay
sudo modprobe br_netfilter
echo -e "overlaynbr_netfilter" | sudo tee /etc/modules-load.d/k8s.conf
# 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 --system
# PV 저장소
sudo mkdir -p /data/k3s-storage
sudo chmod 700 /data/k3s-storage
sudo chown root:root /data/k3s-storage
echo "=== 사전 준비 완료 ==="
호스트명 설정(
hostnamectl)과/etc/hosts등록은 노드마다 값이 다르므로 스크립트에서 뺐습니다. 그 부분만 수동으로, 나머지는 이 스크립트로 처리하면 편합니다.
9. 검증 체크리스트
4대 모두 작업이 끝났으면, 다음을 확인해 빠진 게 없는지 점검합니다.
# 1. 시간 동기화
timedatectl status | grep synchronized
# → System clock synchronized: yes
# 2. swap 꺼짐
free -h | grep Swap
# → 모두 0
# 3. 커널 모듈 로드됨
lsmod | grep -E "overlay|br_netfilter"
# → 두 모듈 모두 보여야 함
# 4. sysctl 적용됨
sysctl net.ipv4.ip_forward net.bridge.bridge-nf-call-iptables
# → 둘 다 = 1
# 5. 노드 간 이름 통신
ping -c 1 dzpik8swapp1
# → 응답 오면 정상
이 다섯 가지가 4대 모두에서 통과하면 OS 준비는 끝입니다.
마치며
2편에서는 쿠버네티스가 올라설 OS 토대를 다졌습니다. 핵심을 정리하면:
- 시간 동기화(chrony): 인증서 검증이 깨지지 않도록 — 가장 자주 간과되지만 중요합니다.
- swap off: kubelet이 메모리를 정확히 관리하도록.
- 커널 모듈(overlay·br_netfilter): 컨테이너 파일시스템과 Pod 네트워킹의 토대.
- sysctl: 브리지 트래픽이 iptables를 타고, 패킷 포워딩이 되도록.
- PV 디렉토리: 나중에 쓸 저장소 자리를 미리 마련.
이 모든 게 “설치 전이라 눈에 안 보이지만, 안 하면 반드시 탈이 나는” 작업들입니다. 토대가 단단해졌으니, 다음 편에서는 드디어 K3s를 설치합니다. 03편에서 마스터를 부트스트랩하고 워커 3대를 조인시킨 뒤, 노드에 역할 라벨까지 붙여 클러스터의 뼈대를 완성하겠습니다.
이전 글: 중소기업 쿠버네티스 구축 – 01. 클러스터 아키텍처 설계: 4-노드 VM 구성
다음 글: 중소기업 쿠버네티스 구축 – 03. K3s 부트스트랩: 마스터와 워커 조인 (traefik·servicelb 비활성화·노드 라벨링)