k8s vm 환경 구성
1. ubuntu 방화벽 해제 / swap memory off
- process는 작업을 하기 위해 메모리를 할당받는데, 메모리가 부족할 경우 대부분의 process는 swap 메모리로 들어가게 된다.
해당 process인 pod의 container가 swap 메모리에 들어가게 되면 application의 성능이 떨어지고, 지연현상이 발생하게 되어 결과적으로 작업속도가 느려져 교체 대상이 될 수 있기 때문에 kubernetes의 swap 메모리는 항상 off 상태로 유지하는 것을 권장한다.$ sudo apt -y update # k8s 사전 구성을 위한 ubuntu 방화벽 해제 설정 $ sudo ufw disable Firewall stopped and disabled on system startup $ sudo ufw status Status: inactive # Pod가 SWAP을사용하지 않도록 하여 성능 유지를 위해 SWAP 해제 $ sudo swapoff-a $ free total used free shared buff/cache available Mem: 4017752 1124056 137528 8236 2756168 2647400 Swap: 0 0 0 student@k8s-master:~$ sudo sed -i '/ swap / s/^/#/' /etc/fstab
2. ntp (Network Time Protocol) 설정
- k8s cluster는 보통 여러 개의 VM이나 서버로 구성되기 때문에, 클러스터 내의 모든 Node 들은 NTP를 통해서 시간 동기화가 요구된다.
$ sudo apt -y install ntp $ sudo systemctl restart ntp $ sudo systemctl status ntp $ sudo ntpq -p # 네트워크 패킷을 올바르게 포워딩하기 위해 커널에서 IP 포워딩을 활성화 시켜야 함. $ sudo-i # 또는, sudo su # echo '1' > /proc/sys/net/ipv4/ip_forward # cat /proc/sys/net/ipv4/ip_forward 1
- [미설정 시 error 발생]
[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
3. contianerd 를 이용한 container runtime 구성
$ sudo cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
> overlay
> br_netfilter
> EOF
# modprobe 프로그램은 요청된 모듈이 동작할 수 있도록 부수적인 모듈을 depmod 프로그램을 이용하여
검색해 필요한 모듈을 커널에 차례로 등록
$ sudo modprobe overlay
$ sudo modprobe br_netfilter
4. 노드간 통신을 위한 iptables 에 브릿지 관련 설정 추가
$ sudo cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
$ sudo sysctl --system
5. k8s runtime 준비
- contianerd, docker, CRI-O 중에 선택이고, 여기서는 contianerd 사용
# apt가 HTTPS로 리포지터리를 사용하는 것을 허용하기 위한 패키지 및 docker에 필요한 패키지 설치
$ sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common gnupg2
# 도커 공식 GPG 키 추가 (https://docs.docker.com/engine/install/ubuntu/)
$ sudo install -m 0755 -d /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
$ sudo chmod a+r /etc/apt/keyrings/docker.gpg
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${VERSION_CODENAME:-$UBUNTU_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update
6. docker runtime 주의
- Docker와 containerd가 모두 감지되면 Docker가 우선합니다.
Docker 18.09부터 containerd와 함께 제공되고 Docker만 설치한 경우에도 둘 다 감지할 수 있기 때문에 필요합니다. 다른 두 개 이상의 런타임이 감지되면 kubeadm은 오류와 함께 종료됩니다.
(docker는 image 개발 및 테스트 용도로 사용할 것이고, 주 container runtime은 "containerd"를 사용 한다.)
# docker-ce version 확인
$ apt-cache policy docker-ce
docker-ce:
Installed: (none)
Candidate: 5:28.0.1-1~ubuntu.22.04~jammy
Version table:
5:28.0.1-1~ubuntu.22.04~jammy 500
500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
# docker-ce와관련 도구및 containerd 설치
$ sudo apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
$ sudo docker version
…
Server: Docker Engine - Community
Engine:
Version: 28.0.1
API version: 1.48 (minimum version 1.24)
Go version: go1.23.6
Git commit: bbd0a17
Built: Wed Feb 26 10:41:08 2025
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.7.25
GitCommit: bcc810d6b9066471b0b6fa75f557a15a1cbf31bb
runc:
Version: 1.2.4
GitCommit: v1.2.4-0-g6c52b3f
docker-init:
Version: 0.19.0
GitCommit: de40ad0
…
7. Containerd 설정
- 이 부분이 잘 못 설정됐을 경우 kube-apiserver에 문제가 생기게 되니 주의해서 설정해야 한다.
# containerd 설정 $ sudo sh -c "containerd config default > /etc/containerd/config.toml" $ sudo vi /etc/containerd/config.toml disabled_plugins = [] # [] CRI 제거 확인 $ sudo sed -i 's/ SystemdCgroup = false/ SystemdCgroup = true/' /etc/containerd/config.toml $ sudo systemctl restart containerd.service
8. Docker daemon 설정
$ sudo vi /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
$ sudo mkdir -p /etc/systemd/system/docker.service.d
$ sudo usermod -aG docker student
$ sudo systemctl daemon-reload
$ sudo systemctl enable docker
$ sudo systemctl restart docker
$ sudo systemctl status docker
$ sudo systemctl restart containerd.service
$ sudo systemctl status containerd.service
$ sudo reboot
$ docker version
$ docker info
Cgroup Driver: systemd
9. Kubernetes 도구 설치 (1.28)
$ curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/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.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
$ sudo apt update
$ sudo apt-cache policy kubeadm
-
kubeadm:
Installed: (none)
Candidate: 1.28.15-1.1
Version table:
1.28.15-1.1 500
500 https://pkgs.k8s.io/core:/stable:/v1.28/deb Packages
1.28.14-2.1 500
500 https://pkgs.k8s.io/core:/stable:/v1.28/deb Packages
1.28.13-1.1 500
500 https://pkgs.k8s.io/core:/stable:/v1.28/deb Packages
1.28.12-1.1 500
500 https://pkgs.k8s.io/core:/stable:/v1.28/deb Packages
…
$ sudo apt -y install kubelet kubeadm kubectl
10. kubernetes 도구 버전 확인 (버전 1.28)
- kubelet : kubernetes의 노드간 통신을 담당(유일한 daemon)
- kubeadm : kubernetes admin 도구로 kubernetes init, upgrade, join 작업을 수행함.
- kubectl : kubernetes control 명령어
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"28",
GitVersion:"v1.28.15", GitCommit:"841856557ef0f6a399096c42635d114d6f2cf7f4", GitTreeState:"clean",
BuildDate:"2024-10-22T20:33:16Z", GoVersion:"go1.22.8", Compiler:"gc", Platform:"linux/amd64"}
$ kubectl version [-o yaml]
Client Version: v1.28.15
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
The connection to the server localhost:8080 was refused - did you specify the right host or port?
$ kubelet --version
Kubernetes v1.28.15
$ sudo apt-mark hold kubelet kubeadm kubectl
kubelet set on hold.
kubeadm set on hold.
kubectl set on hold.
# 모든 노드에 설치되는 kubelet은 항상 start 상태를 유지해야 한다.
$ sudo systemctl daemon-reload
$ sudo systemctl restart kubelet.service
$ sudo systemctl enable --now kubelet.service
# Master node의 모든 설정이 끝나면 worker node 복제를 위해 shutdown 한다.
$ sudo vi /etc/hosts
127.0.0.1 localhost
127.0.1.1 k8s-master
192.168.56.100 k8s-master
192.168.56.101 k8s-node1
192.168.56.102 k8s-node2
192.168.56.103 k8s-node3
$ sudo shutdown -h now
'Kubernetes' 카테고리의 다른 글
[kubernetes] 2-4. 3-node cluster를 위한 Kubernetes 초기화 (0) | 2025.03.18 |
---|---|
[kubernetes] 2-3. kubernetes cluster 구축 - worker node 복제 (0) | 2025.03.18 |
[kubernetes] kubeconfig ? (0) | 2025.02.24 |
[kubernetes] icmp destination unreachable (0) | 2025.02.23 |
[kubernetes] 2-1. kubernetes cluster 구축 (0) | 2025.02.23 |