실제 머신에 Ansible Playbook을 적용하기 전에 가상 머신에서 충분히 실험해 볼 수 있다.
앤서블에서는 원하는 머신의 상태를 서술한 파일을 플레이북 Playbook이라고 부른다. Vagrant를 이용해 간편하게 VM을 만들어 실험해 본 후에 적용하자.
구축 워크플로우
Vagrant를 이용해 가상 머신을 로컬 환경에서 만들고 앤서블 플레이북을을 만들어 낸 후에, 가상 머신 인스턴스를에 작성한 플레이북이 원하는대로 환경을 만들어냄
버츄얼박스는 vagrant의 VM 프로바이더로써 필요합니다. 베이그런트는 가상화 소프트웨어인 버추얼박스로 호환성이 매우 좋으니 VMware, Hyper-V 등을 사용할 수도 있지만 버추얼박스로 진행합니다.
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
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
vagrant
vagrant plugin install vagrant-vbguest --plugin-version 0.21
vagrant up을 진행하시면 ancible까지 모두 진행됩니다! 공식 깃허브에서 자동화를 구축해놓았으니 그대로 따라가봅시다.
여기선 컨트롤 플레인 2개와 워커 노드 1개를 구성했는데, 왜 굳이 워커 노드를 2개 두지 않고 컨트롤 플레인 2개를 두었는지는 모르겠습니다.
수정이 어렵진 않지만 기능 동작 확인을 위해서 그대로 진행하고, 나중에 고도화가 필요할 떄 진행해보도록 합시다.
git clone https://github.com/kubernetes-sigs/kubespray.git
cd kubespray
vagrant up
(VM 구축 이전)호스트 전용 네트워크에 대해 구성된 IP 주소가 범위 내에 있지 않습니다.
- vim Vagrantfile
- $subnet 부분을 위 오류에서 표시된 Ranges에 맞게 변경해줍니다!
(VM 구축 이후)노드에 접속할 때 오류 :The connection to the server localhost:8080 was refused
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubernetes 1.22 이상 버전은 kubeflow 설치 시 unable to recognize "STDIN": no matches for kind "AuthorizationPolicy" in version "security.istio.io/v1beta1"
등의 오류가 발생합니다.
vim /home/sysadmin/Desktop/kubespray/inventory/sample/group_vars/k8s_cluster/k8s-cluster.yml
(VM 구축 이전)kubeflow의 모든 pod를 정상적으로 구동시키기 위해선 더 많은 리소스가 필요합니다. 설정을 수정해봅시다.
vim Desktop/kubespray/Vagrantfile
$vm_memory ||= 8192
, $vm_cpus ||= 4
로 변경해주었습니다.vagrant provision
을 사용하여 수정사항을 적용하였습니다. 아니면 아예 vagrant halt
, vagrant destroy -f
를 통해 VM을 통째로 삭제한 후 재구축하는 방법도 있겠습니다.vagrant up을 통한 ancible inventory 활용은 직접 설정해줘야하는 수많은 부분을 자동화시켜줍니다.
예를 들어 마스터 노드에서 ssh-keygen을 생성해서 ssh-copy-id를 이용해 다른 노드에 공유해주는 것이나, 각 노드에서 /etc/hosts 파일을 편집해서 노드 상호간의 네트워크를 확인하는 부분 등입니다.
아래서 확인해보도록 합시다!
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
sudo vi /etc/hosts
ping k8s-3
: 마스터 노드(k8s-1)에서 ip주소가 아닌 host name으로 k8s-3에 핑을 날려보았는데 정상적으로 통신이 작동하고 있네요!sudo ufw status
: inactive (건들지 않았는데 이미 비활성화 상태네요, 좋습니다.)sudo swapoff -a
고생하셨습니다! 이제 기본적인 쿠버네티스 구축은 완료되었군요.
다만 에드온 목록 등을 보니 네트워크 등의 설정이 더 필요한 것 같지만,
kubespray에서 활용하는 flannel 등의 툴의 정보를 아직 잘 몰라서 일단은 넘어가겠습니다.
우선 쿠버플로를 설치하고 생각합시다!
(마스터 노드에서 진행)
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)
(마스터 노드에서 진행)
$ 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
vi Desktop/kubespray/inventory/sample/group-vars/k8s-cluster/addon.yml