멀티 리전 배포 구성하기
멀티 리전 배포 구성하기 (Configure multi-region deployments)
페더레이션된(federated) Nomad 클러스터를 사용하면 서버가 다른 리전에 있더라도 어떤 서버에서든 모든 리전을 대상으로 하는 작업을 제출할 수 있어요. 여러 리전에 배포되는 작업을 제출할 수도 있어요. 이 가이드는 구성 가능한 롤아웃 및 롤백 전략을 포함한 멀티 리전 배포를 보여줘요.
출처: 문서
본문
Enterprise: 이 기능은 Nomad Enterprise(새 탭에서 열림)가 필요해요.
아래와 같이 작업에 multiregion 스탠자를 추가해 멀티 리전 배포 작업을 만들 수 있어요.
multiregion {
strategy {
max_parallel = 1
on_failure = "fail_all"
}
region "west" {
count = 2
datacenters = ["west-1"]
}
region "east" {
count = 1
datacenters = ["east-1", "east-2"]
}
}
전제 조건 (Prerequisites)
이 가이드에 설명된 작업을 수행하려면 포트 4646, 4647, 4648이 노출된 Nomad 0.12 이상을 실행하는 두 개의 Nomad 환경이 필요해요. 이 Terraform 환경을 사용해 샌드박스 환경을 프로비저닝할 수 있어요. 이 가이드는 각 클러스터에 서버 노드 1개와 클라이언트 노드 2개가 있는 두 클러스터를 가정해요. Terraform 코드가 이미 포트 4646을 열지만, nomad server join을 실행할 서버에서 포트 4647과 4648도 노출해야 해요. 자세한 내용은 Nomad 포트 요구 사항 문서를 참조하세요.
다음으로 페더레이션 가이드에 설명된 대로 두 리전을 페더레이션해야 해요.
Note: 이 튜토리얼은 데모 목적이며 각 클러스터에 단일 서버 노드만 가정해요. 프로덕션 구성은 참조 아키텍처를 참조하세요.
nomad server members 명령을 실행해요.
$ nomad server members
클러스터를 페더레이션한 후 출력에는 두 리전의 서버가 모두 포함되어야 해요.
Name Address Port Status Leader Protocol Build Datacenter Region
ip-172-31-26-138.east 172.31.26.138 4648 alive true 2 0.12.0+ent east-1 east
ip-172-31-29-34.west 172.31.29.34 4648 alive true 2 0.12.0+ent west-1 west
ACLs를 사용한다면 토큰에 global 범위의 submit-job 권한이 있는지 확인해야 해요.
이 가이드를 시작하기 전에 업데이트 전략 가이드를 검토하는 것이 좋아요.
멀티 리전 개념 (Multi-region concepts)
페더레이션된 Nomad 클러스터는 동일한 gossip 클러스터의 멤버이지만 동일한 raft/consensus 클러스터는 아니며, 데이터 저장소를 공유하지 않아요. 멀티 리전 배포의 각 리전은 region 스탠자의 값으로 매개변수화된 독립적인 작업 사본을 얻어요. Nomad 리전은 strategy 스탠자에 의해 결정된 규칙을 사용해 각 리전의 배포를 롤아웃하기 위해 조정해요.
다양한 업데이트 전략 중 하나를 사용하는 단일 리전 배포는 running 상태에서 시작해 성공하면 successful 상태, 완료 전에 다른 배포가 대체하면 canceled 상태, 다른 이유로 실패하면 failed 상태로 끝나요. 실패한 단일 리전 배포는 update 스탠자에 auto_revert 설정이 있으면 이전 작업 버전으로 자동 롤백될 수 있어요.
멀티 리전 배포에서 리전은 pending 상태로 시작해요. 이를 통해 Nomad는 계속 진행하기 전에 모든 리전이 작업을 수락했는지 확인할 수 있어요. 이 시점에서 한 번에 최대 max_parallel개의 리전이 running으로 전환돼요. 각 리전이 로컬 배포를 완료하면 마지막 리전이 배포를 완료할 때까지 대기하는 blocked 상태로 들어가요. 마지막 리전이 리전들을 successful로 표시하기 위해 차단을 해제(unblock)해요.
멀티 리전 작업 만들기 (Create a multi-region job)
아래 작업은 두 리전에 모두 배포돼요. strategy 블록의 max_parallel 필드는 Nomad가 한 번에 하나의 리전에 배포하도록 제한해요. 두 리전 배포 중 하나라도 실패하면 두 리전 모두 실패로 표시돼요. 각 리전의 count 필드는 각 리전에 대해 보간되어 태스크 그룹 count의 count = 0을 대체해요. 작업의 update 블록은 기본 "태스크 상태" 값을 사용해 작업이 정상인지 판단해요. 헬스 체크가 있는 Consul service를 구성했다면 그것을 대신 사용할 수 있어요.
job "example" {
multiregion {
strategy {
max_parallel = 1
on_failure = "fail_all"
}
region "west" {
count = 2
datacenters = ["west-1"]
}
region "east" {
count = 1
datacenters = ["east-1", "east-2"]
}
}
update {
max_parallel = 1
min_healthy_time = "10s"
healthy_deadline = "2m"
progress_deadline = "3m"
auto_revert = true
auto_promote = true
canary = 1
stagger = "30s"
}
group "cache" {
count = 0
network {
port "db" {
to = 6379
}
}
task "redis" {
driver = "docker"
config {
image = "redis:6.0"
ports = ["db"]
}
resources {
cpu = 256
memory = 128
}
}
}
}
멀티 리전 작업 실행하기 (Run the multi-region job)
어느 리전에서든 작업을 실행할 수 있어요.
$ nomad job run ./multi.nomad
성공하면 다음과 유사한 출력을 받아요.
Job registration successful
Evaluation ID: f71cf273-a29e-65e3-bc5b-9710a3c5bc8f
east 리전에서 작업 상태를 확인해요.
$ nomad job status -region east example
east 리전에는 실행 중인 할당이 없고, east 리전이 west 리전의 완료를 기다리고 있기 때문에 상태가 "pending"이라는 점에 주목하세요.
...
Latest Deployment
ID = d74a086b
Status = pending
Description = Deployment is pending, waiting for peer region
Multiregion Deployment
Region ID Status
east d74a086b pending
west 48fccef3 running
Deployed
Task Group Auto Revert Desired Placed Healthy Unhealthy Progress Deadline
cache true 1 0 0 0 N/A
Allocations
No allocations placed
west 리전에서 작업 상태를 확인해요.
$ nomad job status -region west example
실행 중인 할당을 볼 수 있어요.
...
Latest Deployment
ID = 48fccef3
Status = running
Description = Deployment is running
Multiregion Deployment
Region ID Status
east d74a086b pending
west 48fccef3 running
Deployed
Task Group Auto Revert Desired Placed Healthy Unhealthy Progress Deadline
cache true 2 2 0 0 2020-06-17T13:35:49Z
Allocations
ID Node ID Task Group Version Desired Status Created Modified
44b3988a 4786abea cache 0 run running 14s ago 13s ago
7c8a2b80 4786abea cache 0 run running 13s ago 12s ago
모든 태스크의 태스크 상태가 "running"으로 전환된 후 10초가 지나면 west 리전이 정상이어야 해요. 이를 관찰하려면 다음 상태 확인을 실행해요.
$ nomad job status -region west example
이 시점에서 west 리전의 상태는 "blocked"로 전환되고 east 리전의 배포는 "running"이 돼요.
...
Latest Deployment
ID = 48fccef3
Status = blocked
Description = Deployment is complete but waiting for peer region
Multiregion Deployment
Region ID Status
east d74a086b running
west 48fccef3 blocked
east 리전의 배포가 완료되면 상태를 다시 확인해요.
$ nomad job status -region east example
두 리전 모두 "successful"로 전환되어야 해요.
...
Latest Deployment
ID = d74a086b
Status = successful
Description = Deployment completed successfully
Multiregion Deployment
Region ID Status
east d74a086b successful
west 48fccef3 successful
실패한 배포 (Failed deployments)
다음으로 실패한 배포를 시뮬레이션해볼게요. 먼저 west 리전에서는 성공하지만 east 리전에서는 실패할 새 태스크 그룹을 추가해요.
group "sidecar" {
# set the reschedule stanza so that we don't have to wait too long
# for the deployment to be marked failed
reschedule {
attempts = 1
interval = "24h"
unlimited = false
delay = "5s"
delay_function = "constant"
}
task "sidecar" {
driver = "docker"
config {
image = "busybox:1"
command = "/bin/sh"
args = ["local/script.sh"]
}
# this script will always fail in the east region
template {
destination = "local/script.sh"
data = <<EOT
if [[ ${NOMAD_REGION} == "east" ]]
then
echo FAIL
exit 1
fi
echo OK
sleep 600
EOT
}
resources {
cpu = 128
memory = 64
}
}
}
다음으로 멀티 리전 전략의 on_failure 필드를 "fail_local"로 변경해요. 이렇게 하면 실패한 리전만 실패로 표시돼요.
strategy {
max_parallel = 1
on_failure = "fail_local"
}
작업을 다시 실행해요.
$ nomad job run ./multi.nomad
출력은 성공을 나타내야 해요.
Job registration successful
Evaluation ID: e878bb98-6b23-c3de-dce1-10ea37c702f7
이제 상태를 확인해요.
$ nomad job status -region west example
이전 작업 버전과 마찬가지로 west의 배포가 "running" 상태이고 east의 배포가 "pending"인 것을 볼 수 있어요. 결국 east 리전 배포가 실행된 다음 실패해요. on_failure가 "fail_local"로 설정되어 있기 때문에 west 리전은 "blocked" 상태로 유지돼요:
Latest Deployment
ID = f08122e5
Status = blocked
Description = Deployment is complete but waiting for peer region
Multiregion Deployment
Region ID Status
east 8b12b453 failed
west f08122e5 blocked
이 시점에서 west 리전은 blocked 상태로 유지돼요. 작업을 수정하고 재배포하거나, nomad deployment unblock 명령을 사용해 현재 상태의 west 배포를 수락할 수 있어요.
$ nomad deployment unblock -region west f08122e5
성공하면 출력은 다음과 유사해요.
Deployment "f08122e5-fc7e-f450-f61e-81ac48db55cb" unblocked
상태를 다시 확인해요.
$ nomad job status -region west example
west 리전은 이제 successful로 표시되어야 해요:
...
Latest Deployment
ID = f08122e5
Status = successful
Description = Deployment completed successfully
Multiregion Deployment
Region ID Status
east 8b12b453 failed
west f08122e5 successful