k8s 클러스터 구축(1)

박정호·2025년 5월 23일

기본 VM 설정

k8s 클러스터 구축을 위해 VM을 세 대를 준비한다.

VM1을 복제하여 VM2, VM3를 생성하도록 하자.

  • VM1
    • ip - 10.0.2.4
    • hostname: server01
  • VM2
    • ip - 10.0.2.5
    • hostname: server02
  • VM3
    • ip - 10.0.2.6
    • hostname: server03

우선 VM1에는 기본적으로 ssh와 ip 설정만 되어있다.

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

ssh

sudo apt install openssh-server -y

sudo systemctl enable ssh
sudo systemctl start ssh
sudo systemctl status ssh

복제 한 뒤 VM2, VM3을 각각 ip, hostname 변경해주고 ping과 ssh 접속 되는지 확인

네트워크 설정

IPv4 포워딩으로 iptables가 연결된 트래픽을 볼 수 있게 설정

ubuntu@server01:~$ sudo -i

root@server01:~#
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
  • sudo -i로 root 권한을 얻는다
  • tee 명령어를 활용하여 화면에 출력됨과 동시에 파일에 저장
  • overlay는 리눅스 커널의 네트워크 드라이버이다. 서로 다른 호스트에 존재하는 파드 간의 네트워크 연결을 가능하게 하는 기술.
  • overlay를 활용하여 여러 개의 독립적인 네트워크 레이어를 겹쳐서 하나의 연결된 네트워크로 볼 수 있게 설정.
  • br_netfilter는 네트워크 패킷 처리 관련 모듈로써 iptables/netfilter 규칙이 적용되게 한다. 컨테이너와 호스트 간의 인터페이스 등에서 발생하는 트래픽에 대해 규칙을 적용해 트래픽을 관리.
  • EOF 문서의 마지막을 의미

결과

overlay
br_netfilter
root@server01:~# sudo modprobe overlay
root@server01:~# sudo modprobe br_netfilter
  • modprobe는 리눅스 커널 모듈 관리 도구이다. 이를 이용하면 특정 모듈을 로드하거나 제거할 수 있다.
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 매개변수를 설정하면, 재부팅 후에도 값이 유지된다.
  • 브릿지 네트워크 인터페이스에 대한 ipv4 트래픽이 iptables 규칙에 의해 처리되도록 만들어준다.
  • ipv6에 대해 iptables를 처리한다.

결과

net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1

재부팅하지 않고 sysctl 매개변수 적용

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에서 나온다.

containerd 설치

세 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 설정

containerd를 k8s에서 컨테이너 런타임으로 사용할 수 있도록 설정 변경

**sudo mkdir -p /etc/containerd

sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null**
  • 설정값을 저장할 디렉터리 생성
  • containerd config default를 통해 출력된 기본 설정값들을 tee 명령어를 통해 config.toml 파일로 저장
**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

swap 메모리 비활성화

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**
  • k8s 설치에 필요한 서명 키를 다운하여 /etc/apt/keyrings 디렉터리에 저장
  • k8s 패키지 저장소를 apt 패키지 관리자에 추가

문제 발생

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

kubelet, kubeadm, kubectl 설치

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

0개의 댓글