[k8s] 쿠버네티스 클러스터 구성


클러스터를 구성하는 분들에게 도움이되었으면 하는 마음으로 모든 과정을 빠짐없이 적으려고 노력하였습니다.

쿠버네티스 설치

데비안 기반 배포판으로 설치할 예정입니다.

1) apt 패키지 색인을 업데이트하고, 쿠버네티스 apt 리포지터리를 사용하는 데 필요한 패키지를 설치합니다.

1
2
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates cur
1
2
3
4
5
6
7
8
9
10
11
ysbaek@master:~$ sudo apt-get install -y apt-transport-https ca-certificates curl
...
...
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
ca-certificates is already the newest version (20230311ubuntu0.22.04.1).
ca-certificates set to manually installed.
The following NEW packages will be installed:
  apt-transport-https curl
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.


2) 구글 클라우드의 공개 사이닝 키를 다운로드 합니다.

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


3) 쿠버네티스 apt 리포지터리를 추가합니다.

1
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
1
2
3
4
5
6
7
ysbaek@master:~$ sudo apt-get update
Hit:2 http://security.ubuntu.com/ubuntu jammy-security InRelease
Get:1 https://packages.cloud.google.com/apt kubernetes-xenial InRelease [8,993 B]
Err:1 https://packages.cloud.google.com/apt kubernetes-xenial InRelease
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY B53DC80D13EDEF05
...
...


4) 그런데 apt 리포지터리를 업데이트하는 도중에 에러가 발생했습니다. 다음 과정을 통해 해결하였습니다.

1
2
3
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | gpg --dearmor | sudo dd status=none of=/usr/share/keyrings/kubernetes-archive-keyring.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 update
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
The following additional packages will be installed:
  conntrack cri-tools ebtables kubernetes-cni socat
The following NEW packages will be installed:
  conntrack cri-tools ebtables kubeadm kubectl kubelet kubernetes-cni socat
0 upgraded, 8 newly installed, 0 to remove and 0 not upgraded.
Need to get 85.8 MB of archives.
After this operation, 329 MB of additional disk space will be used.
Get:2 http://kr.archive.ubuntu.com/ubuntu jammy/main amd64 conntrack amd64 1:1.4.6-2build2 [33.5 kB]
Get:1 https://packages.cloud.google.com/apt kubernetes-xenial/main amd64 cri-tools amd64 1.26.0-00 [18.9 MB]
Get:7 http://kr.archive.ubuntu.com/ubuntu jammy/main amd64 ebtables amd64 2.0.11-4build2 [84.9 kB]
Get:8 http://kr.archive.ubuntu.com/ubuntu jammy/main amd64 socat amd64 1.7.4.1-3ubuntu4 [349 kB]
Get:3 https://packages.cloud.google.com/apt kubernetes-xenial/main amd64 kubernetes-cni amd64 1.2.0-00 [27.6 MB]
Get:4 https://packages.cloud.google.com/apt kubernetes-xenial/main amd64 kubelet amd64 1.27.3-00 [18.7 MB]
Get:5 https://packages.cloud.google.com/apt kubernetes-xenial/main amd64 kubectl amd64 1.27.3-00 [10.2 MB]
Get:6 https://packages.cloud.google.com/apt kubernetes-xenial/main amd64 kubeadm amd64 1.27.3-00 [9,918 kB]


5) kubelet, kubeadm, kubectl을 설치하고 해당 버전을 고정합니다.

1
2
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl


컨테이너 런타임 설치

containerd를 CRI 런타임으로 사용하기 위해 설치하도록 하겠습니다.

위 페이지의 3가지 옵션 중 Option 1: From the official binaries을 사용하여 containerd를 설치하도록 하겠습니다.

1) Containerd 다운로드 및 압축 해제를 진행합니다.

1
wget https://github.com/containerd/containerd/releases/download/v1.7.2/containerd-1.7.2-linux-amd64.tar.gz
1
tar Cxzvf /usr/local https://github.com/containerd/containerd/releases/download/v1.7.2/containerd-1.7.2-linux-amd64.tar.gz


2) sysetmd에서 containerd 서비스 실행을 위한 service 정의 파일 다운로드 및 경로를 이동하여 줍니다.

1
2
wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
sudo mv ./containerd.service /usr/local/lib/systemd/system/containerd.service


3) containerd가 정상적으로 구동중인 것 확인을 확인합니다.

1
2
systemctl daemon-reload
systemctl enable --now containerd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
● containerd.service - containerd container runtime
     Loaded: loaded (/lib/systemd/system/containerd.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-06-19 00:20:33 KST; 57s ago
       Docs: https://containerd.io
    Process: 13105 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
   Main PID: 13107 (containerd)
      Tasks: 12
     Memory: 54.5M
        CPU: 138ms
     CGroup: /system.slice/containerd.service
             └─13107 /usr/local/bin/containerd

 6월 19 00:20:33 master containerd[13107]: time="2023-06-19T00:20:33.174528396+09:00" level=info msg=serving... address=/run/containerd/contai>
 6월 19 00:20:33 master containerd[13107]: time="2023-06-19T00:20:33.174564674+09:00" level=info msg="Start subscribing containerd event"
 6월 19 00:20:33 master containerd[13107]: time="2023-06-19T00:20:33.175367554+09:00" level=info msg="Start recovering state"
 6월 19 00:20:33 master containerd[13107]: time="2023-06-19T00:20:33.174583919+09:00" level=info msg=serving... address=/run/containerd/contai>
 6월 19 00:20:33 master containerd[13107]: time="2023-06-19T00:20:33.175456119+09:00" level=info msg="Start event monitor"
 6월 19 00:20:33 master containerd[13107]: time="2023-06-19T00:20:33.175510550+09:00" level=info msg="Start snapshots syncer"
 6월 19 00:20:33 master containerd[13107]: time="2023-06-19T00:20:33.175526439+09:00" level=info msg="Start cni network conf syncer for defaul>
 6월 19 00:20:33 master containerd[13107]: time="2023-06-19T00:20:33.175546837+09:00" level=info msg="Start streaming server"
 6월 19 00:20:33 master systemd[1]: Started containerd container runtime.
 6월 19 00:20:33 master containerd[13107]: time="2023-06-19T00:20:33.176135681+09:00" level=info msg="containerd successfully booted in 0.0571>


4) runc 설치

1
2
wget https://github.com/opencontainers/runc/releases/download/v1.1.7/runc.amd64
install -m 755 runc.amd64 /usr/local/sbin/runc


5) CNI plugins 설치

1
2
3
wget https://github.com/containernetworking/plugins/releases/download/v1.3.0/cni-plugins-linux-amd64-v1.3.0.tgz
mkdir -p /opt/cni/bin
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz


6) IPv4를 포워딩하여, iptables가 bridge된 traffic 볼 수 있게 설정.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 필요한 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

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


kubadm을 사용한 클러스터 구성.

Calico를 사용하여 쿠버네티스 클러스터를 구성해보도록 하겠습니다.

1) swapoff 설정을 해주고, 영구적으로 적용하기 위해 /etc/fstab 파일 열어서 아래 라인 주석 처리합니다.

1
sudo swapoff -a 
1
2
3
4
sudo vim /etc/fstab
...
...
#/swapfile                                 none            swap    sw              0       0


2) Cluster 환경 CPU 개수 (생략 가능)

저는 VBoxManager를 사용하여 가상 환경으로 노드를 구성하였는데요, 깜빡하고 cpu 개수를 1개로 지정해놓아서 아래와 같은 에러가 발생하였습니다. 해결하는 방법은 cpu 개수를 2개 이상으로 재할당 해주면 됩니다.

1
[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2               

먼저 host 환경의 cpu 개수를 확인해줍시다.

1
2
(base) ysbaek@ysbaek:~$ lscpu | grep '^CPU(s):'
CPU(s): 32

가상환경을 종료하고 아래 명령어로 적절하게 할당해 줍니다. (저의 가상환경 이름은 master 입니다.)

1
VBoxManage modifyvm master --cpus {cpu count}


3) kubadm을 사용하여 init 명령어를 수행해줍니다. 참고로 저의 local master node 주소는 192.168.0.100이므로 각자의 환경에 맞게 입력해주도록 합니다.

1
sudo kubeadm init --pod-network-cidr=192.168.0.100/16

4) 이후 설치가 완료 되면 root 권한 없이 실행을 하기 위해 아래 명령어를 입력합니다.

1
2
3
4
rm -rf $HOME/.kube
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

5) worker-1 node의 join을 위해 kubeadm init 후 출력된 아래와 같은 명령어를 따로 복사해둡니다.

1
kubeadm join 192.168.0.100:6443 --token {token} --discovery-token-ca-cert-hash sha256:{key}


Calico로 Master Node 구성. (Only Master)

만약 master node를 설치한 ip가 192.168.0.0이 아니라면 custom-resources.yaml 파일을 로컬로 다운로드 후 yaml 파일에 정의된 ip를 변경해주어야만 합니다

저는 이미 구성된 시스템 환경이 있어서 IP를 192.168.0.100으로 설정하였습니다.

1
2
3
4
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/custom-resources.yaml
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
kubectl taint nodes --all node-role.kubernetes.io/master-


worker node 구성하기

worker node를 구성하려면 worker node 환경에 쿠버네티스 설치, 컨테이너 런타임 설치를 동일하게 진행합니다. (Calico는 설치하지 않습니다)

이후 아까 복사해둔 kubeadm init 명령어의 결과로 출력된 “kubeadm join 192.168.0.100:6443 –token {token} –discovery-token-ca-cert-hash sha256:{key}”을 사용하여 worker node를 생성하여 master node에 연결 시킵니다.

구성 완료

자 이렇게 구성이 완료 되었습니다. 개인적이으로는 replicaset 생성 및 삭제하여 가비지 컬렉션이 제대로 동작하는지 확인하는 것이 설치가 제대로 됐는지 확인하는 가장 좋은 방법 같습니다.

image

image

Updated:

Leave a comment