IT/Kubernetes

[Kubernetes] Ubuntu에 Kubernetes 싱글노드로 구축하기.

고슴도치 엔지니어 2022. 2. 22. 09:33

회사에서 쿠버네티스를 다루다보니 집에서 테스트 환경을 만들어서 이것 저것 테스트해보고 싶은 생각이 들었습니다.

 

개인적으로 쓰고있는 서버는 1대인데 이걸 물리적으로 3대를 놓는건 현실적으로 불가능하고,

 

클라우드로 구축하자니 매달 비용이 발생하니 이것도 만만치 않습니다.

 

그렇다고 우분투에 KVM을 사용하여 가상환경으로 구축하자니 안그래도 리소스가 넉넉치 않은 개인서버에 

하이퍼바이저라는 부담을 안겨주는거 같아 꺼려졌는데,

 

방법을 찾아보다 보니 싱글 노드로 쿠버네티스를 구축하는 방법이 있어서 이를 공유하고자 합니다.

 

전체적으로 kubeadm으로 일반적인 쿠버네티스 클러스터를 구성하는 방법과 다른 점은 없습니다.

 

다만 worker node를 join 하는 과정이 생략되고, control plane에 taint를 해제해서 Pod가 돌아갈 수 있게 해주면

 

Single Node 구축이 완료됩니다.

 

1. 환경

- 2 cpu, 12GB mem 랩탑

- Ubuntu 20.04 LTS

- 컨테이너 런타임 : Containerd 

- kubernetes 1.23

 

2. 사전 구성요소 설치 및 구성

$ cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

$ sudo modprobe overlay
$ sudo modprobe br_netfilter

# 필요한 sysctl 파라미터를 설정하면 재부팅 후에도 서비스가 유지 됩니다.
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


# 재부팅 하지 않고 파라미터 적용하기
$ sudo sysctl --system

 

3. Container Runtime 설치 (Containerd)

Docker를 사용하지 않고 Containerd를 사용 하였습니다.

Containerd가 Docker에 비해 가볍고, 결정적으로 k8s 1.22 버전 부터 Docker는 Deprecate 되었기 때문입니다.

$ sudo apt-get updata

$ sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lab-release


$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

$ echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  

$ sudo apt-get update
$ sudo apte-get install containerd.io

$ sudo mkdir -p /etc/containerd
$ containerd config default | sudo tee /etc/containerd/config.toml

$ sudo systemctl restart containerd

 

 

4. systemd croup driver 사용 설정

$ sudo vi /etc/containerd/config.toml

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
 	# 아래 구문을 추가 해 준다.
    SystemdCgroup = true
    
    
$ sudo systemctl restart containerd

 

 

5. kubernetes 설치 (kubeadm 활용)

# br_netfilter 모듈 로드

$ sudo modprobe br_netfilter

$ 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
EOF

$ sudo sysctl --system
# swap 메모리 삭제 및 비활성화 (kubernetes는 swap 메모리를 사용하지 않는다.)

$ sudo swapoff -a
$ sudo rm /swap.img

$ sudo vi /etc/fstab
/swap.img       none    swap    sw      0       0  
#라인 삭제
# kubeadm, kubelet, kubectl 설치

참조 : https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/


$ sudo apt-get update
$ sudo apt-get install -y apt-transport-https ca-certificates curl

$ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

$ echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

$ sudo apt-get update
$ sudo apt-get install -y kubelet kubeadm kubectl
$ sudo apt-mark hold kubelet kubeadm kubectl
# Controll Plane(Master Node 초기화)

$ su root
$ kubeadm init --apiserver-advertise-address=10.1.0.10  --pod-network-cidr=192.168.0.0/16
# pod network는 Calico를 사용 할 것 이기 때문에 192.168.0.0 을 적용.

# root 에서 kubectl 명령어 실행 권한 주기.
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config


$ su username
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 유저 상태에서도 명령어 실행 권한 부여.

$ kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
-Container Interface Network Calico를 설치 (권장)

get nodes 해보면 노드 한개가 잘 인식되는 것 확인.

6. Control Plane (Master Node) Taint 값 수정.

# 싱글노드 구성으로 Pod가 실행 될 수 있도록 수정.
$ kubectl taint nodes --all node-role.kubernetes.io/master-

 

 

이것으로 k8s 싱글노드 구성이 완료 되었다.