Unknownpgr

쿠버네티스 클러스터 구축[1] - 가상 머신

2021-06-25 17:10:36 | Korean

Vagrant logo

바로 전 포스트를 보시면 아시겠지만 이번에 괜찮은 성능의 미니 컴퓨터를 하나 구매하게 됐습니다. 이걸 구매한 주요 이유 중 하나가 쿠버네티스 공부였습니다. 그래서 쿠버네티스를 한 번 설치해봤고 그 과정을 정리하려고 합니다.

Vagrant

사실 저는 이전에 쿠버네티스를 아주 약간 건드려본 적이 있습니다. 그때는 잘 기억은 나지 않지만 뭔가 설치를 잘못 했어서 한참을 고생하다 포기했었습니다. 그때는 제가 가상 머신을 쓸 생각을 못 했어서 그냥 호스트 컴퓨터에 쿠버네티스를 깔았다 지웠다를 반복했었습니다. 그러나 이번에는 그런 일이 일어나지 않도록 Vagrant를 이용하여 가상 머신을 구축한 후 그 위에서 쿠버네티스 설치를 진행하였습니다.

Vagrant는 일종의 Infrastructure as Code (IaC) 기반의 가상 머신 관리 도구입니다. IaC은 그 이름처럼 어떤 인프라를 코드 형태로 관리할 수 있는 체계를 말합니다. 이때 코드라 함은 yaml이나 json이 될 수도 있고 말 그대로 python 등 스크립트가 될 수도 있습니다. Vagrant는 Vagrantfile이라는 설정 파일로부터 가상 머신을 생성할 수 있도록 해 줍니다. 그러므로 Vagrnatfile만 가지고 있다면 언제나 똑같은 가상 머신을 생성할 수 있습니다. 그래서 똑같은 환경의 가상 머신을 여러 개 만들거나 동일한 환경에서 여러 번 테스트를 진행해야 할 때 아주 유용합니다. 그리고 이 VagrantfileDockerfile처럼 그냥 하나의 텍스트 파일이므로 Git으로 형상 관리를 수행할 수도 있습니다.

DockerfileVagrantfile에 약간의 차이가 있다면 Dockerfile은 독자적인 언어를 사용하지만 Vagrantfile은 그냥 Ruby언어로 작성된 스크립트라는 점입니다. 물론 충분히 직관적이라서 루비 언어를 전혀 몰라도 쉽게 이해할 수 있도록 되어 있습니다.

하지만 Vagrant 그 자체는 가상 머신이나 가상화 프로그램이 아닙니다. Vagrant는 VirtualBox, VMware와 같은 가상화 프로그램이나 AWS, GCP와 같은 플랫폼들과 상호작용하여 그것들의 가상 머신을 관리해줍니다. 그러므로 Vagrant를 사용하려면 VirtualBox등이 이미 설치되어있거나 AWS 등 플랫폼과 연동하는 작업이 필요합니다.

Vagrant는 디렉토리 단위로 가상 머신을 관리합니다. 어떤 디렉토리에 Vagrantfile 이라는 이름의 파일을 생성한 후, 거기에 적절한 설정을 적어 주고 vagrant up 명령어를 입력하면 Vagrantfile 에 적힌 설정대로 가상 머신이 생성되고 실행됩니다. 이렇게 생성된 가상 머신에는 vagrant ssh 명령어를 통해 접속할 수 있습니다.

이때 생성된 가상 머신의 정보는 .vagrant라는 숨김 디렉토리 안에 생성됩니다. 저는 겪은 적이 없지만, Vagrantfile을 잘못 수정하여 이전에 생성된 가상 머신과 충돌이 발생하는 일이 있다고 합니다. 그런 경우에는 .vagrant 디렉토리를 삭제하면 됩니다.

Vagrantfile 작성하기

Vagrantfile은 사실 일반적인 Ruby 스크립트입니다. 물론 저는 루비를 사용할 줄 모르기 때문에 그냥 느낌 가는 대로 작업했습니다. 아래는 제가 작성한 Vagrantfile입니다. 만약 아래 스크립트를 쓰고자 하신다면 아이피를 각자의 네트워크에 맞게 적절히 바꿔 주셔야 합니다.

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/focal64"
  config.vm.network "public_network", ip: "172.30.1.100"
  config.vm.synced_folder '.', '/vagrant', disabled: true
  config.vm.provider "virtualbox" do |v|
    v.memory = 16384
    v.cpus = 4
  end
  config.disksize.size = '200GB'
  config.vm.provision "shell", path: "bootstrap.sh"
end

아래는 Vagrantfile과 같은 디렉토리에 있는 bootstrap.sh 파일입니다.

ip route add default via 172.30.1.1
echo 'vagrant:some-password-for-vagrant' | sudo chpasswd
sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
systemctl restart sshd.service
curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644

가상 머신의 계정 설정과 삽질들

가상 머신의 네트워크 모드와 삽질들

가상 머신은 여러가지 네트워크 모드를 가질 수 있습니다. 이중 가장 많이 사용되는 모드는 Network Address Translation (NAT) 모드와 Bridged Adapter 모드입니다. 이에 관해서는 이 아티클에 정말 상세하게 설명이 돼 있어서 간단하게만 설명하겠습니다.

Network Address Translation (NAT)

NAT모드는 직관적으로 컴퓨터 내부에 가상 머신을 위한 가상 공유기를 하나 만드는 것으로 생각할 수 있습니다. (실제 공유기에서도 NAT을 사용하므로 실제로도 똑같기는 합니다.) 호스트 머신의 IP 주소를 외부 IP 주소로 하는 공유기를 만드는 것으로 생각하면 됩니다. 우리가 공유기 내부에서 공유기 자체 IP 주소에도 접근이 가능하고 (기본 게이트웨이를 통한 설정 페이지 접속을 말하는 것이 아니라 공유기가 가진 외부 IP 주소에 접근이 가능하다는 의미입니다.) 인터넷에도 접속이 가능하듯 이 방법을 사용하면 가상 머신 내부에서 호스트 머신에도 접속이 가능하고 인터넷에도 접속이 가능합니다.

공유기를 사용하면 공유기 내부에서 생성된 패킷들은 공유기 외부에서는 전부 공유기에서 생성된 패킷으로 보입니다. 이와 마찬가지로 NAT 모드를 사용한 가상 머신에서 생성된 패킷들은 호스트 외부에서는 전부 호스트로부터 생성된 것으로 보입니다.

또한 공유기 외부에서 포트포워딩을 하지 않으면 공유기 내부에 접속이 불가능하듯이 NAT모드를 사용하면 호스트 머신이나 인터넷에서 가상 머신에 접근하는 것은 불가능합니다. 물론 호스트 머신에서 NAT모드를 사용하면서 포트포워딩을 해 주면 가능하기는 하지만 그런 경우 아래 설명한 Bridged Network 모드를 사용하면 훨씬 편합니다.

Bridged Adapter

Bridged Adapter 모드는 호스트의 어떤 랜카드를 통해 호스트가 접속되어있는 네트워크에 곧바로 가상 머신을 연결해버립니다. 그러므로 물리적으로는 하나의 기계인데 논리적으로는 두 개의 기기가 존재하게 됩니다. 실제로 위 Vagrantfile에서 볼 수 있듯 저는 공유기에 서버를 물려 놓고 가상 머신을 Bridged Adapter 방식으로 연결하였는데 이렇게 한 후 공유기의 네트워크 페이지를 보면 아이피도 두 개가 잡히고 MAC도 두 개가 잡힙니다. 가상 머신이 아니라 실제 물리 머신을 공유기에 병렬로 하나 더 연결하는 것과 같습니다.

그러므로 당연히 가상머신과 호스트 머신은 LAN을 통해 서로 접근이 가능하며 공유기에서 포트 포워딩을 해 주면 외부에서도 가상 머신에 접근할 수 있습니다.

이렇게만 보면 아무런 문제도 없어 보이지만 진짜 문제는 가상 머신 내부에 있습니다. 포트포워딩을 할 목적으로 Vagrantfile에서 ip를 수동으로 설정하였더니 DHCP가 전혀 작동하지 않았고 그래서 default gateway역시 자동으로 할당되지 않았습니다. 그런데 제가 설정한 것처럼 하면 기본으로 NAT모드가 설정되고 거기다 Bridged Adapter가 추가되는 형태로 가상머신 내부 네트워크가 구성됩니다. 그래서 마치 정상적으로 Bridged Adapter모드가 설정된 것처럼 인터넷이 잘 되기는 하는데 정작 외부에서 접속은 안 되는 희한한 상황이 발생합니다. 저는 그런 줄은 전혀 모르고 뭔가 Bridged Adapter 모드가 잘못 설정되었다고만 생각해서 또 한참을 헤멨었습니다.

올바른 방법은 DHCP를 설정하거나 제가 했던 것처럼 쉘 스크립트를 통하여 default gateway를 하나 더 추가해주는 것입니다.

가상 머신에 접속하기

만약 Vagrantfile이 올바르게 작성되었다면 앞서 말한 바와 같이 vagrant up 커맨드를 사용하여 접속할 수 있습니다. 물론 위 Vagrantfile에서는 패스워드를 통한 접속을 허용하였으므로 ssh vagrant@172.30.1.100 커맨드로도 접속이 가능합니다.

참고문헌


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -