홈 서버 클러스터링
June 2023 (776 Words, 5 Minutes)
방향성
홈서버 클러스터링하기
구매한 홈서버에 mac을 이용해 kubespray로 단일노드 클러스터 구축을 위한 문서이다.
설치진행 : mac
클러스터 설치대상 : 따로 마련한 리눅스 서버 (우분투 22.04 설치)
프로비저닝은 맥에서 진행하기때문에 kube-spray를 진행하기위헤 맥(호스트 서버)에 필요한 선수 패키지들 설치하는 과정이다.
호스트 선수과정
프로비저닝을 진행하는 ansible 호스트 (맥)에서 진행해야하는 선수과정이다.
-
sshpass 설치하기
cd ~ curl -O -L https://fossies.org/linux/privat/sshpass-1.09.tar.gz && tar xvzf sshpass-1.09.tar.gz cd sshpass-1.09 ./configure sudo make install sshpass
kube-spray는 ansible 기반으로 쿠버네티스를 설치하기위한 솔루션이다.
ansible은 ssh 기반으로 실행이 되기때문에, sshpass 패키지를 이용해 맥 → 쿠버네티스 노드의 ssh 작업 수행시 자격증명을 해준다.
-
Python 설치하기 기본적으로 설치되어있기때문에, python3 —version 등으로 확인을 한번 진행해준다
-
PIP 설치하기
pip3 -v
업데이트하기
pip3 install —upgrade pip
pip 설치하기
sudo easy_install pip
-
Ansible 설치하기
brew search ansible
brew install ansible
맥에서는 homebrew를 통한 패키지 설치가 참 편하다.
물론 최신버젼 패키지가 업데이트 안되는경우도 있지만, 기본적인 패키지들은 설치가 모두 가능하고
맥에선 CLI 명령어들을 더 좋아하지만, CLI 명령어로 GUI 환경의 패키지들을 설치하는건 매력적인거같다.
만약에 맥환경이 아닌, 다른 리눅스에서 쿠버네티스 설치를 진행하고자한다면 해당 패키지를 설치한다.
sudo apt install ansible python3-argcomplete -y
설치 쿠버네티스 노드 선수작업
이제 호스트에서 준비해야할것은 모두 완료가 되었고,
설치될 노드에서 필요한 선수작업들을 진행한다.
노드를 여러대 사용할경우, 여러대의 노드에서 해당 선수작업들을 모두 진행해야한다.
노드에서 사전준비
sudo su
apt update
apt install sshpass
apt install python3-pip -y
root login 허용하기
sudo vi /etc/ssh/sshd_config
PermitRootLogin yes
코드 추가
service ssh restart
ssh 데몬 재실행해 변경한 sshd_config가 반영되도록 한다.
ansible에 대해 몇차례 설명했지만, host에서 ansible을 사용하기위해 필요한 패키지들이 설치되어있다면, 노드에서는 ssh정보와 python, pip만 설치되어있으면 모든 ansilbe 모듈들(playbook)을 실행 할 수 있다.
kube-spray 설치
다시 ansible 호스트(맥) 환경에서 설치를 진행한다.
ssh-pass로 키 추가
ssh-copy-id mont@192.168.219.107
ssh-copy-id root@192.168.219.107
노드에 호스트의 ssh key를 copy하기위한 ssh-pass가 설치되어있어 키 등록을 해준다.
플레이북을 실행함에있어, 복잡한 kube-spray 설치과정에서 여러가지 권한문제가 발생할수있기때문에, 기본 사용자 및 root 계정은 권한을 모두 등록해준다.
이제 kubespray 설치를 진행한다.
git clone https://github.com/kubernetes-sigs/kubespray.git
cd kubespray
sudo pip install -r requirements.txt
해당 환경에서 requirements.txt에서 제공하는 패키지들을 설치할 수 없다면, requirements-2.11.txt 등 다른버젼의 패키지 설치를 진행한다.
이제 설치할 클러스터의 정보를 입력해 설치를 준비한다.
cp -rfp inventory/sample inventory/mycluster
declare -a IPS=(192.168.219.105)
CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py ${IPS[@]}
sample 폴더를 복사해 mycluster 폴더를 생성하고
declare 부분에 내가 추가할 노드의 정보들을 IP를 입력한다.
여러개의 노드를 등록할 예정이라면 105, 106 이런식으로 넣으면 된다.
CONFIG_FILE에 선언했던 IP 정보들이 등록되며, 이제 설치할 host.yaml 파일을 수정해보도록 한다
all:
hosts:
node1:
ansible_host: 192.168.219.105
ip: 192.168.219.105
access_ip: 192.168.219.105
children:
kube_control_plane:
hosts:
node1:
kube_node:
hosts:
node1:
etcd:
hosts:
node1:
k8s_cluster:
children:
kube_control_plane:
kube_node:
calico_rr:
hosts: {}
all.hosts: 에는 노드를 설치할 노드의 hostname과 일치시켜주는것이 권장되며
node1 밑에 여러대의 노드정보들을 동일하게 추가하면 된다.
all.children.kube_control_plane 항목에는 컨트롤플레인 노드로 사용할 host
all.children.kube_node 항목에는 워커 노드로 사용할 host 를 등록해준다.
물론 한대만 사용할경우 control_plane 이자 kube_node 를 같이 등록해 마스터이자 워커노드로 설치를 진행 할 수 있다.
하지만 가능하다면 control_plane과 노드를 구분해야한다.
이렇게될경우, control_plane은 사양이 비교적 낮은 서버들이 쿠버네티스에서 일어날 전반적인 관리를 진행하며, 간섭받지않는 환경에 있는것이 권장되기때문이다.
control_plane 댓수는 홀수대로 구성하는것이 좋다.
노드가 홀수개일때 분할 상황에서 quorum(과반수)를 유지하는데 도움이되기때문에 마스터로서 의사결정을하는데 유리하기때문이다.
control_plane 못지않게 ETCD설정도 중요한데, ETCD의경우 분산데이터 스토어로 쿠버네티스 클러스 데이터를 저장하며, 분산합 알고리즘인 Raft를 이용한다. 이 알고리즘은 네트워크 분할이나 노드가 실패했을때 클러스터의 상태를 유지하기위해 quorum(과반수) 노드가 항상 살아있어야한다.
둘다 의사결정을 함에있어, 정상적이지 않은 노드가 발생했을때, 정상적인 의사결정권을 갖기위해선 아키텍쳐를 잘 구성해야한다.
하지만 해당환경에서는 한대로 설정을 진행한다…
이제 호스트 설정이 끝났으면 설치명령어를 통해 쿠버네티스 “진짜” 설치를 진행한다.
ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root -K cluster.yml
명령어를 수행하면 쿠버네티스를 설치할 노드에 명령어들을 수행하며 약 15~30분정도 걸린다.
노드가 여러대여도 시간은 크게차이안나는거같은데, 성능이 부족하지않다고 생각했는데도 적지않은 시간이 걸리는거같다.
EKS 클러스터링도 초기 구축에는 비슷한 시간이 걸린다고 했던거같다.
클라우드에서 KOPS 등으로 구성을하거나
온프렘에서 RKE 같은 솔루션을 사용한다면 구성을 조금 더 가볍게 가져갈수있겠지만, kube-spray가 개인적으로 느끼기엔 안정적인 솔루션이라고 느껴졌다.
만약에 정말 가벼운환경에서 사용할것이라면 K3S등으로 구성하는것도 권장된다.
홈서버 한대로도 쿠버네티스를 이용한다면 수많은 작업을 진행할수있다.
공부하는데도 유용하게 쓸거라 생각해 구입했는데, 성장에 많은 도움이 되는것 같다
이상으로 홈서버 클러스터 구축기 1편을 마친다.
Check out the Jekyll docs for more info on how to get the most out of Jekyll. File all bugs/feature requests at Jekyll’s GitHub repo. If you have questions, you can ask them on Jekyll Talk.