본문 바로가기

쿠버네티스

라즈베리파이4 에 싱글노드(1대) 쿠버네티스 설치 하기

라즈베리파이4(Raspberrypi 4) 에 쿠버네티스(Kubernetes) 를 설치하는 방법 입니다.

의외로 라즈베리파이(Raspberrypi)+쿠버네티스(Kubernetes) 조합이 한글로는 검색도 잘 안되고 정보가 아직 많이 없는 듯 합니다.

 

그래서 준비했습니다.

 

우선 방법은 글 맨 하단에 참고로 한 해외 사이트를 기반으로 제작 하였고, 그 외 설치하면서 경험한 점과 편리한 점 등을 좀 더 녹여 한글로 게시하는 점 참고 해주시면 되겠습니다.

 

저는 일단 라즈베리파이4 (8GB 모델) 을 사용하였고 아직까지 라즈베리파이4 에는 Raspbian OS 64bit 버전이 정식 출시되지 않았기 때문에 Raspbian OS 32bit 버전을 설치하고 그 위에 쿠버네티스를 설치 하였습니다.

 

그럼 시작하기에 앞서 전제조건(Prerequisite) 이 있습니다.

 

 

설치 전 해야할 전제 조건들

1. sudo swapoff -a (스왑은 쿠버네티스에서 사용할 수 없으므로 반드시 꺼야 설치가 가능합니다)

2. systemctl disable dphys-swapfile.service (스왑 서비스를 영구적으로 끔. 재부팅해도 꺼져있도록)

3. vi /etc/hosts (hosts 파일에서 반드시 내 호스트명이 해당 파일에 적힌 호스트명 이름과 일치하는지 확인)

 

위 사항을 다 확인 하였다면 이제 설치를 시작합니다.

인터넷은 당연히 연결 되어있어야 자유로이 다운을 받을 수 있겠죠?

 

 

1. docker 설치 및 초기 필요 설정 잡아주기

 

sudo apt install -y docker.io

위 명령어로 docker 를 설치하고 나서 아래 명령어로 확인을 해준다.

 

sudo docker info


# Check `docker info`
# Some output omitted
$ sudo docker info
(...)
 Cgroup Driver: cgroups
(...)
WARNING: No memory limit support
WARNING: No swap limit support
WARNING: No kernel memory limit support
WARNING: No kernel memory TCP limit support
WARNING: No oom kill disable support

위와 같이 나오는게 정상.

 

그럼 이제 설정을 하나씩 잡아봅시다.

 

 

2. cgroup driver 를 enable 하기 위한 daemon.json 파일 설정

 

sudo cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

위 박스 그대로 긁어 붙이시면 됩니다.

 

 

3. cgroup limit 관련 설정

 

sudo sed -i '$ s/$/ cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1 swapaccount=1/' /boot/cmdline.txt

복잡합니다. 그냥 죽죽 긁어 붙이시면 됩니다.

(라즈베리파이 기기에 따라 cmdline.txt 파일 위치가 /boot/firmware/cmdline.txt 인 경우도 있고 위와 같이 /boot/cmdline.txt 인 경우도 있으니 확인하시고 그에 맞는 경로로 적어주시면 됩니다)

 

 

4. iptables 설정

 

쿠버네티스를 설치하기 위해선 iptables bridge 설정이 필요합니다.

 

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

위 명령어로 적용을 해 줍니다.

 

 

5. 쿠버네티스 (Kubernetes) 설치

 

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

위 명령어로 apt에 해당 패키지를 받기위한 키 추가.

 

cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF

위 명령어로 쿠버네티스 repo 추가.

 

sudo apt update && sudo apt install -y kubelet kubeadm kubectl

apt 업데이트를 한 후 kubelet, kubeadm, kubectl 을 설치.

 

이렇게 까지 하면 설치가 완료 됩니다.

 

그리고,

 

sudo apt-mark hold kubelet kubeadm kubectl

위 명령어로 업데이트를 disable 시킴.

 

kubelet set on hold.
kubeadm set on hold.
kubectl set on hold.

 

이렇게 나오면 된 겁니다.

 

 

6. 쿠버네티스 클러스터 (Kubernetes Cluster) 구성

 

이제 클러스터 구성을 해야 합니다.

우린 1대로 싱글노드 구성을 할거긴 하지만 그래도 1대도 클러스터 구성은 되어있어야 하기에..

 

TOKEN=$(sudo kubeadm token generate)
echo $TOKEN

위 명령어를 한줄씩 각각 수행해 줍니다.

echo $TOKEN 을 수행하면 토큰 값이 나올 텐데 이 값은 만일을 대비하여 잘 적어 둡니다.

 

 

이제 Control Plane 을 initialize 할 차례 입니다.

 

sudo kubeadm init --token=${TOKEN} --kubernetes-version=v1.19.2 --pod-network-cidr=10.244.0.0/16

위 명령어를 수행하면 initialize 가 시작되는데, 여기서 주의할 점은 기왕이면 pod network cidr 부분의 대역은 안바꾸시는게 좋습니다. 다른 대역으로 바꾸고자 하시는 분들도 많을텐데, 바꾸게 되면 클러스터 구성 후에 configmap 등 다른 부분에 10.244.0.0/16 으로 구성이 남아있는 곳이 몇 군데 있어서 설치가 된 후에 수동으로 찾아 바꿔주셔야 합니다.

다 찾아 수정하기란 여간 힘든일이 아닙니다.. (경험담)

 

대역만 바꾸고 수동으로 남은 찌꺼기들을 다 바꾸진 않아도 일단 구성은 될 것이겠지만 나중에 모든 설정들을 변경한 대역으로 맞춰주기 전까진 파드간 네트워크 통신이 안되거나 하는 문제가 생기므로 되도록 디폴트 대역으로 가는 것을 추천합니다.

 

그리고 버전은 저의 경우 1.19.2 버전으로 선택하였는데, 시대의 흐름에 따라.. 나중에 보시는 분들은 버전을 올리셔도 됩니다. (하지만 버전을 올리면 그에 따른 새로운 기능 때문에 새로운 오류 또는 요건이 생길 수도 있습니다)

 

그럼 주저리주저리는 여기까지로 하고.. 이어가보겠습니다.

 

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.0.x:6443 --token xxxxx.xxxxxxxxxxxxxxx \
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

initialize 가 끝나면 위와 같이 나오면 성공 입니다. (맨 아래 토큰 값들은 x처리했습니다)

 

만약 위와 같이 나오지 않는다면 위 설정이 잘못 되었거나 pod network cidr 옵션을 안 줘서 그럴 수 있습니다.

 

마지막으로, 

 

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

위 명령어들을 한줄 씩 입력해 줍니다.

config를 현재 홈 위치에 복사하여 kubectl 명령어를 수행 할 수 있도록 해주는 과정 입니다.

 

최종적으로 데몬 reload를 해 줍니다.

systemctl daemon-reload

 

 

이제 클러스터 구성까지 완성 되었습니다.

 

kubectl get nodes

위 명령어를 수행해보면 노드와 status 가 나올 텐데 아직은 NotReady 일 겁니다.

 

그 이유는 클러스터 구성은 다 했지만 아직 네트워크 플러그인 설치가 안되었기 때문 입니다.

 

이제 바로 네트워크 플러그인을 설치 해 보겠습니다.

 

 

7. 네트워크 플러그인(flannel) 설치

 

네트워크 플러그인에는 flannel, calico 등 여러가지 플러그인이 있습니다.

하지만 이것도 경험상 라즈베리파이에서 calico 는 원인 미상의 이유로 설치는 되나 파드가 정상적으로 뜨질 않더군요. (제가 분석을 제대로 못해서 그런 것일 수도 있으므로 calico 로 도전해 보셔도 됩니다)

 

그래서 찾던 중 flannel 이 가장 간단하면서 많이 쓰인다는 것을 보고 라즈베리파이에는 적합할 거라고 생각했습니다.

 

이번 포스트에서는 flannel 설치로 설명 드리겠습니다.

 

curl -sSL https://raw.githubusercontent.com/coreos/flannel/v0.12.0/Documentation/kube-flannel.yml | kubectl apply -f

위 명령어는 flannel yml 을 다운 받고 설치까지 하는 명령어 입니다.

(만약 위에 control plane initialize 하실 때 pod network cidr 대역을 10.244.0.0/16 이 아닌 다른 대역으로 하신 분들은 이곳 flannel yml 에도 해당 대역으로 수정하시고 apply 해 주셔야 합니다)

 

사실 위 명령어만 수행해주면 flannel 설치가 바로 끝납니다.

 

root@raspberrypi4:~# kubectl get node
NAME    STATUS   ROLES    AGE   VERSION
rp4     Ready    master   9d    v1.19.2

위와 같이 Ready 상태가 되면 이제 쿠버네티스 클러스터 구성 및 네트워크 까지 설치가 완료 된 겁니다.

 

root@raspberrypi4:~# kubectl get pod -A
NAMESPACE              NAME                                                  READY   STATUS      RESTARTS   AGE
kube-system            coredns-f9fd979d6-gthxq                               1/1     Running     5          9d
kube-system            coredns-f9fd979d6-rmvv9                               1/1     Running     5          9d
kube-system            etcd-rp4                                              1/1     Running     49         9d
kube-system            kube-apiserver-rp4                                    1/1     Running     51         9d
kube-system            kube-controller-manager-rp4                           1/1     Running     19         9d
kube-system            kube-flannel-ds-arm-z8qq4                             1/1     Running     7          9d
kube-system            kube-proxy-cqpfd                                      1/1     Running     37         98d
kube-system            kube-scheduler-rp4                                    1/1     Running     209        9d

 

위 명령어로 해당 클러스터에 떠있는 모든 파드를 조회해보고 Running 상태가 되어있다면 완벽!

 

 

이제 kubectl 명령어로 원하는 작업을 하시면 됩니다.

 

끝.

 

 

 

참조

https://opensource.com/article/20/6/kubernetes-raspberry-pi

 

Build a Kubernetes cluster with the Raspberry Pi

Kubernetes is an enterprise-grade container-orchestration system designed from the start to be cloud-native. It has grown to be the de-facto cloud container platform, continuing to expand as it has embraced new technologies, including container-native virt

opensource.com