여는 말
안녕하세요. 어제 과도한 부하를 받아 라즈베리파이로 만든 클러스터가 고장 났습니다.
1년 동안 잘 동작하다가 알 수 없는 이유로 노드들이 응답하지 않았습니다.
이 기회에 라즈베리파이를 초기화하고 쿠버네티스를 재설치하려 합니다. 저는 간편하게 설정할 수 있는 MicroK8s를 이용해 쿠버네티스를 설치하겠습니다. 목차는 다음과 같습니다:
1.
클러스터 소개
2.
쿠버네티스 설치
3.
쿠버네티스 사용 준비
4.
쿠버네티스 사용 예제
5.
후기: 왜 클러스터가 터졌을까..?
1. 클러스터 소개
저는 개인 프로젝트로 온프레미스 라즈베리파이 클러스터를 만들고 있습니다. 쿠버네티스는 프로덕션의 안정성을 보장하고, 라즈베리파이를 공식지원 하는 MicroK8s를 선택하였습니다.
제가 구성한 클러스터 노드들은 5B 2대, 4B 2대로 총 4대입니다:
•
40번 파이: Raspberry Pi 4B (8GB, 리더 노드)
•
41번 파이: Raspberry Pi 4B (8GB)
•
50번 파이: Raspberry Pi 5B (8GB)
•
51번 파이: Raspberry Pi 5B (8GB)
이번 설정은 40번 파이를 리더 노드로 설정하고 가능하면 부담을 주지 않게 설정하여, 클러스터를 잘 관리하는 것이 포인트입니다.
2. 쿠버네티스 설치
2.1. 라즈베리파이 초기화
필요한 파이는 라즈베리파이 4세대 이상 RAM 4GB 이상의 모델입니다. 같은 네트워크에 연결된 라즈베리파이들을 준비합니다. 1대만 있어도 괜찮습니다.
운영체제는 라즈비안 64비트 최신판으로 설치하시면 됩니다. 설치과정에서 쿠버네티스를 위한 cgroup 설정을 확인해주세요. 자세한 내용은 ‘Lv 100: 라즈베리파이 OS 설치하기’에 소개했습니다.
이 글에서 사용하는 라즈베리파이는 4대 입니다. 저의 홈 네트워크에서 파이들은 다음과 같은 IP를 가집니다:
NAME IP
raspi-40 10.0.4.40 # 이 파이가 리더 노드 입니다!
raspi-41 10.0.4.41
raspi-50 10.0.4.50
raspi-51 10.0.4.51
Bash
복사
이 노드들에 SSH 접속할 수 있게, SSH 공개키를 주입합니다.
•
리눅스 명령어
ssh-copy-id -i $HOME/.ssh/id_rsa.pub r4iny@10.0.4.40
ssh-copy-id -i $HOME/.ssh/id_rsa.pub r4iny@10.0.4.41
ssh-copy-id -i $HOME/.ssh/id_rsa.pub r4iny@10.0.4.50
ssh-copy-id -i $HOME/.ssh/id_rsa.pub r4iny@10.0.4.51
Bash
복사
•
윈도우 명령어
type $env:USERPROFILE\.ssh\id_rsa.pub | ssh r4iny@10.0.4.40 "cat >> .ssh/authorized_keys"
type $env:USERPROFILE\.ssh\id_rsa.pub | ssh r4iny@10.0.4.41 "cat >> .ssh/authorized_keys"
type $env:USERPROFILE\.ssh\id_rsa.pub | ssh r4iny@10.0.4.50 "cat >> .ssh/authorized_keys"
type $env:USERPROFILE\.ssh\id_rsa.pub | ssh r4iny@10.0.4.51 "cat >> .ssh/authorized_keys"
Bash
복사
SSH 공개키 연결이 끝났다면, 파이에 접속해 봅니다.
ssh r4iny@10.0.4.40
Bash
복사
2.2. MicroK8s로 쿠버네티스 설치
microk8s를 설치하기 위해 snap을 먼저 설치하고, 쿠버네티스 최신 1.31 버전을 설치합니다. 라즈베리파이에 접속하여 다음 명령어를 실행시켜주세요:
sudo apt update && sudo apt install -y snapd # snap 설치
sudo snap install microk8s --classic --channel=1.31 # microk8s v1.31 설치
sudo usermod -a -G microk8s $(whoami) # 그룹에 사용자 등록
mkdir -p ~/.kube # 쿠버네티스 인증키 폴더 생성
sudo chown -R $(whoami) ~/.kube # 쿠버네티스 인증키 권한 등록
newgrp microk8s
Bash
복사
파이가 여러 대 있다면 모든 파이에 microk8s를 설치합니다. 그리고 파이를 재부팅하거나 SSH 재접속합니다.
이제 설치가 잘 되었는지 확인해볼까요? microk8s의 클러스터 제어 명령어는 microk8s kubectl 입니다.
다음 명령어로 현재 노드를 확인합니다:
microk8s kubectl get node
Bash
복사
현재 파이의 이름이 잘 나온다면 정상입니다. 다른 파이도 잘 되는지 확인해보세요.
클러스터의 리소스도 확인합니다:
microk8s kubectl get all -A
Bash
복사
위 명령어가 잘 동작한다면 설치가 끝났습니다 .
이 과정은 여러 개의 파이에 각각 쿠버네티스를 설치한 과정입니다. ‘N개의 싱글노드 클러스터’ 라고 할 수 있어요. 다음 섹션에서 여러 파이들을 하나로 합쳐서 ‘N개의 노드를 가지는 멀티노드 클러스터’를 만드는 법을 소개드릴게요.
2.3. MicroK8s로 멀티노드 클러스터 만들기
여러 개의 microk8s 클러스터가 있을 때, add-node와 join으로 클러스터를 합쳐보겠습니다.
ssh r4iny@10.0.4.40
Bash
복사
먼저 리더 노드에 접속합니다. 저는 40번 파이를 리더로 사용할 예정입니다. 그리고 다음 명령어로 노드를 추가하기 위한 명령어를 생성합니다.
microk8s add-node # 노드를 추가할 때 마다 입력해야 합니다.
Bash
복사
위 화면에 나온 join 명령어를 복사합니다. --worker 플래그를 포함한다면, 이 명령어로 초대한 노드는 워커로만 동작합니다.
microk8s join 10.0.4.40:25000/8ee08dda5972c3339a59a9df9a88a9d2/594547541f80 --worker # 예시
Bash
복사
이제 워커로 초대할 노드에 접속합니다. 먼저 41번 파이를 초대합니다. 위 명령어를 그대로 입력합니다. 시간은 2~10분 정도 소요됩니다.
이제 리더 노드에서 노드 목록을 보겠습니다.
microk8s kubectl get node
Bash
복사
2대의 노드가 같은 클러스터에 있는걸 확인할 수 있습니다. 이제 나머지 노드 (50, 51) 들도 add-node 후 join 합니다. 모든 노드를 추가한 뒤 노드 목록을 확인합니다:
microk8s kubectl get node
Bash
복사
2.4. MicroK8s 에드온 설정
MicroK8s에 노드 설정을 끝냈다면 이제 에드온을 설치할 차례입니다. 다음 명령어로 클러스터와 에드온 상태를 확인합니다.
microk8s status
Bash
복사
여기서 네트워크에 관련된 앱을 MicroK8s의 권장 설정으로 설치하겠습니다. 다음 명령어를 리더 노드에서만 실행합니다.
# metrics-server, metallb, ingress 설치
microk8s enable metrics-server
microk8s enable metallb:10.64.140.43-10.64.140.49
microk8s enable ingress
Bash
복사
설치가 끝나면 파드 목록을 확인합니다.
microk8s kubectl get pod -A
Bash
복사
ingress, matallb-system 네임스페이스가 생겼고, kube-system 네임스페이스에도 metrics-server 파드도 생겼습니다.
ingress, metallb 등이 필요하지 않거나 다른 방식으로 설치하신다면, 이 과정은 생략하셔도 됩니다.
이제 MicroK8s를 이용한 설정은 모두 마쳤습니다. 다음 순서에서 본격적으로 클러스터를 사용할 준비를 하겠습니다.
3. 쿠버네티스 사용 준비
내 컴퓨터에서 클러스터를 제어하기 위해서는 admin 권한의 kubeconfig가 필요합니다.
3.1. kubeconfig 추출하기
다음 명령어로 로컬에서 리더 노드의 kubeconfig를 추출하여 로컬로 저장합니다.
ssh r4iny@10.0.4.40 "/snap/bin/microk8s config" > ~/.kube/microk8s.kubeconfig
Bash
복사
백업은 필수입니다. 바로 ~/.kube/config 에 덮어쓰면 기존 컨텍스트들을 잃을 수 있습니다!
다음 명령어로 기존 kubeconfig를 백업하고 새로운 kubeconfig를 설정합니다.
cp ~/.kube/config ~/.kube/config.backup
cp ~/.kube/microk8s.kubeconfig ~/.kube/config
Bash
복사
krew konfig를 사용하시는 분은 다음 명령어로 간단하게 import 할 수 있습니다
kubectl konfig import --save ~/.kube/microk8s.kubeconfig
Bash
복사
혹은 리더 노드에 접속하여 microk8s config 명령어를 입력하여 결과를 복사하여 저장해도 됩니다.
3.2. kubeconfig 컨텍스트 확인
MicroK8s의 기본 컨텍스트는 다음과 같습니다.
- context:
cluster: microk8s-cluster
user: admin
name: microk8s
Bash
복사
이미 사용하고 있는 kubeconfig와 충돌할 가능성이 있다면, 위 기본 이름들을 수정해야 합니다. 여기까지 이상이 없다면 kubeconfig 설정도 완료되었습니다.
kubeconfig 설정은 kubectx 혹은 kubectl 명령어로 확인할 수 있습니다:
kubectl config set-context microk8s # microk8s로 컨텍스트를 전환합니다.
kubectl get node # 쿠버네티스 노드 목록을 확인합니다.
Bash
복사
이제 로컬 환경이므로 microk8s를 쓰지 않습니다
4. 쿠버네티스 사용 예제
4.1. 리소스 목록 확인
다음 명령어로 쿠버네티스 리소스를 확인합니다.
kubectl get all -A # 모든 네임스페이스의 모든 리소스를 조회합니다.
Bash
복사
4.2. 파드 실행
다음 명령어로 나만의 파드를 실행할 수 있습니다.
kubectl create ns my-namespace # 실습 네임스페이스 생성
kubectl run -n my-namespace my-pod --image alpine --restart=Never -- echo 'Hello MicroK8s!' # alpine 이미지로 파드 생성
kubectl get -n my-namespace pod my-pod -o wide # 생성된 파드 상태 확인
kubectl logs -n my-namespace my-pod # 로그 확인 ('Hello MicroK8s' 출력 결과 확인)
Bash
복사
파드가 생성과 그 결과를 확인할 수 있습니다.
이제 클러스터를 완성했습니다. 여기까지 따라와주신 분들 모두 고생하셨습니다. 감사합니다.
후기: 왜 클러스터가 터졌을까..?
다음 포스팅
여기까지 라즈베리 파이 + MicroK8s을 이용해 쿠버네티스를 생성하는 과정을 소개했습니다.
그 동안 클러스터에 스토리지 문제가 발생하였습니다. 그 때마다 이슈 대응을 위해 longhorn 앱을 디버깅 했었습니다.
•
이슈
◦
파드에서 스토리지 클래스로 볼륨을 요청할 때 PV를 생성하지 못 하거나, 생성된 PV가 PVC와 Bound로 결합하지 못 했습니다.
◦
볼륨이 가득 찼을 때, 공간 확보를 위한 GC가 동작하지 못했습니다.
•
해결
◦
PVC에서 요청하는 공간 크기를 작게 조절하였습니다.
◦
PV, PVC를 직접 정리하고 스토리지 클래스가 PV, PVC를 다시 만들고 Bound 될 때까지 반복했습니다.
◦
위 방법이 유효하지 않아서 서비스나 노드가 다운되면 클러스터를 다시 만들었습니다.
그렇게 클러스터를 여러 번 만들고 초기화 하는 과정에서…
•
경량 블록스토리지인 longhorn 1.5 버전에 버그가 있음을 알게 되었습니다.
◦
longhorn에서 csi 볼륨을 관리하는 중에 볼륨 연결을 놓치게 되고 timeout 오류가 발생하여 노드 전체가 응답하지않는 경우가 반복적으로 나타났습니다.
◦
이 부분에 대한 버그 리포트가 있었고, 조사 끝에 최신의 1.7 버전을 이용해 버그를 해결할 수 있다는 가능성을 보았습니다.
그래서 다음 포스팅은, 위 오류를 해결하기 위한 홈 클러스터의 어플리케이션 구성에 대해서 다뤄볼 예정입니다.
프로젝트
라즈베리 파이는 작지만 안정성이 뛰어난 미니 컴퓨터입니다. 저는 이 컴퓨터들을 묶어서 쿠버네티스 기반의 홈 클러스터를 만들고 있어요.
녹투아 PWM 쿨링팬을 구매하고 찍은 사진
라즈베리 파이 5를 처음 구매하고 찍은 사진
클러스터 케이스를 첫 구매하고 찍은 사진
클러스터 케이스와 엑티브 쿨러를 설치하여 라이브서비스까지 운영하는 미니 프로젝트를 하고 있습니다.
이 클러스터를 개발/운영하면서 소개할 만한 내용 및 인사이트를 소개하고 싶습니다.
읽어주셔서 감사합니다.