본문 바로가기
Backend MLOps/On-premise setting

[k8s] 라즈베리파이 클러스터링 -2

by SteadyForDeep 2023. 8. 28.
반응형

2023.08.27 - [Backend MLOps/On-premise setting] - [클러스터링] 라즈베리파이 클러스터링 -1

 

[클러스터링] 라즈베리파이 클러스터링 -1

라즈베리파이를 4대 사왔다. 연결해서 클러스터링을 연습 해보려고 한다. 필요한 준비물은 아래와 같다. 1. 라즈베리파이 2대 이상 2. microSD card 같은 수량 3. microSD card 리더기 4. hdmi to mini hdmi 케이

davi06000.tistory.com

 

* 주의 : 이 글은 시행착오를 담고 있으므로 필요한 부분만 참고하기 바람

지난 글에서 라즈베리파이 os설치까지 완료 했다.

 

이런식으로 하나의 라우터에 모든 노드를 연결해서 통신이 가능하도록 만들었다.

 

그려면 먼저 역시나 모니터링 시스템을 구축하고 간단한 연산으로 실험을 해 보자.

 

 

라즈베리파이에 무엇인가 설치할때는 가장 신경써야하는 부분이 바로 아키텍쳐다.

라즈베리파이 SoC는 amd 가 아니라 arm 아키텍쳐를 사용하기 때문에 이 부분을 주의해 준다.

 

라즈베리파이를 마스터 노드로 쓰고싶을 수 있으니 마스터노드로 쓰는 방법을 일단 먼저 알아본다.

 

우선 도커를 깔아서 런타임을 함께 설치한다. 아래와 같이 설치해 준다. 

# Package manager update
sudo apt-get update
sudo apt-get upgrade -y


# Docker install
curl -sSL https://get.docker.com | sh

# Docker without `sudo`
sudo usermod -aG docker pi

# Start Docker
sudo systemctl enable docker
sudo systemctl start docker

# Check
docker --version

 

설치가 끝나면 k8s를 설치해 준다.

아래의 글 참고

2023.08.24 - [Backend MLOps/On-premise setting] - [k8s] kubeadm 을 이용해서 싱글노드 쿠버네티스 환경 구축 - 4

 

[k8s] kubeadm 을 이용해서 싱글노드 쿠버네티스 환경 구축 - 4

이 글은 아래의 글들에 의존성을 가진다. 2023.08.17 - [Backend MLOps/On-premise setting] - [k8s] kubeadm 을 이용해서 싱글노드 쿠버네티스 환경 구축 - 1 [k8s] kubeadm 을 이용해서 싱글노드 쿠버네티스 환경 구축

davi06000.tistory.com

sudo apt-get update && sudo apt-get install -y apt-transport-https curl

# Add k8s repository
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list

# install k8s
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl

# start kubelet
sudo systemctl enable kubelet
sudo systemctl start kubelet

 

이제 kubeadm을 init 하면 되는데 여기서 자잘한 문제가 발생한다.

 

[WARNING SystemVerification]: missing optional cgroups: hugetlb
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR CRI]: container runtime is not running: output: E0827 16:32:42.606964    8920 remote_runtime.go:616] "Status from runtime service failed" err="rpc error: code = Unavailable desc = connection closed before server preface received"
time="2023-08-27T16:32:42+01:00" level=fatal msg="getting status of runtime: rpc error: code = Unavailable desc = connection closed before server preface received"
, error: exit status 1
        [ERROR SystemVerification]: missing required cgroups: memory
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

우선은 Cgroup 문제들이 쭉 발생하는데

Cgroup 은 Control Group의 약자로 하나 이상의 프로세스들을 그룹으로 묶은 뒤 관리, 통제하는 리눅스 커널 기능이다.

지금은 memory 그룹이 필수적인데 설정되어 있지 않으므로 설정을 해 줘야 한다.

라즈베리파이는 기본을 이 그룹이 없는 상태로 부팅하도록 설정되어 있다.

따라서 부팅 파일을 수정하고 재부팅해주는 작업을 거치자.

 

# sudo vi /boot/cmdline.txt 로 설정파일 열고 아래 내용을 맨 앞 부분에 추가

cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1


# 이 명령으로 확인
cat /proc/cgroups | grep memory

그 다음은 도커 런타임을 썼을 경우 발생하는 문제인데 이 문제는 꼭 굳이 도커 런타임을 사용해야만 하는 경우를 빼면

/run/containerd/containerd.sock 소켓에 연결하는 것으로 해결이 가능하다.

최대한 가볍게 가기 위해서 기타 다른 도구들을 설치하지 않는 방향으로 가보자.

 

# sudo vi /etc/containerd/config.toml

# disabled_plugins = ["cri"] # 여기를 주석처리하고 이하 추가
[plugins.cri]
  enable = true

 

마지막으로 스왑까지 꺼주면 된다.

sudo swapoff -a

 

아래를 이용해서 쿠버네티스를 시작하자.

sudo kubeadm init \
--apiserver-advertise-address=<ip address> \
--pod-network-cidr=192.168.0.0/16 \
--cri-socket=/run/containerd/containerd.sock

 

이러면 마스터노드로 사용하는 방법 끝이다.

 

워커노드로 쓰는 방법은

kubeadm join 192.168.0.10:6443 \
--token <토큰> \
--discovery-token-ca-cert-hash <인증서 해시 sha256: ... > \
--apiserver-advertise-address=<ip address> \
--cri-socket=/run/containerd/containerd.sock

끝이다.

 

그리고 이전 글에서 설명했든 calico cni 를 마스터 노드에 깔아줬고 이제 통신을 이어가야하는데

calico-node 파드에서 아래와 같은 에러가 발견되었다.

 

 Init:0/3 상태에서 머물러 있는 경우
 
 Failed to create pod sandbox: open /run/systemd/resolve/resolv.conf: no such file or directory

이 경우  아래의 명령어를 워커노드에 입력해서 상태를 확인한다.

 

systemctl status systemd-resolved

# 만약 활성화되어 있지 않다면
sudo systemctl start systemd-resolved

이는 dns 설정으로 활성화 하지 않으면 dns를 이용할 수 없다.

 

이건 이제 이렇게 두고 워커노드에서 kubectl을 사용하는 경우

마스터 노드의 ~/.kube/config 파일과 동일한 파일이 워커노드의 ~/.kube/config  에도 존재해야한다.

 

 

 

반응형

댓글