Nomad on Windows
Nomad on Windows
Nomad를 Windows환경에 구성하고 실행을위해 서비스로 등록하는 방법을 알아봅니다. 솔루션 실행 환경 또는 운영/개발자의 익숙함 정도에 따라 다양한 OS를 선택하여 애플리케이션을 배포하게 됩니다. Nomad를 통해 배포를 위한 오케스트레이터를 Windows 환경에 적용하고 서비스에 등록하여 상시적으로 실행될 수 있도록하는 구성을 안내합니다.
Port 구성
참고 url : Port used
Nomad는 서버와 클라이언트 모드로 나뉩니다. 서버를 위해서는 3 개의 포트가 필요하고 클라이언트에서는 2 개의 포트가 필요합니다. 클라이언트에 배포되는 애플리케이션에서 사용하는 포트를 동적으로 할당하는 영역을 구성합니다.
종류 | 기본값 | 프로토콜 | 설명 |
---|---|---|---|
HTTP API | 4646 | TCP | 서버와 클라이언트에서 HTTP API를 제공하는데 사용됩니다. |
RPC | 4647 | TCP | 서버와 클라이언트간의 내부. RPC 통신 및 서버간 통신에 사용됩니다. |
Serf WAN | 4648 | TCP/UDP | 서버간 LAN/WAN 으로 GOSSIP 프로토콜로 사용됩니다. |
Dynamic | 1025–60000 | TCP/UDP | 클라이언트에서 사용할 동적 포트를 할당합니다. |
Windows에서의 동적포트 설명은 다음을 참고합니다. : Ephemeral_port
Windows에서의 동적포트 설정은 다음을 참고합니다. : default-dynamic-port-range-tcpip-chang
디렉토리 구성
디렉토리 구성의 예는 아래와 같습니다.
└── Nomad
├── bin
├── config
└── data
- bin : Nomad 실행 바이너리 파일을 다운로드하여 별도 관리하는 경우 활용할 수 있습니다. 시스템 전체에서 사용하는 경우 해당 경로를
PATH
로 등록 하거나C:\WINDOWS\system32\
의 경로에 바이너리를 위치시키는 방법도 있습니다. - config : Nomad에서 사용하는 config 파일을 저장하는 위치로 사용합니다.
- data : Nomad가 서버 또는 클라이언트로 사용되는 경우 기록, 저장되는 데이터 저장소로 사용됩니다.
설치
설치 참고 url : Install
Dev모드 참고 url : Get Start
Windows에 설치하는 방식은 수동, Chocolatey, 컴파일 방식을 지원합니다. 여기서는 수동 구성 방법에 대해 설명합니다.
미리 컴파일된 바이너리 파일은 다음의 경로에서 확인할 수 있습니다. 2021년 4월 18일 기준 1.0.4 버전이 최신 버전입니다.
- 다운로드 url : Releases HashiCorp - Nomad
- 오픈소스는
nomad_<버전>
으로 표기됩니다. - 엔터프라이즈는
nomad_<버전>+ent
로 표기됩니다.
- 오픈소스는
- Windows 환경을 위해 미리 컴파일된 바이너리는 32bit/64bit 로 구분됩니다.
- nomad_<버전>_windows_386.zip - 32bit
- nomad_<버전>_windows_amd64.zip - 64bit
릴리즈 된 zip을 다운로드 받고 적절한 위치에 압축을 해제 합니다. 위 디렉토리 구성 에서의 예로는 bin
디렉토리 아래 위치 시킵니다.
Nomad 버전을 확인하여 바이너리가 정상적으로 실행되는지 확인합니다.
PS C:₩hashicorp₩nomad₩bin> ./nomad.exe version
Nomad v1.0.4 (9294f35f9aa8dbb4acb6e85fa88e3e2534a3e41a)
Dev 모드로 실행하여 테스트 하는것도 가능합니다.
PS C:₩hashicorp₩nomad₩bin> ./nomad agent -dev
==> No configuration files loaded
==> Starting Nomad agent...
==> Nomad agent configuration:
Advertise Addrs: HTTP: 127.0.0.1:4646; RPC: 127.0.0.1:4647; Serf: 127.0.0.1:4648
Bind Addrs: HTTP: 127.0.0.1:4646; RPC: 127.0.0.1:4647; Serf: 127.0.0.1:4648
Client: true
Log Level: DEBUG
Region: global (DC: dc1)
Server: true
Version: 1.0.4
==> Nomad agent started! Log data will stream in below:
...생략...
실행 후 나열된 정보를 사용하여 UI에 접속해봅니다.
설정
설정 설명 url : Configuration
go_sockaddr_template : go-sockaddr
Nomad 실행시 CLI 상에 설정을 하는 Inline 방식과 설정파일을 지정하는 방식으로 구성이 가능합니다. 여기서는 구성파일을 지정하도록 하는 방식을 설명합니다.
설정 파일을 디렉토리 구성에서 지정한 config
디렉토리에 위치 시킵니다. 여기서는 예로 nomad.hcl
이라 명명합니다. 테스트를 위한 몇가지 설정요소를 아래에 설명합니다.
[nomad.hcl]
datacenter = "dc1"
data_dir = "C:\\hashicorp\\nomad\\data"
bind_addr = "0.0.0.0"
advertise {
// http = "{{ GetInterfaceIP \"Network 1\" }}"
rpc = "{{ GetInterfaceIP \"Network 1\" }}"
serf = "{{ GetInterfaceIP \"Network 1\" }}"
}
server {
enabled = true
bootstrap_expect = 1
}
client {
enabled = true
network_interface = "Network 2"
meta {
subject = "server1"
purpose = "test,sample"
}
options = {
driver.raw_exec.enable = "1"
}
}
server_join {
retry_join = ["{{ GetInterfaceIP \"Network 1\" }}:4647"]
}
- datacenter : Nomad의 클러스터는
datacenter
로 클러스터의 클라이언트들을 그룹화 할 수 있습니다. Nomad에 배포하는 대상으로 지정됩니다. 기본값은dc1
입니다. - data_dir : Nomad에서 생성하는 데이터 디렉토리 위치를 지정합니다. 위 디렉토리 구성에서 지정한
data
디렉토리를 지정하였습니다.- Windows 환경에서 디렉토리 구분자는
\\
를 사용합니다.
- Windows 환경에서 디렉토리 구분자는
- bind_addr : nomad의 http, rpc, serf가 사용할 기본 ip 주소를 지정합니다. 실행 환경의 모든 IP와 매핑하기 위해
0.0.0.0
으로 설정하였습니다. - advertise : 생략하는 경우
bind_addr
값을 상속 받지만, 사용자가 지정한 네트워크 주소를 지정하기 위해 사용됩니다. ip 형식을 사용할 수도 있고 go-sockaddr 템플릿 구성을 사용 가능하기 때문에 템플릿 형태로 지정도 가능합니다. 예제에서는 네트워크 인터페이스에 할당된 IP를 가져오는 방식 입니다. 한글도 지원합니다.{{ GetInterfaceIP \"이더넷 1\" }}
- server : 서버인 경우에 설정을 구성하는 항목 입니다.
- enabled :
true
인 경우 서버 모드로 실행됩니다. - bootstrap_expect : 서버의 HA를 위해 3중화 또는 5중화 하는 경우 서버의 기대 개수 값을 넣습니다. 여기서는 하나의 Nomad 프로세스가 서버와 클라이언트 역할을 모두 수행합니다.
- enabled :
- client : 클라이언트인 경우에 설정을 구성하는 항목 입니다.
- enabled :
true
인 경우 클라이언트 모드로 실행됩니다. - network_interface : Nomad 클라이언트에서 실행하는 애플리케이션이 할당되는 네트워크 인터페이스가 Nomad 프로세스와 다른 네트워크를 사용하는 경우 해당 네트워크 인터페이스 이름을 지정 합니다.
- meta : 배포할 조건을 사용자 정의하는 항목입니다. Label 이나 Tag와 비슷한 역할입니다. map 타입으로 여러줄을 나열하여 설정할 수 있습니다. 값은 쉼표로 구분하여 리스트처럼 사용할 수 있습니다.
- options : 클라이언트 구성의 옵션을 지정합니다. 주로 실행 드라이버와 배포를 위한 설정을 위해 사용됩니다.
- enabled :
- server_join : 서버와 클라이언트 구성의 경우, 또는 서버 HA 구성의 경우 서버 접속을 위한 주소를 나열합니다.
실행과 서비스 등록
구성파일을 작성하였다면, 해당 구성파일을 지정하여 Nomad를 실행할 수 있습니다.
PS C:₩hashicorp₩nomad₩bin> ./nomad agent -config=C:\hashicorp\nomad\config\nomad.hcl
Windows 서비스로 등록하는 경우 다음을 참고합니다.
sc.exe delete nomad
sc.exe create nomad binPath= "C:\hashicorp\nomad\bin\nomad.exe agent -config=C:\hashicorp\nomad\config\nomad.hcl" start= auto
net start nomad
테스트
Job 구성 url : Manage-job
Windows에서만 실행되는 커맨드를 활용하여 동작을 테스트 합니다.
[test.nomad]
job "test" {
datacenters = ["dc1"]
type = "batch"
constraint {
attribute = "${attr.kernel.name}"
value = "windows"
}
group "windows" {
count = 1
task "systeminfo" {
driver = "raw_exec"
config {
command = "C:\\windows\\system32\\systeminfo"
}
}
}
}
- job : job 이름을 명시 합니다.
- datacenters : 해당 job을 배포할 대상 datacenter를 지정합니다. list 타입인 이유는 Enterprise에서는 멀티 DC 배포를 지원하기 때문입니다.
- type : Nomad가 지원하는 배포 애플리케이션 타입은 batch, service, system 입니다.
- batch : 지속되지 않는 1회성 작업에 대한 타입으로 반복적 작업과 파라메터를 받는 형식도 지원합니다.
- service : 지속되는 작업, 예를들어 웹서버와 같은 형식의 애플리케이션 실행 타입을 지원합니다.
- system : 전체 클라이언트에서 실행될 애플리케이션 실행 타입을 지원합니다. 예를들어 모니터링을 위해 모든 클라이언트에서 실행되어야하는 경우에 활용합니다.
- constraint : job이 배포될 조건을 지정하는 것으로 반복적으로 구성가능합니다.
- group : job에서 함께 실행될 단위를 지정합니다. task가 여럿 할당될 수 있습니다.
- count : group에서 실행되는 배포의 개수를 지정합니다.
- task : 실제 동작하는 배포 형식을 정의 합니다.
- driver : task로 실행할 배포 형태 드라이버를 지정합니다. 대표적으로 exec, raw_exec, java, docker 등이 있습니다.
- config :
driver
의 실행을위한 구성을 정의합니다. 예제에서는raw_exec
를 사용하였으므로command
를 입력합니다.
job의 내용은 파일로 구성하여 CLI로 등록하는 것도 가능하고 UI에서 입력하는 것도 가능합니다. UI등록의 예는 다음과 같습니다.
UI의 좌측
Jobs
를 클릭하여 우측 상단의Run Job
버튼을 클릭합니다.Job Definition
란에 job 정의를 채우고Plan
을 클릭합니다.Plan의 결과를 확인하고
Run
버튼으로 배포를 실행합니다.배포의 결과를 확인합니다.
- 배포에 실패하면 붉은색으로 표기되며,
Task Groups
의 task 이름을 클릭하면 원인을 확인할 수 있습니다. - 정상 배포되면
Running
상태로 확인됩니다.batch
의 경우 실행 후 종료되기 때문에 최종적으로Complete
상태가 됩니다. - 해당 task를 선택하고 마지막
Allocation
항목을 클릭하면 마지막 실행 task를 확인할 수 있고, 원격에서 실행된Log
나 생성된File
을 확인할 수 있습니다.
- 배포에 실패하면 붉은색으로 표기되며,
마치며
Windows 환경에 실행되는 애플리케이션을 원격에서 일괄적으로 관리하기위한 환경을 제공합니다. CI/CD 과정에서 마지막 단계인 배포 동작에 대해 API를 지원하고 스케쥴링 및 배포의 상태를 관리해주는 역할로 동작합니다. Batch, Service, System 의 배포 실행 형태를 지정할 수 있고, 다양한 실행 드라이버(exec, java, docker, 등)을 지원하여 다중의 OS 환경 및 온프레미스와 클라우드 환경 전반에 배포를 위한 쉽고 간단한 워크로드 오케스트레이션 환경을 구성할 수 있습니다.