Ancible, Vagrant, Kubespray를 활용해서 온프레미스 쿠버네티스 구축하기!

노하람·2022년 1월 20일
0
post-thumbnail
post-custom-banner

참고

  • 실제 머신에 Ansible Playbook을 적용하기 전에 가상 머신에서 충분히 실험해 볼 수 있다.
    앤서블에서는 원하는 머신의 상태를 서술한 파일을 플레이북 Playbook이라고 부른다. Vagrant를 이용해 간편하게 VM을 만들어 실험해 본 후에 적용하자.

  • 구축 워크플로우
    Vagrant를 이용해 가상 머신을 로컬 환경에서 만들고 앤서블 플레이북을을 만들어 낸 후에, 가상 머신 인스턴스를에 작성한 플레이북이 원하는대로 환경을 만들어냄

VirtualBox

버츄얼박스는 vagrant의 VM 프로바이더로써 필요합니다. 베이그런트는 가상화 소프트웨어인 버추얼박스로 호환성이 매우 좋으니 VMware, Hyper-V 등을 사용할 수도 있지만 버추얼박스로 진행합니다.

  • 버추얼박스 없이 vagrant up을 실행하면 오류나는 모습

설치

  • 공식 홈페이지
  • 각 환경에 맞는 것을 설치해줍니다. GUI를 사용하실 수 있다면 클릭하면 바로 설치가 시작되고, 아니면 wget 등을 이용해 링크를 받아가시면 됩니다.
    - 아래처럼 진행하셔도 되간하는데, 전 오류가 발생합니다. 그래서 그냥 GUI로 다운받았습니다!
    - wget https://download.virtualbox.org/virtualbox/6.1.32/virtualbox-6.1_6.1.32-149290~Ubuntu~bionic_amd64.deb
    - dpkg -i virtualbox-6.1_6.1.32-149290~Ubuntu~bionic_amd64.deb

Vagrant

설치

  1. 공식 홈페이지
  • ubuntu/debian
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install vagrant
  1. 확인
    • vagrant
  2. vagrant up 도중 게스트 에디션과 virtualbox 버전이 일치하지 않는 오류 해결: vagrant plugin install vagrant-vbguest --plugin-version 0.21

Kubespray 공식 가이드

git repo clone, vagrant up, ancible playbook

vagrant up을 진행하시면 ancible까지 모두 진행됩니다! 공식 깃허브에서 자동화를 구축해놓았으니 그대로 따라가봅시다.
여기선 컨트롤 플레인 2개와 워커 노드 1개를 구성했는데, 왜 굳이 워커 노드를 2개 두지 않고 컨트롤 플레인 2개를 두었는지는 모르겠습니다.
수정이 어렵진 않지만 기능 동작 확인을 위해서 그대로 진행하고, 나중에 고도화가 필요할 떄 진행해보도록 합시다.

  • git clone https://github.com/kubernetes-sigs/kubespray.git
  • cd kubespray
  • 설정에 수정이 필요한 부분이 있습니다. 아래 이슈를 참고해서 잘 따라와주세요!
  • vagrant up

vagrant up 이슈

  1. (VM 구축 이전)호스트 전용 네트워크에 대해 구성된 IP 주소가 범위 내에 있지 않습니다.

    - vim Vagrantfile
    - $subnet 부분을 위 오류에서 표시된 Ranges에 맞게 변경해줍니다!

  2. (VM 구축 이후)노드에 접속할 때 오류 :The connection to the server localhost:8080 was refused

  • (컨트롤 플레인 노드에서)아래와 같이 /etc/kubernetes/admin.conf 파일을 $HOME/.kube/config로 복사 후 소유자 변경
    - 워커노드에선 쿠버네티스를 조작하기 위한 기능이 설치되지 않습니다.(kubectl 등)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. kubernetes 1.22 이상 버전은 kubeflow 설치 시 unable to recognize "STDIN": no matches for kind "AuthorizationPolicy" in version "security.istio.io/v1beta1" 등의 오류가 발생합니다.

    • kubernetes 1.21.0 버전을 이용합시다. 설정은 다음과 같이 합니다.
    • (호스트 머신에서) k8s-cluster.yml 파일의 kube_version을 v1.21.0으로 변경해주세요!(1.21 이전 버전은 현재 kubespray 버전에서 더이상 지원하지 않습니다.)
    • vim /home/sysadmin/Desktop/kubespray/inventory/sample/group_vars/k8s_cluster/k8s-cluster.yml
  2. (VM 구축 이전)kubeflow의 모든 pod를 정상적으로 구동시키기 위해선 더 많은 리소스가 필요합니다. 설정을 수정해봅시다.

    • vim Desktop/kubespray/Vagrantfile
    • $vm_memory ||= 8192, $vm_cpus ||= 4로 변경해주었습니다.
    • 저는 vagrant up을 진행한 후 수정사항이 생겼기 때문에 vagrant provision을 사용하여 수정사항을 적용하였습니다. 아니면 아예 vagrant halt, vagrant destroy -f를 통해 VM을 통째로 삭제한 후 재구축하는 방법도 있겠습니다.

동작 확인

vagrant up을 통한 ancible inventory 활용은 직접 설정해줘야하는 수많은 부분을 자동화시켜줍니다.
예를 들어 마스터 노드에서 ssh-keygen을 생성해서 ssh-copy-id를 이용해 다른 노드에 공유해주는 것이나, 각 노드에서 /etc/hosts 파일을 편집해서 노드 상호간의 네트워크를 확인하는 부분 등입니다.
아래서 확인해보도록 합시다!

  1. 각 노드에 접속, 노드와 파드가 제대로 올라왔는지 확인합니다.
vagrant status
vagrant ssh k8s-1
kubectl get pods -A
kubectl get node
exit
vagrant ssh k8s-2
kubectl get pods -A
kubectl get node
exit
vagrant ssh k8s-3
exit


  1. 노드간의 통신을 확인합니다.
    • sudo vi /etc/hosts
    • ping k8s-3 : 마스터 노드(k8s-1)에서 ip주소가 아닌 host name으로 k8s-3에 핑을 날려보았는데 정상적으로 통신이 작동하고 있네요!
  2. 일반적인 설치 경우라면 모든 노드에서 직접 방화벽을 꺼주고, 스왑도 비활성화시켜야합니다. 이유는 복잡한데 굳이 올리지 않겠습니다. 일단 확인해본 결과 방화벽은 꺼져있으나 스왑은 확인 방법을 몰라 한번 더 off시켜주었습니다.
    • sudo ufw status : inactive (건들지 않았는데 이미 비활성화 상태네요, 좋습니다.)
    • (각 가상머신에서) sudo swapoff -a

고생하셨습니다! 이제 기본적인 쿠버네티스 구축은 완료되었군요.
다만 에드온 목록 등을 보니 네트워크 등의 설정이 더 필요한 것 같지만,
kubespray에서 활용하는 flannel 등의 툴의 정보를 아직 잘 몰라서 일단은 넘어가겠습니다.
우선 쿠버플로를 설치하고 생각합시다!

install kustomize

(마스터 노드에서 진행)

  • 3.2 버전을 설치합니다. 4.x 버전은 호환성에 문제가 있습니다.
  • linux 버전임에 유의하세요.

https://github.com/kubernetes-sigs/kustomize/releases/tag/v3.2.0

$ curl --silent --location --remote-name \
"https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize/v3.2.3/kustomize_kustomize.v3.2.3_linux_amd64" && \
chmod a+x kustomize_kustomize.v3.2.3_linux_amd64 && \
sudo mv kustomize_kustomize.v3.2.3_linux_amd64 /usr/local/bin/kustomize
$ kustomize version
![](https://velog.velcdn.com/images%2Fmoey920%2Fpost%2F45ded7cb-d4b2-49c1-9fe4-5340046807be%2Fimage.png)

install kubeflow

(마스터 노드에서 진행)

$ mkdir kubeflow
$ cd kubeflow
$ git clone https://github.com/kubeflow/manifests.git
$ cd manifests/
$ while ! kustomize build example | kubectl apply -f -; do echo "Retrying to apply resources"; sleep 10; done

  • 설치 후 모든 pod이 성공적으로 running 되려면 2~30분 이상의 시간이 소요될 수도 있습니다. 아무리 기다려도 pending 상태 등이 지속된다면, 컴퓨터의 리소스가(memory 등) 부족하지 않는지 검토해주세요. 관련 내용은 이전 포스팅에 있습니다.

kubespray addons

  • addon 활성화
    - (호스트 머신에서)vi Desktop/kubespray/inventory/sample/group-vars/k8s-cluster/addon.yml
profile
MLOps, MLE 직무로 일하고 있습니다😍
post-custom-banner

0개의 댓글