ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 라즈베리파이를 이용한 멀티 노드 클러스터링 (1) - 설치
    인프라/Docker & Kubernetes 2021. 7. 23. 23:38

     

    바쁘다는 핑계로 잠시 멈췄던 포스팅을 이어가보자.

     

    우연히 NHN Forward 2020에서 라즈베리파이를 이용한 클러스터링 세션을 보게되었다. 진짜 혹했다.

    지갑 얇은 대학생 입장에서는 라즈베리파이로 시작해보는 것도 좋을 것 같아서 무작정 시작했다.

    https://forward.nhn.com/session/31

     

    NHN FORWARD

    NHN FORWARD는 온라인으로 진행되며, 누구나 자유롭게 참여할 수 있습니다.

    forward.nhn.com

     

    그런데...

     

    미개봉 라즈베리파이 4B 4G 모델 3개

    쿨링 케이스, 충전기, micro SD 카드 각각 3개

    기타 등등

     

    이것만 마련하는데도 20만원이 넘었다. ㅜ

     

    이 프로젝트는 2021년 7월 현재 진행 중이며 앞으로의 삽질을 계속 적어나갈 생각이다.

    결과적으로는 무중단 배포 서비스를 경험해보면서 실제 서비스를 운영하는 경험을 쌓고자한다.

     

     

     

     

    간단하게 조립되고 동작할 줄 알았던 내 라베파에 문제가 생겼다. 랜선이 문제인지 제대로 네트워크 연결이 되질 않는 것 ㅠ 결국 랜선을 새로 샀다.

     

    하여튼 간단하게 어떻게 라베파를 구동시켰는지부터!

     

    https://ubuntu.com/download/raspberry-pi

    https://www.balena.io/etcher/

     

    balena - The complete IoT fleet management platform

    Infrastructure and tools to develop, deploy, and manage connected devices at scale. Your first ten devices are always free.

    www.balena.io

     

    일단 라베파에 사용할 우분투 20.04와 부팅 파티션을 만들기 위한 balenaEtcher을 다운로드하였다.

    microSD 카드를 연결하고 여기에 부팅 이미지를 입히자.

     

    부팅 디스크로 만들어진 microSD 카드의 부팅 디렉토리를 열어보면 윈도우 기준 system-boot (리눅스 경로 /boot)로 인식된다.

     

    ubuntu20.04 부팅 디스크

     

    위 이미지에서 보면 cmdline.txt와 ssh 라는 파일을 확인할 수 있다.

    ssh 파일은 빈 파일로 확장자 없이 ssh라는 이름으로 지정해주면 된다.

    나는 텍스트 파일을 만들어서 확장자만 없앴다.

     

    cmdline.txt 파일은 아래에서 두개의 옵션을 추가해주었다. 

    cgroup_memory=1 cgroup_enable=memory 라는 옵션인데 쿠버네티스를 이용할 때 필요한 옵션이라 한다.

    나머진 기본값을 지정되어 있으니 위 두개의 옵션만 추가해주자.

    cgroup에 대해 간단하게 설명하면 리눅스에서 쓰는 (프로세스 단위?) 시스템 자원에 대한 관리, 제한을 위한 관리 그룹이다. 자세한 내용은 따로 포스팅할 컨테이너 보안에서 확인하자..

    net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=LABEL=writable rootfstype=ext4 elevator=deadline rootwait fixrtc cgroup_memory=1 cgroup_enable=memory

     

    위와 같이 부팅 옵션을 설정해주고 라베파에 연결하여 부팅하였다. ssh를 바로 이용할 수 있으니 공유기에서 접속한 ip만 확인해서 바로 ssh로 붙어보자.

    ssh ubuntu@192.168.0.11

     

    라베파 우분투의 기본 계정/패스워드는 ubuntu/ubuntu이다.

    이 계정으로 접속하면 먼저 패스워드를 변경하라 한다. 시키는대로 변경하자.

     

    추가적으로 나는 호스트 명을 바꿔주었다. 3개의 라즈베리파이 중 1개는 마스터노드, 2개는 워커 노드로 사용할 것이기에 이를 쉽게 구분하고자 한다.

    ubuntu@worker1:~$ hostnamectl set-hostname workerblue
    ==== AUTHENTICATING FOR org.freedesktop.hostname1.set-static-hostname ===
    Authentication is required to set the statically configured local host name, as well as the pretty host name.
    Authenticating as: Ubuntu (ubuntu)
    Password:
    ==== AUTHENTICATION COMPLETE ===
    ubuntu@worker1:~$ sudo reboot
    
    재부팅 후
    ubuntu@workerblue:~$

     

    워커들은 worker+색, 마스터는 그냥 master로 정했다. 워커에 붙은 색의 기준은 그냥 라베파 케이스에 붙인 스티커 색으로 했다.

     

    추가적으로 우분투를 사용하면서 필요한 패키지들을 설치했다.

    sudo apt-get update
    sudo apt-get upgrade -y
    
    sudo apt-get install net-tools gcc gpp gdb build-essential -y

     

    간단한 설정과 설치를 마치고 바로 쿠버네티스를 설치하기로 했다. 정확히는 k3s를 이용했다.

    여러 종류의 쿠버네티스 변종(?)들이 있었지만 가볍게 활용하기 좋다는 검색 결과를 따르기로 했다.

    문제 있다면 나중가서 바꾸는걸로..

    curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC=" --no-deploy traefik --no-deploy kubernetes-dashboard"  sh -

     

    여러 블로그와 문서들을 참고하면서 기본적인 설치를 진행했다. 2021년 7월 23일 기준으로 k3s 1.21버전이 설치된다.

    사실 이 단계에서 생각보다 오래 멈춰있었다. 설치조차 힘든 나

     

    무슨 문제였냐면... 설치해도 k3s가 동작하지 않는 문제였다. 그런데 1.21버전이 아닌 1.18버전으로 설치하니 k3s가 동작하는걸 확인했다.

    나랑 비슷한 오류를 가진 많은 사람들이 있었지만, 나는 오류를 해결하기보단 그냥 무시하는 방법을 택했다.

    간단하게, 그냥 우분투를 밀고 다시 올렸다. 그러니 동작하더라.

     

    이에 대해 살짝 고민해본 결과, 원인을 추측하자면 쿠버네티스 1.21 버전부터 도커의 컨테이너 런타임을 지원하지 않는다는 내용을 본 기억에 따라 도커를 설치했던게 원인이라고 생각했다.

    요약하면 도커와 쿠버네티스의 버전에 따른 호환성 문제. (지극히 개인적인 추측)

    새로 올리니까 됬다.. 이 문제가 아니었던걸로

     

    다행히 도커 없이 k3s만 설치하니 구동이 잘 되었다.

    위와 같은 명령어로 설치하고 구동을 확인해보자.

    ubuntu@master:~$ sudo systemctl status k3s
    ● k3s.service - Lightweight Kubernetes
         Loaded: loaded (/etc/systemd/system/k3s.service; enabled; vendor preset: enabled)
         Active: active (running) since Fri 2021-07-23 13:30:52 UTC; 13s ago
           Docs: https://k3s.io
        Process: 47336 ExecStartPre=/bin/sh -xc ! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup>    Process: 47338 ExecStartPre=/sbin/modprobe br_netfilter (code=exited, status=0/SUCCESS)
        Process: 47339 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS)
       Main PID: 47345 (k3s-server)
          Tasks: 46
         Memory: 626.9M
         CGroup: /system.slice/k3s.service
                 ├─47345 /usr/local/bin/k3s server
                 └─47400 containerd

     

    이번엔 진짜 동작했다..!

     

    다음 작업은 워커 노드에 연결을 해주는 전초 작업이다.

    마스터 노드에서 아래와 같이 토큰 값을 확인해주고 이를 저장해두자. 그리고 워커 노드로 접속하여 k3s-agent를 설치해주면 된다.

    마스터 노드에서
    sudo cat /var/lib/rancher/k3s/server/node-token
    
    워커노드에서
    curl -sfL http://get.k3s.io | K3S_URL=https://마스터노드ip:6443 K3S_TOKEN="마스터노드_토큰" sh -

     

    워커 노드에서 확인하면 k3s-agent가 동작하는 것을 확인할 수 있다.

    ubuntu@workerblue:~$ sudo systemctl status k3s-agent
    ● k3s-agent.service - Lightweight Kubernetes
         Loaded: loaded (/etc/systemd/system/k3s-agent.service; enabled; vendor preset: enabled)
         Active: active (running) since Fri 2021-07-23 14:09:41 UTC; 26min ago
           Docs: https://k3s.io
       Main PID: 1711 (k3s-agent)
          Tasks: 29
         Memory: 210.3M
         CGroup: /system.slice/k3s-agent.service
                 ├─1711 /usr/local/bin/k3s agent
                 └─1842 containerd

     

    다만, 워커노드에서는 인증서 관련 문제가 발생했다. 나는 아직 네트워크 관련 설정이 불완전한 상태기도 하고

    이러한 문제들을 해결하면서 계속 공부할 것이다.

    ---

    2021.08.06 구성

    2021.08.15 작성

     

    기존 테스트 클러스터가 환경 구조 상 외부 접속이 안되는 환경이라 로컬 접속만 가능했다.

    그래서.. 외부 접속이 되도록 환경을 옮기고 포트도 열어줬다.

     

    K3S를 설치할때 도커를 미리 설치하고 --docker 옵션으로 도커를 컨테이너 런타임으로 사용할 수도 있고 해당 옵션을 지우면 Containerd가 기본으로 선택된다.

    SSH로 외부 접속

     

     

    현재 공유기에 개인 서버, 마스터 노드 1개, 워커 노드 2개 총 4개가 물려있다.

    클러스터에 대해 좀 더 공부하면서 규모를 늘려보고싶다. 

     

    댓글

Designed by Tistory.