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

댓글()

외부에서 Kubernetes API(apiserver) 접근

Kubernetes|2017. 9. 4. 20:58

앞선 글(Vagrant에 Kubernetes 클러스터 구성하기)에서는 Vagrant 환경에 k8s 클러스터를 구성해 봤는데, 이 클러스터를 사용해서 뭔가(?) 하려고 하니 한 가지 문제가 생겼다.
Minikube 처럼 kubectl을 다운로드 받기만 해서는 API를 사용할 수 없다는 것이다. 즉 호스트인 내 랩탑에서 kubectl을 통해서 명령을 내릴 수가 없다.

물론 master에는 친절하게 kubectl 이 이미 설치되어 있기 때문에 ssh로 master에 접속하여 명령을 내리면 되긴한다.
하지만 내가 하려는 것은 자바로 짠, 랩탑에서 동작하는 프로그램을 통해서 k8s API를 사용하려는 것이다. 따라서 외부에서 k8s 클러스트에 접속하는 방법을 알아내야 했다.

본인이 무엇을 필요로 하는지 아는 성격 급한 분은 첨부 파일을 받아 보거나 글 말미를 보시길.

웹 애플리케이션을 만들고 있기 때문에 먼저 OAuth 토큰을 이용하는 방식을 시도해 봤는데, 자바 키스토어(java keystore)에 인증 정보를 심어줘야 하는 귀찮은 문제가 있었다. 너무 샛길로 빠지는 내용이고, 내 수준으로는 보안에 대해서 자세히 설명하기도 힘들어서 일단 OAuth는 생략한다.

다음으로 시도한 방법은 k8s에서 사용하는 인증서를 랩탑으로 가져와서 사용하는 것이다.
사실 앞서 vagrant 기반으로 클러스터를 구축했다면 이미 클론한 kubernetes-vagrant-coreos-cluster 프로젝트 디렉토리 하위의 artifacts/tls 디렉토리에 필요한 파일이 이미 있기 때문에 이를 사용하면 된다.
다른 클러스터에 접근하려는 것이라면 해당 클러스터의 master에서 certificate-authorityclient-certificateclient-key 에 해당하는 파일을 다운로드 받으면 된다.

아래 명령을 실행하면 위에 언급한 것들이 무엇인지 자세한 설명이 나온다.

    $ kubectl options --help
    The following options can be passed to any command:

          --certificate-authority='': Path to a cert file for the certificate authority
          --client-certificate='': Path to a client certificate file for TLS
          --client-key='': Path to a client key file for TLS

즉 인증기관에서 발급한 인증서와 TLS의 클라이언트 인증서, TLS의 클라이언트 키가 필요한 것이다. 파일명은 환경에 따라 다를 수 있는데 앞서 구축한 vagrant 클러스터에서는 순서대로 ca.pem, admin.pem, admin-key.pem 파일을 사용하면 된다.

설명은 길었지만 답은 간단하다. 아래의 내용을 복사한 후, %USERPROFILE%\.kube 디렉토리에 config 라는 이름의 파일을 만들고 그 내용으로 넣으면 된다.
주의할 점은 각 파일(파일 3개)의 경로와 server 항목의 IP 주소는 본인의 환경에 맞게 수정해야 한다.
좀 더 부연하자면 윈도(windows) 사용자 계정이 kim 이라면 C:\Users\kim\.kube\config 파일에 아래 내용을 넣는 것이다.

    apiVersion: v1
    clusters:
    - cluster:
        certificate-authority: C:\workspace\kubernetes-vagrant-coreos-cluster\artifacts\tls\ca.pem
        server: https://172.17.8.101:443
      name: default
    contexts:
    - context:
        cluster: default
        user: default
      name: default
    current-context: default
    kind: Config
    preferences: {}
    users:
    - name: default
      user:
        client-certificate: C:\workspace\kubernetes-vagrant-coreos-cluster\artifacts\tls\admin.pem
        client-key: C:\workspace\kubernetes-vagrant-coreos-cluster\artifacts\tls\admin-key.pem

혹 필요할지도 몰라서 config 파일은 따로 첨부한다.

config



EOF



댓글()