본문 바로가기

프로그래밍/Docker

Vagrant 기반의 Minikube 설치

요즘 워낙 Kubernetes 붐이 부는데다가 개인적으로 Docker에서 좀더 확장된 개념을 공부해보고 싶어하던 찰라에..

Kubernetes 를 설치해보려 하니 Windows 기반의 노트북으로 구성하기에는 한계가 있어보였다(Linux 기반이면 시도해보겠지만서도..)

그러다보니 눈에 들어오는것이 Minikube 였다. 물론 어디까지나 개념 잡기 및 공부용으로 적당한거지 운영을 할려고 하면 안된다는 것은 알고 있다.

근데 문제는 이 Minikube 설치 방법이 워낙 다양하게 존재했다. 또 그나마 한번 해보면 제대로 되지를 않았다. 물론 Windows 기반으로 Minikube를 설치했으면 한방에 할 수 있겠지만 나같은 경우에는 Windows 기반으로 서버 구성을 요즘은 안하고 있다. Docker를 알게 된 이후로는 Virtual Box와 Vagrant를 이용해서 가상머신을 만들고 여기에 Docker를 운영하는 형태로 하다보니 가급적 이 환경에서 설치가 되는 것을 알아보던 중이었다. 근데 또 보면 내가 주로 사용하는 CentOS가 아닌 Ubuntu 기반의 설치가 오히려 더 많이 있어서 관련 내용을 찾기에도 애를 먹었다.

 

암튼 어찌어찌 해서 결국 Vagrant 기반으로 Minikube를 설치할수 있게 되었고 이것을 공유하고자 이 글을 쓴다. 관련 파일은 나의 Github에 올려놓았다. 사실 이 내용을 Github의 README.md에 쓸까 하다가 내용이 너무 길어져서 거기에는 요약본 형태로 올리고 여기에서는 이것을 기반으로 자신의 환경에 맞게 수정하고자 하는 사람이 있을듯 하여 나의 시행 착오 및 관련 내용을 설명하면서 글을 쓰려 한다.

 

그리고 이렇게 Minikube 를 설치했어도 이것이 올바르게 설치되었는지 알 수 있는 방법이 없었다. 그래서 선택한 것이 Youtube의 SKplanet Tacademy 채널에 가면 컨테이너 오케스트레이션 쿠버네티스 살펴보기 라는 강의가 있는데 이것을 보며 실습을 직접 따라해보면서 검증을 진행했다. 강의에서는 AWS에 Kubernetes의 경량화 엔진인 k3s를 설치하는 식으로 진행했지만 나의 경우엔 CentOS 기반의 Vagrant 이미지에 Minikube를 설치한 가상 머신을 사용했다. 강의를 진행했을 당시의 Kubernetes 버전과 2020년 2월 13일 기준의 버전인 1.17과는 차이가 있어서 그런지 약간 차이점이 있지만 설정파일을 수정하면서 진행했다. 

 

마지막으로 이 설정은 완전한 설정은 아니다. 네트워크에 대한 상세한 설정 같은 작업은 일절 되어 있지 않다. 만약 본인이 이 Vagrantfile을 기반으로 Minikube를 구축한뒤 자신이 원하는 방향과 맞지 않는 지점이 있으면 일일이 검색해서 수정해야함을 알려준다.

 

이 글에서는 Virtual Box 및 Vagrant 의 설치에 대한 내용은 다루지는 않는다. 그것과 관련해서는 Google 에서 검색하면 여러 다양한 글들이 있기 때문에 본인의 환경에 맞게 설치하면 된다. 여기서는 Vagrantfile에 대한 설명과 거기서 사용한 Shell Script 들에 대한 설명및 실행하는 방법 정도 순으로 다루도록 하겠다

 

이 Vagrant의 Minikube 가상머신(이름이 길어서 앞으로는 가상머신 이라고 하겠다)을 구성하는데는 3개의 파일이 필요한데 파일 이름과 용도는 다음과 같다

 

Vagrantfile Vagrant 에서 가상머신을 만드는데 사용되는 파일(이 파일이 provision.sh 파일과 install.sh 파일을 이용하게 된다)
provision.sh 가상머신의 OS쪽 설정에 관련된 내용이 들어간다
install.sh 가상머신에서 사용되는 프로그램 설치와 관련된 내용이 들어간다

 

이 3개의 파일을 하나의 디렉토리에 넣어두고 작업하면 된다. Vagrantfile은 Vagrant에서는 가장 핵심적인 파일이다. 여기서 가상머신에 대한 모든 설정작업이 이루어진다고 보면 된다. 기본적인 문법 설명은 하지는 않겠다. 다만 사용자의 환경에 맞게 설정해야 하는 부분에 대해서만 언급하도록 하겠다. 먼저 가상머신의 ip를 지정하는 부분은 다음과 같이 한다

 

centos7_minikube.vm.network "private_network", ip: "192.168.100.100"

 

이렇게 하면 가상머신의 ip가 192.168.100.100 으로 갖게 된다. 이 아이피는 나중에 동영상을 보며 실습할때 브라우저로 화면을 띄워가며 봐야 할 때가 있는데 그때 이 아이피를 사용하면 된다.

 

그리고 Windows 의 특정 디렉토리를 가상머신의 특정 디렉토리와 연결하는 작업은 다음과 같이 한다

 

centos7_minikube.vm.synced_folder "../../share_folder/centos_minikube", "/vagrant_hosts", create: true

 

대강 보면 ../../share_folder/centos_minikube/vagrant_hosts 디렉토리를 연결하는것 같은 뉘앙스를 느낄것이다. ../../share_folder/centos_minikube 이 부분은 현재 내가 사용중인 PC 운영체제(HOST)의 디렉토리를 의미한다. 절대경로가 아니라 상대경로 식으로 표현이 되어 있는데 이 상대경로의 기준은 Vagrantfile이 위치하고 있는 디렉토리를 뜻한다. 예를 들어 내가 D:\VagrantBox_Share\box\centos_minikube 디렉토리에 Vagrantfile이 있다면 지금 언급하고 있는 이 상대경로는 상위로 먼저 2번 올라간뒤에 share_folder/centos_minikube 디렉토리를 가르키기 때문에 절대경로로 이를 바꿔 표현하게 되면 D:\VagrantBox_Share\share_folder\centos_minikube 디렉토리를 의미하게 된다(기억이 가물가물 한데 절대경로가 될지 안될지는 모르겠다. 절대경로로 했다가 안되서 가상경로로 한거 같은데 확실치는 않다) 그리고 /vagrant_hosts 디렉토리는 가상머신의 디렉토리를 의미한다. 즉 가상머신의 최상위 디렉토리 밑에 있는 vagrant_hosts 디렉토리를 의미한다. 그러나 처음에는 이 디렉토리가 없기 때문에 만들라는 의미에서 create: true를 같이 설정해주게 된다. 이렇게 디렉토리를 연결하면 Windows 쪽 디렉토리에 파일이나 디렉토리를 넣을 경우 가상머신쪽에서도 같이 보이게 되어서 이를 접근할 수 있게 된다. 역으로 가상머신쪽 디렉토리에서 파일을 수정하거나 삭제하면 Windows 쪽 디렉토리에도 이와 똑같이 반영이 된다. 나중에 이 가상머신을 구동한뒤  youtube 동영상을 보며 강의를 따라할 때 Windows 쪽 디렉토리에 실습하고자 하는 설정파일을 만들면 가상머신에서 이를 활용할 수가 있다.

 

Minikube를 운영할때는 swap 메모리 기능을 disable 해야 하는데 이에 대한 설정은 다음과 같이 한다

 

centos7_minikube.vm.provision :shell, privileged: false, inline: "sudo swapoff -a"

 

shell script 명령을 직접 실행하는 식으로 되어 있다. vagrant의 경우 shell script를 실행하는 것은 root 계정이 아니기 때문에(vagrant 란 계정이 별도로 생성되어 이 계정으로 작업하게 된다) sudo를 붙여준다. 그러나 여기서 좀더 부가적으로 설명할 것이 있다. 가상머신을 만들게 되면 만들자마자 바로 실행이 되는 형태가 되는데 이 시점에서는 여기까지만 해도 swap 메모리 기능이 disable이 된다. 그러나 가상머신을 재부팅하는 경우에는 가상머신이 이미 만들어져 있는 상태이기 때문에 이러한 인라인 스크립트가 실행이 되지 않는다. 그래서 이러한 작업을 할때는 설정파일도 같이 건드려주어서 가상머신이 재부팅되었을때 설정파일을 통해 swap 메모리 기능을 disable 해주어야 한다. 이러한 설정을 하는 부분은 provision.sh 파일에 있다.

 

말이 나온김에 provision.sh 설정 파일을 보자. 

 

# root password set
echo -e "root\nroot" | passwd
# root login allow
sed  -i 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config;
sed  -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config;

# disable swap memory(sudo swapoff -a)
sed -i 's/\/swapfile none swap defaults 0 0/# \/swapfile none swap defaults 0 0/g' /etc/fstab;

 

sed 명령어 라인이 3줄이 있는데 이중 두줄은 root 계정에 비밀번호를 설정하는 작업을 진행한다. /etc/ssh/sshd_config 파일의 내용을 바꿔치기 하는 식으로 설정파일 내용을 바꾸고 있다. 마지막에 사용된 sed 명령은 /etc/fstab 파일에서 swap 메모리를 disable 하는 설정을 해주는 작업을 한다. 설정 내용이 있는 라인을 주석처리 하는 식으로 처리해서 swap 메모리를 disable 해주고 있다. 이렇게 함으로써 가상머신이 재부팅 될때 /etc/fstab 파일의 내용을 읽어 swap 메모리가 disable 되도록 한다.

 

마지막으로 install.sh 파일을 설명하도록 하겠다. 주석을 보면 설치하는 프로그램과 왜 이것들을 설치했는지에 대한 이유를 적어놓았기 때문에 알수 있겠지만 요약 형태로 간추려서 설명하면 다음과 같다

 

    • docker Version 19.03.4
    • ntp
    • net-tools
    • socat
    • kubelet, kubectl, kubeadm
    • minikube

docker를 설치하는 이유에 대해 잠깐 설명하자면 Minikube가 사용할 가상머신(여기서 가상머신은 우리가 다루는 Vagrant minikube 가상머신을 얘기하는게 아니라 VirtualBox나 VMWare 같은 하이퍼바이저를 의미한다)를 설치해야 하는 부분이 있다. 이러한 가상머신으로 Minikube에서는 VirtualBox, KVM을 설치하게끔 하는데 지금 우리가 사용하는 시스템 구성을 생각해볼 부분이 있다. 현재 우리 시스템의 구조를 한줄로 쭉 표현을 하자면..

 

Windows -> Virtual Box -> Vagrant -> CentOS

 

이러한 구조이다. 여기에서 다시 CentOS에 VirtualBox를 설치한다는건 좀 구성이 맞지도 않을뿐더러 CentOS에서 배포하는 Vagrant Box는 GUI를 지원하지 않는데다가 이런식으로 설치하면 무거워질것이란 생각이 들었다. 만약 Host가 Linux 였다면 Minikube 설치하고 바로 VirtualBox를 설치해도 문제가 없지만 지금 하고 있는 환경에서는 맞지가 않다고 느껴졌다. 이러한 상황을 아는지 Minikube는 가상머신이 없어도 docker를 통해서 할수 있게끔 지원해주고 있다. 그래서 docker를 설치하게 되었다. 다만 Kubernetes가 지원하는 Docker 최상위 버전을 알아야 하는데 2020년 2월 13일 기준으로 Docker 최상위 버전은 19.03.5가 있지만 Kubernetes는 19.03.4를 지원하기 때문에 최신버전인 latest를 사용하지 않고 버전을 지정해서 설치해주었다.

 

이 Vagrantfile을 가지고 응용해서 앞으로 계속 버전업 될 Kubernetes를 업그레이드 할 개발자들에게 조언을 하자면 Kubernetes 관련 프로그램들(minikube, kubectl 등)은 서로 버전을 맞춰서 버전업이 되기 때문에 문제가 없지만 Docker의 경우는 관리 주체가 다르기 때문에 Docker 최신버전을 Kubernetes가 지원한다는 보장이 없다. 두 계열의 프로그램 업그레이드 주체가 다른데서 오는 상황이다. Kubernetes 관련 프로그램은 최신 버전을 설치하되 Docker에 대해서는 최신 Kubernetes가 지원하는 Docker 버전을 확인한뒤 해당 버전을 다운받아 설치하는것이 좋다

 

ntp와 net-tools는 Minikube 때문에 설치했다기 보다는 개인적으로 Vagrant 가상머신을 만들때 시간과 네트워크 관련 프로그램을 설치하다보니 하게 된 것이다. socat의 경우는 Minikube를 기동할때 socat이 필요하다는 식의 에러 메시지가 나온게 있어서 이를 설치했다.

 

kubelet과 kubectl, kubeadm의 경우 원래 Minikube를 설치하면 Minikube가 설치 될때 자동으로 이 셋을 다운로드 받아 설치하게 된다(Minikube를 처음 실행할때 올라오는 메시지를 보면 Downloading kubelet, Downloading kubectl, Downloading kubeadm 이런 메시지가 올라온다) 근데 이러고 나면 sudo systemctl enable kubelet.service 명령이 먼저 실행되어 있어야 한다는 식으로 나온다. 그러나 이것을 할려면 먼저 kubelet을 설치한뒤 방금 언급한 systemctl 명령어를 사용해야 하기 땜에 먼저 위의 3개를 설치한뒤 sudo systemctl enable kubelet.service 를 실행한후 Minikube를 기동하게끔 했다.

 

Minikube를 실행할때는 다음과 같이 사용하고 있다.

 

sudo minikube start --vm-driver=none

 

여기서 살펴봐야 할 부분은 --vm-driver 옵션이다. 이 옵션에 Minikube가 사용할 하이퍼바이저를 설정하게 되어 있는데 위에서 잠깐 설명했다시피 하이퍼바이저를 설치하지 않기 때문에 none 옵션을 주었다. 이렇게 none 옵션을 주면 docker가 대신 하이퍼바이저 역할을 하게 된다

 

위에 언급한 강의 동영상을 보면서 본인이 실습할때 느끼겠지만 핵심적인 프로그램은 kubectl 이다. 이것을 통해 kubernetes 관련 제어 명령을 할 수 있게 되는데 kubectl을 사용하기 위한 환경설정 파일은 vagrant 계정(vagrant 계정은 Vagrant Box를 통해 가상머신을 만들면 생성되는 계정으로 차후에 언급하겠지만 vagrant ssh 명령으로 가상머신 안에 들어가게 되면 이 계정으로 로그인 한 상태로 들어오게 된다)에는 없다. 그래서 /etc/kubernetes/admin.conf 파일을 /home/vagrant/.kube 디렉토리의 config 파일로 복사한뒤 기존 admin.conf의 파일 소유권 및 그룹을 vagrant 로 바꿔주는 작업을 진행해준다.

 

이렇게 하면 모든 작업이 완료된다. 이제 이 글의 마지막으로 이렇게 만든 vagrant 가상머신을 실행하거나 종료, 가상머신 지우기, 가상머신 접속하기에 대한 명령어를 언급하겠다. 이 명령어들은 Vagrantfile 이 있는 디렉토리에서 실행해주면 된다

 

vagrant up 가상머신을 만들고 실행(부팅)한다. 기존에 이미 만들어져 있는 가상머신이면 기존것을 가지고 실행한다.
vagrant ssh 현재 실행중인 가상머신에 접속한다. 접속하면 vagrant 계정의 home 디렉토리인 /home/vagrant 에 위치해 있게 된다. 접속을 끊을때는 exit를 입력하면 끊어진다
vagrant halt 가상머신을 종료한다
vagrant destroy 가상머신을 삭제한다. 가상머신을 다시 만들고 싶을때 먼저 이것을 실행하고 다시 vagrant up을 해주면 만들면서 실행하게 된다.

 

지금까지 Vagrant 기반의 Minikube 설치에 대해 알아보았다. 다음으로는 위에서 언급했던 동영상을 따라할 수 있는 방법과 수정사항에 대해 얘기하도록 하겠다.