티스토리 뷰

References

원문 : https://github.com/patrickhoefler/coreos-vagrant-kubernetes/blob/master/Vagrantfile

이 글은 원문의 내용을 기준으로 여러 가지를 테스트하면서 나름대로 정리한 내용으로 Vagrant를 사용해서 CoreOS, CoreOS Cluster, Kubernetes 까지 설정하는 방법을 로컬 머신에서 설정해 보는 것을 정리하도록 한다.

기본 설치

작업에 필요한 바이너리와 프로젝트등은 모두 GitHub를 통해서 얻게 되므로 로컬 머신에 Git 가 설치되어 있어야 하며 아래의 모든 명령들은 Git Bash 를 기준으로 한 것이다.

필요 도구 설치

로컬 머신에 단일 CoreOS 를 구성하는 작업을 먼저 진행하기 위해서는 다음과 같은 도구의 설치가 필요하다.

Vagrant를 사용해서 CoreOS 설치를 하기 위한 프로젝트를 복제한다.

$ git clone https://github.com/patrickhoefler/coreos-vagrant-kubernetes
$ cd coreos-vagrant-kubernetes

VM에 CoreOS 구성

VM을 구성하는데는 아래와 같이 2 가지 프로바이더가 존재한다. Vagrant의 내부 처리 명령도 프로바이더에 따라 다르기 때문에 사용할 툴에 따라서 프로바이더 정보를 설정해야 한다. 기본으로 VirtualBox 프로바이더를 사용한다.

아래와 같이 vagrant up 명령이 실행되면 CoreOS 이미지를 다운로드하고 VM에 Guest OS로 설치를 진행한다. 이미 구성된 경우라면 VM을 실행시키는 명령을 처리한다.

Notes

더 다양하게 CoreOS 이미지에 대한 채널 (Alpha, Beta, Stable) 을 설정하거나, SSH 구성 정보나, VM의 갯수 및 메모리 크기를 변경하려면 Vagrant에서 제공하는 config.rb.sample (config.rb 로 이름 변경 필요), user-data.sample (user-data 로 이름 변경 필요) 파일의 내용을 수정해서 사용하면 된다.
다운로드한 coreos-vagrant-kubernetes 폴더의 README.md 를 참고하면 된다.

VirtualBox Provider 사용

$ vagrant up

VMWare Provider 사용

VMWare는 상용 툴이기 때문에 프로바이더를 사용하기 위해서는 Hashicorp 구매를 해야한다. VMWare Player라는 프리 툴도 제공이 되지만 이에 대한 프로바이더는 현재 없는 것으로 보인다. (아마도 상용 프로바이더를 구매하면 같이 사용할 수 있을지 모른다)

$ vagrant up --provider vmware_fusion

CoreOS 연결

Vagrant를 사용해서 VM을 구성할 때 기본 설정된 SSH를 사용한다. 기본 생성되 사용자는 core 이고 비밀번호는 미 설정된 상태다.

$ vagrant ssh

CoreOS 에 대한 내용은 “Using CoreOS”를 참고하도록 한다.

동기 폴더 (Synced_folder) 설정

Vagrant 동작에 필요한 정보는 coreos-vagrant 폴더에 존재하는 Vagrantfile 파일의 내용을 사용한다. 따라서 공유 폴더 설정을 하는 부분이 주석처리 되어 있는데 이 부분에 주석을 제거해 주면 된다.

...
config.vm.synced_folder ".", "/home/core/share", id: "core", :nfs => true, :mount_options => ['nolock,vers=3,udp']
...

Notes

만일 Host OS 가 Windows 라면 위의 공유 폴더는 제대로 마운트되지 않는 오류가 발생한다. 이 경우에는 다음과 같이 설정을 해 주어야 한다.

config.vm.synced_folder ".", "/vagrant", type:  "smb"

위의 같이 설정을 하고 아래 명령을 수행하면 공유 폴더 처리를 위한 HOST OS의 사용자 계정을 물어보게 된다.

$ vagrant reload

물론 이 파일을 미리 변경해 놓고 vargrant up 을 실행하면 VM 구성을 하는 단계에서 HOST OS의 사용자 계정을 물어보게 된다.

Notes

이미 vagrant를 이용해서 VM을 구성한 적이 있다면 vargrant up 명령을 통해서 VM을 생성할 때 생성은 되지만 SSH로 접속을 하지 못하고 connection refuse 오류가 계속 발생하게 된다.
이 때는 Vagrantfile 에서 아래와 같이 ip 구성 정보를 변경해 주면 된다.

ip = "172.17.8.#{i+100}"  << 이 부분의 IP 구성을 기존과 다르게 변경해 주면 된다.

user-data 사용

Vagrant 는 coreos-cloudinit 을 사용해서 VM을 구성한다. 이 때 작업이 진행되는 폴더에 user-data 라는 파일이 존재하면 그 파일에 존재하는 cloud-config 설정 정보를 사용한다.

이를 활용하려면 기본 제공되는 user-data.sample 파일의 이름을 user-data 로 변경해서 사용하면 된다. 더 자세한 내용은 “coreos-cloudinit” 문서를 참고하면 된다.

Notes

이 파일은 yaml 포맷을 따르고 있다. 따라서 일반 에디터에서 사용하면 포맷 문제로 제대로 구동되지 않을 수 있으므로 조심해야 한다. 작성한 파일이 포맷이 맞는지를 확인하기 위해서는 여기서 검사를 해 보면 된다. 예를 들어 Tab 문자등이 존재하면 포맷 오류로 제대로 동작하지 않는 문제가 생긴다.

설정 정보

Vagrantfile 은 CoreOS 클러스터를 구성할 때 여러 가지 옵션을 지정할 수 있다. 예를 들어 VM 의 갯수나 VM의 메모리 사이즈 등이다. 이 정보도 작업이 진행되는 폴더에 config.rb 파일이 존재하면 그 파일에 존재하는 옵션들을 사용한다.

클러스터 설치

위에서 단일 VM 구성을 테스트 해 보았으므로 이제는 클러스터를 구성해 보도록 한다. 생성해서 테스트를 했던 VM을 제거하는 방법은 아래와 같다.

$ vagrant halt     # 이 명령은 동작 중인 VM을 종료한다. (shutdown)
$ vagrant destroy  # 이 명령은 VM을 삭제한다.

클러스터를 구성할 VM 갯수는 위에서 언급한 것과 같이 config.rb 파일에서 $num_instances 에 값을 지정하면 된다.

클러스터를 구성할 때 가장 중요한 부분은 각 구성 VM 들이 동일한 클러스터의 멤버로 식별되기 위한 정보를 가져야 한다는 것이고 이를 위해서 etcd 를 사용한다. 새로운 클러스터를 구성할 때 마다 토큰을 생성해서 지정해 주어야 한다.

토큰 생성은 아래의 명령을 통해서 발급 받는다.

$ curl https://discovery.etcd.io/new
https://discovery.etcd.io/f3c1fd3c9d31746f6f194927e152fbce

위의 명령을 실행하면 새로운 토큰 값을 가진 클러스터 Discovery URL을 받게 된다. 이 URL을 user-data 파일의 discovery 부분의 주석을 제거하고 복사해 넣으면 된다.

#discovery: https://discovery.etcd.io/<token> 를 주석 제거해서 아래와 같이 구성한다.
discovery: https://discovery.etcd.io/f3c1fd3c9d31746f6f194927e152fbce

이제 클러스터 구성을 위한 정보 설정 (config.rb 와 user-data) 이 되었으므로 vagrant up 을 실행해서 클러스터를 구성하도록 한다.

Notes

만일 토큰을 사용해서 vagrant up 을 하다가 오류가 발생했다면 토큰을 재 사용할 수는 없다. 물론 다시 사용한다고 해서 오류가 발생하는 것은 아니지만 클러스터 구성이 제대로 되지 않는다. 따라서 항상 클러스를 생성 또는 재 구성할 경우는 반드시 새로운 토큰을 만들어서 사용해야 한다.
이렇게 해야 하는 이유는 클러스터 구성 멤버들 (VM들) 정보가 토큰 관리 사이트에 저장되기 때문에 정보가 꼬여서 제대로 동작하지 않기 때문이다.

Kubernetes 설치

vagrant를 이용해서 클러스터를 구성할 때 Kubernetes를 같이 설정할 수 있다.

아래와 같이 Kubernetes 설치를 위한 정보를 config.rb 파일에 설정해 주면 된다.

...
# Create a Kubernetes cluster
# Setting this value to true turns the first instance into a Kubernetes master
# and all other instances into Kubernetes minions. You need at least two
# instances for this to work.
$kubernetes=true
...

그러나 Kubernetes는 하나의 마스터 서버 (Master) 와 여러 개의 미니언 서버 (Minion) 로 구성된다. 따라서 클러스터 구성 정보 파일인 user-data.master.sample 파일을 user-data.masteruser-data.minion.sample 파일을 user-data.minion 파일로 이름을 변경하도록 한다.

이제 다시 vagrant reload 또는 vargrant halt 후에 vagrant up 을 실행해 주면 VM이 올라오면서 구성이 된다. 물론 Cluster를 구성할 때부터 설정을 미리 해 놓고 한번에 처리하는 것도 가능하다.

여기서 주의할 점은 구성되는 IP를 user-data.masteruser-data.minion 에서 사용하므로 해당 파일들에 고정되어 있는 IP를 조정해 현재 환경에 맞도록 변경해 주어야 한다. (기본 값은 172.17.8.101를 마스터 서버 IP로 바라보게 되어 있다)

CoreOS 버전 교체

CoreOS 는 현재 수시로 버전이 갱신되고 있으므로 구성한 이후에도 CoreOS 버전이 변경되어 배포되는 상태가 된다. 이때 기존 구성한 CoreOS를 새로운 버전으로 변경할 경우는 아래와 같이 처리를 하면 된다. 이렇게 설정해 놓으면 다음 vagrant up 될 때 새로운 버전의 CoreOS로 변경된다.

$ vagrant box remove coreos-alpha --provider vmware_fusion     # VMWare Provider를 사용하는 경우
$ vagrant box remove coreos-alpha --provider virtualbox            # VirtualBox Provider를 사용하는 경우

Notes

CoreOS Box를 제거하지 않고 갱신할 경우는 vagrant box update 를 실행하면 된다. 그러면 최신버전이 다운로드 되고 2개의 버전이 존재하게 되므로 위의 제거 명령을 처리할 때 제거할 버전 정보를 제공해 주어야 한다. --box-version 554.0.0

HOST OS 에서 VM의 Docker 실행

config.rb 파일에서 $expose_docker_tcp 설정을 해서 현재 HOST OS의 TCP 포트를 각 VM 상의 CoreOS 에 존재하는 Docker를 실행할 수 있도록 포트 포워딩 처리를 할 수 있다. 첫 번째 서버를 기준으로 포트를 지정하고, 나머지 서버들은 지정한 포트 + 1 씩 증가하도록 설정한다. (기본 포트는 2375로 되어 있으므로 2375, 2376, 2377 로 처리된다) 좀 더 자세한 내용는 “Enable Remote API Instructions” 를 참고하도록 한다.

실제 HOST OS 에서는 아래와 같이 설정해 놓고 Docker Command를 실행할 수 있다.

$ export DOCKER_HOST=tcp://localhost:2375

이 부분은 향후 Docker 활용을 하는 시점에 다시 정리를 해 보도록 한다.

Written by Morris (MSFL)

댓글
댓글쓰기 폼