কম্পিউটার টিউটোরিয়াল

Vagrant এবং CoreOS দিয়ে ক্লাস্টার সেটআপ ও নেটওয়ার্কিং অপ্টিমাইজ করুন

좀 더 따뜻해지고 있습니다. 며칠 전, 저는 VirtualBox, KVM 및 기타 소위 더 복잡한 소프트웨어에 대한 멋지고 깔끔한 래퍼를 목표로 하는 가상화 솔루션인 Vagrant를 선보였습니다. 또한 Docker 컨테이너 지원과 클라우드 서버 환경을 제공함으로써 시니어 리그에서 활약합니다.

이 모델을 확장하여, 우리는 매우 클라우드적인 약간 다른 사용 사례를 논의할 것입니다. 이전 연습에서 사용한 CoreOS는 클라우드 열풍을 이용하려는 또 다른 플레이어이며, 매우 깔끔한 클러스터 기능과 자동화를 제공합니다. 오늘 우리는 클러스터를 구축하는 방법과 네트워킹 부분에 대해 배울 것입니다. 이 부분은 다소 소홀히 다루어졌으며, 원래 문서에서도 잘 설명되지 않았습니다. 저를 따라오세요.

디스커버리 토큰 설정

지난번에는 Windows에서 PowerShell을 통해 Vagrant를 의도적으로 테스트하여 다양한 방법으로 수행할 수 있음을 보여주기 위한 샘플을 제공했지만, 현재 연습은 Linux, 정확히는 Xubuntu Vivid에서 진행될 것입니다.

공식 가이드를 따라 CoreOS를 Vagrant용으로 설정하는 것은 그리 어렵지 않지만, 온라인 레퍼런스가 말하는 것만큼 사소하지도 않습니다. 시작하려는 명백한 조급함이 드러납니다.

저장소를 클론한 후, Vagrant를 초기화하고 시작하기 위해 약간 편집해야 하는 여러 파일을 갖게 됩니다. 가장 먼저 해야 할 일은 user-data.sample 파일을 편집하고 user-data로 이름을 바꾸는 것입니다. 가장 주목할 점은 토큰 부분입니다:

#cloud-config

coreos:
etcd:
# https://discovery.etcd.io/new?size=3에서 각 고유 클러스터에 대한 새 토큰 생성
# ?size=X로 클러스터의 초기 크기 지정
# 경고: 'vagrant destroy'할 때마다 교체
discovery: https://discovery.etcd.io/<token>

기본적으로 CoreOS는 고유 식별자인 토큰을 사용하여 실행 중인 인스턴스들이 서로를 식별하도록 돕습니다. 동일한 토큰을 가진 모든 호스트는 동일한 스웜에 속하므로, etcd 공유 구성 및 디스커버리 서비스를 사용하여 중앙에서 제어할 수 있습니다.

https://discovery.etcd.io/new?size=<size>

위 URL로 이동하여 원하는 클러스터 크기를 지정하여 직접 생성하거나 새 토큰을 생성할 수 있습니다. 기본 구성은 세 개의 호스트입니다. 생성된 토큰을 적어두고 구성 파일에 추가합니다. 예:

https://discovery.etcd.io/21e4099c23b52a8403640c2d48cdca6f

이것이 왜 중요한지 나중에 알게 될 것입니다.

클러스터 설정

두 번째는 Vagrant가 시작될 때 실행할 CoreOS 인스턴스 수를 정의하는 것입니다. 이는 전반적으로 간단한 구성입니다. 변경 사항은 클론된 Git 디렉토리 내의 config.rb.sample 파일에 추가하고 config.rb로 이름을 바꿔야 합니다. 우리는 독특하고 특별하게 네 개의 인스턴스로 시도해 보겠습니다.

# Vagrant가 생성하는 CoreOS 클러스터의 크기
$num_instances=X

클러스터 시작

이제 Vagrant를 실행할 수 있습니다. 온라인 저장소를 클론했다면 현재 디렉토리에 기본 Vagrant 구성 파일이 이미 있으므로, vagrant init을 시도하면 실패해야 합니다:

vagrant init
`Vagrantfile` already exists in this directory. Remove it before
running `vagrant init`.

VirtualBox나 기타 관련 가상화 소프트웨어가 설치되어 있지 않다면 프로그램을 시작하려고 할 때 또 다른 오류가 발생합니다. 미리 이러한 사소한 문제들을 해결하세요.

vagrant up
The provider 'virtualbox' that was requested to back the machine
'core-01' is reporting that it isn't usable on this system. The
reason is shown below:

Vagrant could not detect VirtualBox! Make sure VirtualBox is properly installed. Vagrant uses the `VBoxManage` binary that ships with VirtualBox, and requires this to be available on the PATH. If VirtualBox is installed, please find the `VBoxManage` binary and add it to the PATH environmental variable.

이 부분을 성공적으로 수행했다면, Vagrant가 시작되어 CoreOS 인스턴스를 하나씩 생성할 것입니다. 이는 시간이 걸릴 수 있으며, 더 큰 클러스터를 수용하기 위해 좋은 네트워크 대역폭과 충분한 메모리가 필요합니다.

vagrant up
Bringing machine 'core-01' up with 'virtualbox' provider...
Bringing machine 'core-02' up with 'virtualbox' provider...
Bringing machine 'core-03' up with 'virtualbox' provider...
Bringing machine 'core-04' up with 'virtualbox' provider...
==> core-01: Box 'coreos-alpha' could not be found. Attempting to find and install...
core-01: Box Provider: virtualbox
core-01: Box Version: >= 308.0.1

==> core-04: Importing base box 'coreos-alpha'...
==> core-04: Matching MAC address for NAT networking...
==> core-04: Checking if box 'coreos-alpha' is up to date...
==> core-04: Setting the name of the VM: coreos-vagrant_core-04_1431799934824_55775
==> core-04: Fixed port collision for 22 => 2222. Now on port 2202.
==> core-04: Clearing any previously set network interfaces...
==> core-04: Preparing network interfaces based on configuration...
core-04: Adapter 1: nat
core-04: Adapter 2: hostonly
==> core-04: Forwarding ports...
core-04: 22 => 2202 (adapter 1)
==> core-04: Running 'pre-boot' VM customizations...
==> core-04: Booting VM...
==> core-04: Waiting for machine to boot. This may take a few minutes...
core-04: SSH address: 127.0.0.1:2202
core-04: SSH username: core
core-04: SSH auth method: private key
core-04: Warning: Connection timeout. Retrying...
==> core-04: Machine booted and ready!
==> core-04: Setting hostname...
==> core-04: Configuring and enabling network interfaces...
==> core-04: Running provisioner: file...
==> core-04: Running provisioner: shell...
core-04: Running: inline script

모든 시스템이 생성되면, 기존 머신들과 현재 상태에 대한 모든 정보를 얻기 위해 vagrant status를 실행할 수 있습니다.

네트워킹

이제 진짜 재미있는 부분이 옵니다. 우리는 네 개의 가상 머신을 가지고 있습니다. 하지만 어떻게 그것들에 연결할까요? 우리는 Docker를 테스트할 때 비슷한 딜레마에 직면했지만, 우리는 해결책을 찾았고, 여기에서도 동일한 논리가 적용됩니다.

첫째, vagrant ssh 명령어를 사용하여 실행 중인 각 머신에 연결할 수 있습니다. 이는 모든 키 등을 처리해 줍니다. 이 명령어는 클론된 디렉토리에서 실행해야 하며, 그렇지 않으면 오류가 발생합니다:

vagrant ssh core-02 -- -A
A Vagrant environment or target machine is required to run this
command. Run `vagrant init` to create a new Vagrant environment. Or, get an ID of a target machine from `vagrant global-status` to run this command on. A final option is to change to a directory with a Vagrantfile and to try again.

하지만 올바른 디렉토리에서 실행하면 잘 작동해야 합니다:

ifconfig를 실행하면 모든 머신이 동일한 IP 주소를 가지고 있는 것처럼 보이고, 그들 사이에 라우팅할 수 없다는 것을 알 수 있습니다. 게다가 VirtualBox 인터페이스는 172.0.0.1 세그먼트에서 실행되므로 상황을 조금 더 어렵게 만듭니다. 다시 말하지만, Docker에서 겪었던 것과 유사합니다.

VirtualBox 내부 네트워킹 범위를 사용하고 방화벽 규칙과 라우팅을 조정할 수 있습니다. 그러나 이 방법은 어느 가상 머신이 어떤 특정 IP 주소를 사용하는지 알려주지 않으며, 즉석에서 쉽게 결정할 수도 없습니다. 즉, 이 숫자들을 무에서 파싱해 낼 수 없으며, 올바른 정보를 얻는 더 우아한 방법들이 있습니다.

로컬호스트를 통해 연결

기억하시겠지만, 시작하는 동안 Vagrant는 각 가상 머신의 SSH를 로컬호스트에서 실행하도록 설정했으며, 2200(또는 유사)부터 시작하는 다른 포트를 사용합니다. 따라서 클라이언트에 SSH로 접속해야 한다면 이 옵션을 사용할 수 있습니다:

ssh 127.0.0.1 -p 2202
The authenticity of host '[127.0.0.1]:2202 ([127.0.0.1]:2202)' can't be established.
ED25519 key fingerprint is 32:a0:57:58:b3:55:fc:03:c8:89:7d:7c:cc:6f:85:9d.
Are you sure you want to continue connecting (yes/no)?

IP 주소를 통해 어디서든 연결

그러나 위 방법은 VM 간 통신에는 작동하지 않으며, 다른 무언가가 필요합니다. 여기서 디스커버리 부분이 정말 유용해집니다. 클러스터가 실행되면, 다시 그 URL로 이동할 수 있고, 이제 그것은 유용하지만 지저분한 JSON 자료로 채워질 것입니다:


키와 값을 주목하세요. 각 항목은 IP 주소를 가지며, 예: 172.17.8.103, 이 출력에서 파싱할 수 있습니다. 훌륭합니다. 이제 내부 주소들을 알게 되었고, 이를 사용하여 클라이언트에 직접 연결할 수 있으며, 더 중요하게는 그들이 피어들과 통신하도록 허용할 수 있습니다.

하나의 작은 빠진 조각은 core 사용자의 비밀번호를 모른다는 것이므로, vagrant.d 서브 디렉토리 내에 있는 제공된 키를 사용할 것입니다. 키를 추가하면 원활하게 연결할 수 있습니다. 우리는 첫 번째 가이드에서 이 것을 보았습니다.

포트 포워딩

우리는 박스들의 구성 부분에 대해 많이 다루지 않았지만, 이 시점에서 우리는 실행 중인 인스턴스들의 IP 주소를 알게 되었으므로, 정말 창의적이 될 수 있습니다. 예를 들어, 서비스를 실행하는 가상 머신에 매우 가치 있는 포트 포워딩입니다.

필요한 변경 사항은 Vagrantfile 내부의 지시문으로 제공되어야 합니다. 여러 설정을 위한 여러 구성을 가질 수 있습니다 - Dockerfiles와 매우 유사합니다. 예를 들어, HTTPS 포트 포워딩은 다음과 같습니다:

config.vm.forward_port 443, <host port>

내 Docker 기사들을 따라오셨다면 모든 것이 매우 쉽습니다. 호스트 포트, 클라이언트 포트, 그리고 끝. 각 박스에 대해 여러 선언을 가질 수 있습니다. 그런 다음 완전한 통제가 필요하다면 수동으로 방화벽 규칙을 구성할 수도 있습니다. 다시 말하지만, 이것은 단지 티저일 뿐이며, 우리는 미래에 이것으로 더 많은 시간을 보낼 것입니다.

이제 물론, 다음 단계는 Docker를 연결하는 것이고, 아마도 우연이 아닌 유사한 기본 범위로, 클러스터, 컨테이너, 병렬 실행, 그리고 다른 멋진 개념들을 가지고 놀기 시작할 수 있습니다. 이것이 Vagrant가 플러그인과 함께 제공되는 이유이며, 우리는 별도의 기사에서 이를 논의할 것입니다. 어쨌든, 작업을 마쳤으면 인스턴스들을 파괴하면 됩니다.

추가 자료

Dedoimedo의 포지에서 온 추가 좋은 것들:

CoreOS 퀵스타트 가이드; 다소 무거울 수 있음

etcd와 다소 유사한 기능을 제공하는 supervisord 튜토리얼

KVM & VirtualBox 나란히 구성 조정

결론

Vagrant와 CoreOS는 흥미롭고, 거칠고, 반항적인 아이디어처럼 보입니다. 저는 아직 이들이 비즈니스 환경에서 얼마나 가치가 있는지 확신하지 못하지만, 실제 작업의 지저분한 세부 사항을 숨기는 래퍼 기술들이 급증하고 점점 더 인기를 얻고 있습니다. 모두 프론트엔드와 오케스트레이션 도구를 원하지만, 유일한 문제는 시장이 매우 변덕스럽고 휘발성이며, 표준이 없고, 사람들이 Python, Ruby, JSON 같은 추악한 것들을 사용한다는 것입니다. 하지만 신경 쓰지 마세요.

우리는 미지의 공포(terror incognita)의 또 다른 작은 조각을 정복했고, 당신은 Vagrant와 CoreOS에 대해 어느 정도 더 익숙해졌습니다. 좋아요, 왜냐하면 우리의 다음 조각은 이러한 클러스터 서비스 등을 가지고 놀기 시작하는 것이 될 것이기 때문입니다. 그리고 그것은 단지 시작일 뿐입니다.

기억하세요, 저는 이 모든 것을 해야 하므로, 앞으로 몇 달 동안 우리는 Fleet, Kubernetes, Mesos, Etcd, 그리고 기타 많은 멋진 프로젝트를 포함하여 거의 모든 것을 탐구할 것입니다. 또한 CoreOS와 다른 것들을 클라우드 제공업체와 연결하고, 분산 및 병렬 파일 시스템, Jenkins, Ansible 같은 자동화 도구, 여전히 더 많은 이름 떨구기와 당신이 토하고 싶게 만드는 버즈, 그리고 그 이상을 다룰 것입니다. 계속 지켜봐 주세요.

치어스.

  1. ভার্চুয়ালবক্স ব্রিজড নেটওয়ার্কিং ইস্যু: কেন বন্ধ হয় এবং কীভাবে ফিক্স করবেন

  2. VMware Workstation 14 রিভিউ: পাওয়ারফুল ফিচার, ডাম দাম

  3. উন্নত ভার্চুয়ালাইজেশনের জন্য অপরিহার্য ESXi টিপস এবং ট্রিক্স

  4. Meltdown ও Spectre: উইন্ডোজ প্যাচ কীভাবে পারফরম্যান্স ও স্থিতিশীলতা প্রভাবিত করে