- AWS에 EFS를 Nomad CSI로 활용
- full code는 아래 github를 참고
- 참고 github: https://github.com/Great-Stone/nomad-demo-with-ecs
- branches: ung
- 참고 github: https://github.com/Great-Stone/nomad-demo-with-ecs
docker 런타임에는 log driver로 "awslogs"를 지원합니다.
https://docs.docker.com/config/containers/logging/awslogs/
팁
Nomad에서 docker 자체의 로깅을 사용하므로서, Nomad에서 실행되는 docker 기반 컨테이너의 로깅이 특정 환경에 락인되는것을 방지합니다.
Nomad Version : >= 1.0.0
Nomad Ent. Version : >= 0.7.0
https://learn.hashicorp.com/tutorials/nomad/namespaces
Namespace 생성
$ nomad namespace apply -description "PoC Application" apps
팁
해당 Token의 policy는 특정인이 원하여 만들었으며, 더 다양한 제약과 허용을 할 수 있습니다. 해당 policy는 아래와 같은 제약과 허용을 합니다.
- UI에서 exec(job에 접근) 제한
- 그 외에 job, node, volume, server등의 모든 화면 읽어오기
Nomad cli
#원하는 권한이 있는 policy file
$ cat nomad-ui-policy.hcl
namespace "*" {
policy = "read"
capabilities = ["submit-job", "dispatch-job", "read-logs", "list-jobs", "parse-job", "read-job", "csi-list-volume", "csi-read-volume", "list-scaling-policies", "read-scaling-policy", "read-job-scaling", "read-fs"]
}
node {
policy = "read"
}
host_volume "*" {
policy = "write"
}
plugin {
policy = "read"
}
#위에서 만든 policy 파일을 nomad cluster에 적용
$ nomad acl policy apply -description "Production UI policy" prod-ui nomad-ui-policy.hcl
#해당 policy로 token생성(policy는 여러개를 넣을 수도 있음)
$ nomad acl token create -name="prod ui token" -policy=prod-ui -type=client | tee ui-prod.token
#웹 브라우저 로그인을 위해 Secret ID 복사
팁
공식 사이트에 consul 인증서 생성 가이드는 있는데 Nomad 인증서 생성가이드는
Show Terminal을 들어가야 볼 수 있기때문에 귀찮음을 해결하기 위해 공유합니다.
Nomad 인증서 생성
consul tls ca create -domain=nomad -days 3650
consul tls cert create -domain=nomad -dc=global -server -days 3650
consul tls cert create -domain=nomad -dc=global -client -days 3650
consul tls cert create -domain=nomad -dc=global -cli -days 3650
팁
최대한 설정값을 넣어보고, 번역기도 돌려보고 물어도 보고 넣은 server설정 파일입니다.
네트워크는 프라이빗(온프레이머스) 환경입니다.
#nomad server 설정
server {
enabled = true
bootstrap_expect = 3
license_path="/opt/nomad/license/nomad.license"
server_join {
retry_join = ["172.30.1.17","172.30.1.18","172.30.1.19"]
}
raft_protocol = 3
event_buffer_size = 100
non_voting_server = false
heartbeat_grace = "10s"
}
#tls 설정
tls {
http = true
rpc = true
ca_file = "/opt/ssl/nomad/nomad-agent-ca.pem"
cert_file = "/opt/ssl/nomad/global-server-nomad-0.pem"
key_file = "/opt/ssl/nomad/global-server-nomad-0-key.pem"
#UI오픈할 서버만 변경
verify_server_hostname = false
verify_https_client = false
#일반서버는 아래와 같이 설정
verify_server_hostname = true
verify_https_client = true
}
팁
최대한 설정값을 넣어보고, 번역기도 돌려보고 물어도 보고 넣은 Client설정 파일입니다.
네트워크는 프라이빗(온프레이머스) 환경입니다.
#nomad client 설정
client {
enabled = true
servers = ["172.30.1.17","172.30.1.18","172.30.1.19"]
server_join {
retry_join = ["172.30.1.17","172.30.1.18","172.30.1.19"]
retry_max = 3
retry_interval = "15s"
}
#host에서 nomad에서 사용할 수 있는 volume 설정
host_volume "logs" {
path = "/var/logs/elk/"
read_only = false
}
#각각의 client의 레이블 작성
#meta {
# name = "moon"
# zone = "web"
#}
#nomad에서 예약할 자원
reserved {
#Specifies the amount of CPU to reserve, in MHz.
cpu = 200
#Specifies the amount of memory to reserve, in MB.
memory = 8192
#Specifies the amount of disk to reserve, in MB.
disk = 102400
}
no_host_uuid = true
#bridge network interface name
bridge_network_name = "nomad"
bridge_network_subnet = "172.26.64.0/20"
cni_path = "/opt/cni/bin"
cni_config_dir = "/opt/cni/config"
}
#tls 설정
tls {
http = true
rpc = true
ca_file = "/opt/ssl/nomad/nomad-agent-ca.pem"
cert_file = "/opt/ssl/nomad/global-client-nomad-0.pem"
key_file = "/opt/ssl/nomad/global-client-nomad-0-key.pem"
verify_server_hostname = true
verify_https_client = true
}
팁
최대한 설정값을 넣어보고, 번역기도 돌려보고 물어도 보고 넣은 server, client의 공통설정 파일입니다.
저는 agent.hcl파일안에 다 넣고 실행하지만 나눠서 추후에는 기능별로 나눠서 사용할 예정입니다.
#nomad 공통 설정
datacenter = "dc1"
region = "global"
data_dir = "/opt/nomad/nomad"
bind_addr = "{{ GetInterfaceIP `ens192` }}"
advertise {
# Defaults to the first private IP address.
#http = "{{ GetInterfaceIP `ens244` }}"
#rpc = "{{ GetInterfaceIP `ens244` }}"
#serf = "{{ GetInterfaceIP `ens244` }}"
http = "{{ GetInterfaceIP `ens192` }}"
rpc = "{{ GetInterfaceIP `ens192` }}"
serf = "{{ GetInterfaceIP `ens192` }}"
}
consul {
address = "127.0.0.1:8500"
server_service_name = "nomad"
client_service_name = "nomad-client"
auto_advertise = true
server_auto_join = true
client_auto_join = true
#consul join용 token
token = "33ee4276-e1ef-8e5b-d212-1f94ca8cf81e"
}
enable_syslog = false
enable_debug = false
disable_update_check = false
log_level = "DEBUG"
log_file = "/var/log/nomad/nomad.log"
log_rotate_duration = "24h"
log_rotate_bytes = 104857600
log_rotate_max_files = 100
ports {
http = 4646
rpc = 4647
serf = 4648
}
#prometheus에서 nomad의 metrics값을 수집 해 갈 수 있게 해주는 설정
telemetry {
collection_interval = "1s"
disable_hostname = true
prometheus_metrics = true
publish_allocation_metrics = true
publish_node_metrics = true
}
plugin "docker" {
config {
auth {
config = "/root/.docker/config.json"
}
#온프레이머스환경에서는 해당 이미지를 private repository에 ㅓㄶ고 변경
infra_image = "google-containers/pause-amd64:3.1"
}
}
acl {
enabled = true
}
Job의 Consul Namespace 정의
Consul Enterprise는 Namespace
가 있어서 Nomad로 Consul에 서비스 등록 시 특정 Namespace를 지정할 수 있음
Job > Group > Consul
job "frontback_job" {
group "backend_group_v1" {
count = 1
consul {
namespace = "mynamespace"
}
service {
name = "backend"
port = "http"
connect {
sidecar_service {}
}
check {
type = "http"
path = "/"
interval = "5s"
timeout = "3s"
}
}
# 생략
- nomad에서 외부 storage를 사용하기 위한 plugin
- 그 중에서도 접근성이 좋은 nfs를 사용, public cloud에서 제공하는 storage와는 사용법이 다를 수 있음
- 구성환경은 아래와 같다.(사실 nfs server정보만 보면 될 거 같음)
- nfs-server 10.0.0.151:/mnt/data
controller
- 하나이상의 node에 storage를 배포할 수 있게 해주는 중앙관리 기능
- 어느 node(client)에 띄어져도 상관없다.