k8s 클러스터 구축을 위해 VM을 세 대를 준비한다.
VM1을 복제하여 VM2, VM3를 생성하도록 하자.
우선 VM1에는 기본적으로 ssh와 ip 설정만 되어있다.
network:
ethernets:
enp0s3:
dhcp4: no
addresses:
- 10.0.2.4/24
gateway4: 10.0.2.2
nameservers:
addresses:
- 8.8.8.8
- 1.1.1.1
version: 2
sudo apt install openssh-server -y
sudo systemctl enable ssh
sudo systemctl start ssh
sudo systemctl status ssh



ubuntu@server01:~$ sudo -i
root@server01:~#
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
결과
overlay
br_netfilter
root@server01:~# sudo modprobe overlay
root@server01:~# sudo modprobe br_netfilter
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
결과
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
sudo sysctl --system
결과
root@server01:~# sudo sysctl --system
* Applying /usr/lib/sysctl.d/10-apparmor.conf ...
* Applying /etc/sysctl.d/10-console-messages.conf ...
* Applying /etc/sysctl.d/10-ipv6-privacy.conf ...
* Applying /etc/sysctl.d/10-kernel-hardening.conf ...
* Applying /etc/sysctl.d/10-magic-sysrq.conf ...
* Applying /etc/sysctl.d/10-map-count.conf ...
* Applying /etc/sysctl.d/10-network-security.conf ...
* Applying /etc/sysctl.d/10-ptrace.conf ...
* Applying /etc/sysctl.d/10-zeropage.conf ...
* Applying /usr/lib/sysctl.d/50-pid-max.conf ...
* Applying /usr/lib/sysctl.d/99-protect-links.conf ...
* Applying /etc/sysctl.d/99-sysctl.conf ...
* Applying /etc/sysctl.d/k8s.conf ...
* Applying /etc/sysctl.conf ...
kernel.apparmor_restrict_unprivileged_userns = 1
kernel.printk = 4 4 1 7
net.ipv6.conf.all.use_tempaddr = 2
net.ipv6.conf.default.use_tempaddr = 2
kernel.kptr_restrict = 1
kernel.sysrq = 176
vm.max_map_count = 1048576
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.all.rp_filter = 2
kernel.yama.ptrace_scope = 1
vm.mmap_min_addr = 65536
kernel.pid_max = 4194304
fs.protected_fifos = 1
fs.protected_hardlinks = 1
fs.protected_regular = 2
fs.protected_symlinks = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
위의 모든 설정을 VM 세 대에 모두 해준 뒤 exit으로 root에서 나온다.
세 vm에 모두 설치해준다.
# 필수 패키지 설치
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
# Docker GPG 키 추가
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# Docker 저장소 추가
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
# 패키지 정보 갱신 및 containerd 설치
sudo apt update
sudo apt install -y containerd.io
설치 확인
sudo systemctl status containerd
containerd를 k8s에서 컨테이너 런타임으로 사용할 수 있도록 설정 변경
**sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null**
**sudo vi /etc/containerd/config.toml**
여기서 SystemdCgroup을 false → true로 바꿔준다.

출력 결과
**sudo cat /etc/containerd/config.toml | grep SystemdCgroup
SystemdCgroup = true**
재실행
sudo systemctl restart containerd
sudo systemctl enable containerd
sudo systemctl status containerd
k8s는 수많은 컨테이너를 동시에 관리하기 때문에 원활한 컨테이너 관리를 위해 swap 메모리 영역을 비활성화해야 한다.
sudo free -h

이미 0이면 비활성화 안해도 됨.
swap 메모리 비활성화 하는 과정
sudo -i
swapoff --all
free -h
cat /proc/swaps
확인한 뒤 시스템 재부팅
root@server01:~# shutdown -r now
모든 VM에 k8s를 설치하고 하나의 클러스터로 연결
**# 필요한 패키지 설치
- ubuntu 24.04
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates
# 새로운 Kubernetes 공식 GPG 키 다운로드
- ubuntu 24.04에선
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/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.29/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list**
kubelet, kubeadm, kubectl 설치 안되는 문제 발생.
원인을 보니 GPG 키가 만료되었다고 한다.
1.27 버전이 너무 구 버전인가해서 1.27 → 1.29로 교체. 위의 명령어에서도 1.29 버전으로 교체해놨다.
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
Hit:1 https://download.docker.com/linux/ubuntu noble InRelease
Hit:3 http://kr.archive.ubuntu.com/ubuntu noble InRelease
Hit:4 http://security.ubuntu.com/ubuntu noble-security InRelease
Hit:5 http://kr.archive.ubuntu.com/ubuntu noble-updates InRelease
Hit:6 http://kr.archive.ubuntu.com/ubuntu noble-backports InRelease
Err:2 https://prod-cdn.packages.k8s.io/repositories/isv:/kubernetes:/core:/stable/deb InRelease
403 Forbidden [IP: 13.225.134.125 443]
Reading package lists... Done
E: Failed to fetch https://pkgs.k8s.io/core:/stable/deb/InRelease 403 Forbidden [IP: 13.225.134.125 443]
E: The repository 'https://pkgs.k8s.io/core:/stable/deb InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package kubelet
E: Unable to locate package kubeadm
E: Unable to locate package kubectl
E: Unable to locate package kubelet
E: Unable to locate package kubeadm
E: Unable to locate package kubectl
E: No packages found
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
버전 확인
sudo -i
kubelet --version
kubeadm version
kubectl version --client
실행 결과
Kubernetes v1.29.15
kubeadm version: &version.Info{Major:"1", Minor:"29", GitVersion:"v1.29.15", GitCommit:"0d0f172cdf9fd42d6feee3467374b58d3e168df0", GitTreeState:"clean", BuildDate:"2025-03-11T17:46:36Z", GoVersion:"go1.23.6", Compiler:"gc", Platform:"linux/amd64"}
Client Version: v1.29.15
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3