Vagrant Share를 이용하여 외부에서 사내의 웹 서비스에 접속

DevOps|2017. 9. 21. 07:52

외부의 고객에게 현재 개발 중인 웹 서비스 상태를 보여 줄 일이 가끔 있습니다.
이럴 때 내 랩탑의 Vagrant Box를 사외에서 접근하도록 할 수 있다면 꽤 편리할 겁니다.

실제로 Vagrant Share라는 기능을 이용하면 이렇게 할 수 있습니다. 꽤 간편하죠.

한 번 해 봅시다.

우선 아래와 같은 Vagrantfile과 provision.sh 파일을 만듭니다.

Vagrantfile

Vagrant.configure(2) do |config|
  config.vm.box = "hashicorp/precise32"
  config.vm.provision "shell", path: "provision.sh"
  config.vm.network "forwarded_port", guest: 80, host: 8080, id: "nginx"
end

provision.sh

apt-get -y update
apt-get -y install nginx
service nginx start

우분투 OS에 nginx를 설치하고 호스트의 8080 포트로 웹 서비스에 접근할 수 있도록 설정했습니다.

이제 vagrant up 명령으로 박스를 실행합니다.

C:\workspace\vagrant-share_ngrok>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'hashicorp/precise32' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'hashicorp/precise32'
    default: URL: https://atlas.hashicorp.com/hashicorp/precise32
==> default: Adding box 'hashicorp/precise32' (v1.0.0) for provider: virtualbox
    default: Downloading: https://vagrantcloud.com/hashicorp/boxes/precise32/versions/1.0.0/providers/virtualbox.box
==> default: Box download is resuming from prior download progress
    default: Progress: 100% (Rate: 561k/s, Estimated time remaining: --:--:--)
==> default: Successfully added box 'hashicorp/precise32' (v1.0.0) for 'virtualbox'!
==> default: Importing base box 'hashicorp/precise32'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'hashicorp/precise32' is up to date...
==> default: Setting the name of the VM: vagrant-share_ngrok_default_1505748939539_53687
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 80 (guest) => 8080 (host) (adapter 1)
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    ......
    ......
    ......
==> default: Setting up nginx (1.1.19-1ubuntu0.8) ...
==> default: Processing triggers for libc-bin ...
==> default: ldconfig deferred processing now taking place
==> default: Starting nginx:
==> default: nginx.

C:\workspace\vagrant-share_ngrok>

실행이 완료되면 아래 페이지에서 ngrok를 다운로드 합니다.

Download ngrok

다운로드 받은 파일의 압축을 해제하면 나오는 실행 파일을 적당한 곳에 풀어주고 해당 폴더를 시스템 PATH 에 추가합니다.
Vagrant Share가 실행될 때 ngrok 실행 파일을 찾을 수 있어야 하기 때문에 필요한 작업입니다.

ngrok을 이용하면 Vagrant와 관계 없이 개발용 랩탑에서 실행되는 웹서비스 등을 퍼블릭 망에서 접근이 가능하게 할 수 있습니다.
8080 포트를 열고 싶으면 간단히 ngrok http 8080 을 실행하면 됩니다. 나머지는 ngrok 을 실행하면 나오면 도움말을 참고하세요.

이제 새 명령 프롬프트를 띄우고 vagrant share 명령을 실행합니다.

C:\workspace\vagrant-share_ngrok>vagrant share
Vagrant Share now defaults to using the `ngrok` driver.
The `classic` driver has been deprecated.

For more information about the `ngrok` driver, please
refer to the documentation:

  https://www.vagrantup.com/docs/share/
==> default: Detecting network information for machine...
    default: Local machine address: 127.0.0.1
    default:
    default: Note: With the local address (127.0.0.1), Vagrant Share can only
    default: share any ports you have forwarded. Assign an IP or address to your
    default: machine to expose all TCP ports. Consult the documentation
    default: for your provider ('virtualbox') for more information.
    default:
    default: Local HTTP port: 8080
    default: Local HTTPS port: disabled
    default: Port: 8080
    default: Port: 2222
==> default: Creating Vagrant Share session...
==> default: HTTP URL: http://030a7496.ngrok.io
==> default:

Vagrant가 박스에서 실행 중인 웹 서비스의 포트를 찾아서 이를 외부에 열어 줍니다.
이제 실행 후 출력된 주소(위의 경우는 http://030a7496.ngrok.io)를 고객에게 알려주기만 하면 됩니다.

미리 확인해 보려면 스마트폰(LTE)으로 접속해 보면 되겠죠.


EOF

댓글()

Vagrant에 Kubernetes 클러스터(cluster) 구성하기

Kubernetes|2017. 8. 15. 08:49

Minikube로도 랩탑에서 많은 작업을 할 수 있지만 아무래도 멀티 노드로 구성해서 직접 검증을 해야 할 일이 생긴다.

Vagrant에 직접 CentOS나 Ubuntu 박스를 이용해서 구성을 시도했지만 시간만 낭비했고, 구글링 끝에 kubernetes-vagrant-coreos-cluster 프로젝트를 찾았다.

https://github.com/pires/kubernetes-vagrant-coreos-cluster/

프로젝트 메인의 README 를 보면서 설치를 진행해 봤는데, 아래는 윈도(windows)에서 설치한 경험을 정리한 것이다. 몇 가지 시행착오가 있었기 때문에 도움이 될 것이다.

그리고 시간이 없더라도 README 는 꼭 읽을 것을 권장한다.

Installation

NFS 공유 기능을 활성화 하기 위해서 Vagrant 플러그인 설치

    $ vagrant plugin install vagrant-winnfsd

Vagrant WinNFSd 플러그인의 깃 저장소
https://github.com/winnfsd/vagrant-winnfsd

저장소를 clone 하기 전에 Git 옵션을 변경

    $ git config --global core.autocrlf false
    $ git config --global core.eol lf

Deploy Kubernetes

vagrant를 시작하고 프로비저닝을 실행한다.

    $ vagrant up

kubernetes-vagrant-coreos-cluster 프로젝트는 CoreOS의 alpha 버전을 사용하도록 기본 구성되어 있는데, 만약 현재 버전이 1492.3.0이라면 아래와 같이 403에러가 발생할 수도 있다.

    ==> master: Box 'coreos-alpha' could not be found. Attempting to find and install...
        master: Box Provider: virtualbox
        master: Box Version: = 1492.3.0
    ==> master: Loading metadata for box 'http://alpha.release.core-os.net/amd64-usr/current/core
    os_production_vagrant.json'
        master: URL: http://alpha.release.core-os.net/amd64-usr/current/coreos_production_vagrant
    .json
    ==> master: Adding box 'coreos-alpha' (v1492.3.0) for provider: virtualbox
        master: Downloading: http://builds.release.core-os.net/alpha/amd64-usr/1492.3.0/coreos_pr
    oduction_vagrant.box
        master: Progress: 0% (Rate: 0/s, Estimated time remaining: --:--:--)
    An error occurred while downloading the remote file. The error
    message, if any, is reproduced below. Please fix this error and try
    again.
    
    The requested URL returned error: 403 Forbidden

아마도 박스 다운로드 주소를 잘못 설정한 것이 아닐까 의심된다.

어쨌든 다음과 같이 바로 전 버전인 1492.1.0 을 사용하도록 설정하고 실행하면 해결된다.

    $ COREOS_VERSION=1492.1.0 vagrant up

이제 master 노드에 ssh로 접속하여 kubectl 을 사용해서 이런저런 작업을 해 볼 수가 있게 됐다.

    $ vagrant ssh master
    $ kubectl cluster-info

만약 vagrant ssh master 명령으로 접속했을 때 인증이 안되면, 아래 링크를 참고한다.

Vagrant - CoreOS에 vagrant ssh 접속 시 인증 실패

Environment variables

  • CHANNEL: CoreOS의 채널을 지정한다. alpha, beta, stable을 중 하나를 넣는다.

    기본 값(default)은 alpha.

  • COREOS_VERSION: CoreOS의 버전을 지정한다. 위에서 언급했다.

  • USE_KUBE_UI: Kubernetes UI 를 deploy 할 것인지의 여부를 지정.

    기본 값은 false http://#{MASTER_IP}:8080/ui 에 접속하면 화면을 볼 수 있다.

이외에도 변수가 많은데 굳이 여기에 옮길 필요는 없을 것 같다. 앞으로 필요한 부분이 있으면 다른 글에서 덧붙이기로 하자.



EOF

댓글()

Vagrant - CoreOS에 vagrant ssh 접속 시 인증 실패

DevOps|2017. 8. 13. 11:06

Vagrant에 CoreOS를 설치하고 ssh 접속을 시도 했을 때 인증이 안되는 경우가 있습니다.

    $ vagrant ssh
    Password:
    Password:
    Password:
    vagrant@127.0.0.1's password:
    vagrant@127.0.0.1's password:
    Authentication failed.

저의 경우는 alpha 채널에서 1492.1.0 버전을 받아서 설치했었습니다.

CoreOS는 기본 계정이 vagrant가 아니라 core 더군요. 그리고 key 방식 인증만 지원하고 passowrd 방식은 지원 안합니다. 이런 경우 Vagrant의 insecure key를 이용하면 됩니다.

    $ ssh core@localhost -p 2222 -i $VAGRANT_HOME/insecure_private_key

$VAGRANT_HOME 은 윈도(windows)의 경우 C:\Users\[사용자ID]\.vagrant.d 폴더입니다. 명령 프롬프트에서 cd %USERPROFILE%\.vagrant.d 명령으로 이동할 수 있습니다.

혹은 Vagrantfile에서 아래와 같이 ssh username을 core로 변경한 후 VM을 reload 하면 vagrant ssh 명령으로 접속이 가능합니다.

    config.ssh.username = "core"



EOF

댓글()

Vagrant - 기본+

DevOps|2017. 6. 8. 19:12

Vagrant - 기본의 내용을 보충한다.

포트 포워딩(PORT FORWARDING)

호스트 머신의 포트를 통해서 게스트 머신의 특정 포트에 접속, 네트워크 트래픽을 게스트 머신으로 보내는 방법.

게스트 머신의 아파치에 접근하기 위해서는 아래와 같이 Vagrantfile을 편집한다. guest 속성의 80이 가상머신의 포트, host속성의 4567이 호스트의 포트다.
즉 아래와 같이 설정하면 호스트에서 http://localhost:4567로 접속하면 가상머신의 80 포트에 접속해서 아파치 화면을 볼 수 있다.

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/precise64"
  config.vm.network :forwarded_port, guest: 80, host: 4567
end

포트를 변경한 후에는 vagrant reload 명령으로 가상머신을 재시작 한다.

가상머신의 포트 포워딩 설정이 기억나지 않을 때는 VirtualBox를 실행하고 해당 가상머신의 설정 → 네트워크 → 어댑터 1 → 포트 포워딩을 클릭하여 확인할 수 있다.

MEMORY, CPU 크기 설정

가상머신의 memory나 cpu의 크기를 변경하려면 아래와 같이 설정을 조정할 수 있다. 아래는 메모리를 2GB로, CPU를 2개로 조정한 예이다.

config.vm.provider :virtualbox do |vb|
    vb.memory = 2048
    vb.cpus = 2
end

스냅샷(SNAPSHOT) 생성/복구

가상머신의 스냅샷을 생성하려면 스냅샷 이름과 함께 vagrant snapshot save 명령을 사용한다. 아래의 예는 first_snapshot이라는 이름으로 스냅샷을 생성하고 있다.

vagrant snapshot save first_snapshot

가상머신의 상태를 복구하려면 restore 명령을 사용한다. 아래는 first_snapshot이라는 이름의 스냅샷을 이용해 가상머신의 상태를 되돌리고 있다.

vagrant snapshot restore first_snapshot

생성한 스냅샷을 이용해서 상태를 복구하려면 스냅샷의 이름을 알고 있어야 한다. 스냅샷 목록을 통해 지금까지 생성된 스냅샷의 이름을 확인할 수 있다.

$ vagrant snapshot list
first_snapshot

BOOT TIMEOUT 옵션

가상머신의 부트 시간이 너무 오래 걸려서 실패하는 경우, boot_timeout 옵션을 조정해서 시간을 늘릴 수 있다.

config.vm.boot_timeout = 600

초 단위로 지정하며 기본 값은 300이다(5분).


EOF

댓글()

Vagrant - 기본

DevOps|2017. 6. 2. 19:10

윈도(Windows)를 주로 사용하지만 리눅스 환경이 필요한 경우가 많아서 Vagrant를 그간 꾸준히 사용해 왔다. 정리를 위해 Vagrant에 대한 개요와 기본 사용법을 정리해 본다.

설치

우선 Vagrant와 VirtualBox의 설치가 필요하다. 아래 주소에서 내려받아서 설치한다.

Vagrantfile 생성

vagrant init 명령을 실행하면 현재 폴더에 Vagrantfile을 생성한다. 아래와 같이 Box의 이름을 추가하면 해당 박스를 사용하는 Vagrantfile을 생성한다.

vagrant init bento/centos-7.3

이렇게 생성한 Vagrantfile에는 다량의 주석이 포함되어 있어서 이 주석만 잘 읽어봐도 기본적인 설정 방법을 아는데 무리가 없다.

Box 검색

원하는 리눅스 배포본과 버전의 Box를 아래 주소에서 검색할 수 있다.

각 리눅스 배포본 제공자의 오피셜 박스를 사용하는게 안전하다. 다만 CentOS의 경우는 Bento 프로젝트에서 제공하는 박스도 많이 사용하는 것 같다.

Vagrant machine 생성

vagrant up

위 명령을 Vagrantfile이 있는 폴더에서 실행하면 가상 머신이 생성된다.

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'bento/centos-7.3'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'bento/centos-7.3' is up to date...
==> default: Setting the name of the VM: Documents_default_1496384515554_86818
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Remote connection disconnect. Retrying...
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Mounting shared folders...
    default: /vagrant => C:/Users/daniel/vagrant-test

Vagrant machine에 SSH로 접속

vagrant ssh

위 명령을 Vagrantfile이 있는 폴더에서 실행하면 vagrant 사용자로 가상 머신에 SSH로 접속이 된다.
PuTTY 등의 SSH 클라이언트로 접속하려면 127.0.0.1:2222에 vagrant로 접속하면 된다. 암호 또한 vagrant다. 2222 포트로 접속하는 이유는 기본으로 가상 머신의 22 포트와 호스트 머신의 2222 포트가 port forwarding 방식으로 연결되어 있기 때문이다. 이미 다른 가상 머신이 2222 포트를 사용 중이면 다른 포트가 자동으로 할당되며, 이는 실행 로그를 통해 알아내면 된다.

Vagrant machine을 다루는 기본 명령

삭제(terminate)

vagrant destroy

정지(shutdown, poweroff)

vagrant halt

가상 머신을 끈다.

재시작(reboot, halt and up)

vagrant reload

가상 머신을 재시작한다. 정지 후 시작하는 것과 동일하다.

일시 중지(suspending)

vagrant suspend

현재의 동작 상태를 저장한 상태로 정지한다. 다시 시작하면 부팅 과정 없이 저장한 지점에서 바로 시작한다.

다시 시작(resume)

vagrant resume

일시 중지 상태의 가상 머신을 이전 지점에서 다시 시작한다.

상태 확인(status)

vagrant status

가상 머신의 상태를 확인한다. 정지 상태면 poweroff로 표시되고 정상 동작 중이면 running으로 표시된다.


EOF

댓글()

Vagrant 공유 폴더 문제(mount.vboxsf 관련) - vagrant-vbguest 플러그인

DevOps|2017. 5. 29. 19:43

Vagrant를 이용해 apache brooklyn을 학습하던 중에 갑자기 brooklyn 서버가 동작을 안하는 문제가 생겼습니다. 최초로 VM을 생성했을 때는 마운트에 문제가 없었는데 재부팅을 하면 문제가 생깁니다.

이런저런 방법으로 추적해 봤더니 결국 Vagrant 혹은 VirtualBox에서 발생한 오류 때문이더군요.

brooklyn 서버의 /vagrant로 마운트되는 VirtualBox 공유 폴더가 마운트 안되는 문제인데, 아래와 같은 오류 메시지가 출력됩니다.

==> brooklyn: Mounting shared folders...
    brooklyn: /vagrant => G:/workspace/apache-brooklyn-0.11.0-vagrant
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant

The error output from the command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

구글링을 해보니, VirtualBox Guest Additions 설치에 문제가 있어서 그런 것 같습니다. 여러 가지 시도를 해봤는데 결국 vagrant-vbguest 플러그인을 설치해서 해결했습니다.

vagrant-vbguest 플러그인은 guest machine과 VirtualBox host의 Guest Additions 버전이 다를 경우에 알맞은 버전을 설치해 주는 플러그인입니다.


   vagrant-vbguest 플러그인 설치

아래의 명령으로 설치합니다.

$ vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Installed the plugin 'vagrant-vbguest (0.14.2)'!

이미 생성한 box에 적용하려면 아래의 명령으로 수동으로 설치할 수 있습니다.

$ vagrant vbguest

Guest Additions가 설치된 후 vagrant reload 명령으로 vagrant machine 재시작하니까 공유 폴더가 제대로 마운트되는 것을 실행 로그에서 확인할 수 있었습니다.

지금까지 Vagrant를 사용하면서 Guest Additions 설치에 대해서 고민한 적이 없었는데, 관련 문제를 vagrant-vbguest를 통해 해결하면서 수행 로그를 보니, 꽤 수고스러운 작업을 대신 해 주는 고마운 플러그인이네요. 어쩌면 필수 플러그인이 아닐까 싶습니다.


EOF


댓글()