Nomad 업그레이드

Nomad 업그레이드 (Upgrade Nomad)

이 페이지는 중단(outage) 없이 HashiCorp Nomad를 업그레이드하는 방법에 대한 지침을 제공해요. 새 버전으로의 업그레이드 과정, Nomad Community에서 Nomad Enterprise로의 전환, 그리고 Raft 프로토콜 버전 3으로의 업그레이드를 검토해요.

출처: 문서

본문

소개 (Introduction)

Nomad는 한 버전에서 다음 버전으로 업그레이드할 때 유연하고 탄력적으로 설계됐어요. 업그레이드는 Nomad나 서비스 중단을 일으키지 않아야 해요. 그러나 업그레이드 전에 알아야 할 몇 가지 제한 사항이 있어요:

  • Nomad는 최소 2개의 포인트 릴리스에 대해 하위 호환성(backward compatibility)을 유지하려고 노력해요. 따라서 Nomad v1.7.x는 v1.5.x와 작동해요.

    • Nomad는 현재 다운그레이드를 지원하지 않아요. 클라이언트를 다운그레이드하려면 할당을 드레인(drain)하고 데이터 디렉터리를 제거해야 해요. 서버를 안전하게 다운그레이드하려면 클러스터를 다시 프로비저닝해야 해요.
    • 모든 노드가 업그레이드될 때까지 새 기능이 올바르게 작동할 가능성은 낮아요.
    • 중요한 변경 사항과 하위 비호환성은 버전 업그레이드 세부 정보 페이지를 확인해요.
  • Nomad 클라이언트를 업그레이드할 때 재시작하는 데 heartbeat_grace(기본 10초) 기간보다 오래 걸리면 해당 노드의 모든 할당이 재스케줄링될 수 있어요.

Nomad는 제자리(in place) 업그레이드 또는 새 서버를 롤링 추가하는 방식을 지원해요:

  • 제자리(In Place): 기존 호스트에서 Nomad 바이너리를 업데이트할 수 있어요. 실행 중인 할당은 중단 없이 계속 실행돼요.
  • 롤링(Rolling): 새 Nomad 버전이 포함된 새 호스트를 추가한 다음 이전 호스트를 제거할 수 있어요. 실행 중인 할당을 새 노드로 마이그레이션하려면 이전 노드를 드레인해야 해요.

이 가이드는 두 접근 방식을 모두 설명해요.

업그레이드 과정 (Upgrade Process)

새 버전의 업그레이드 세부 정보를 확인했다면 업그레이드 과정은 각 호스트의 바이너리를 업데이트하고 Nomad 서비스를 다시 시작하는 것만큼 간단해요.

대략적으로 Nomad를 업그레이드하려면 다음 단계를 완료해요:

  • 새 버전 추가
  • 클러스터 상태 확인
  • 이전 버전 제거
  • 클러스터 상태 확인
  • 클라이언트 업그레이드

1. 기존 클러스터에 새 버전 추가 (1. Add the new version to the existing cluster)

서버보다 먼저 Nomad 클라이언트 노드를 업그레이드하는 것도 가능하지만, 많은 새 클라이언트 기능이 서버가 업그레이드될 때까지 작동하지 않으므로 이 가이드는 서버를 먼저 업그레이드할 것을 권장해요.

페더레이션 클러스터에서 새 기능은 리전의 모든 에이전트와 권위(authoritative) 리전의 서버 노드가 업그레이드될 때까지 작동이 보장되지 않아요.

기존 시스템에서 Nomad를 제자리로 교체하든 새 서버를 가져오든, 업그레이드의 각 단계에서 클러스터 상태를 확인하며 변경을 점진적으로 해야 해요.

단일 서버에서 새 버전의 Nomad를 설치해요. 새 서버를 클러스터에 조인하거나 바이너리를 로컬에서 교체/업그레이드하고 Nomad 서비스를 다시 시작하는 방식으로 할 수 있어요.

leave_on_terminate 또는 leave_on_interrupt가 설정되어 있다면 업그레이드 과정에 예상되는 신호를 사용하고 있는지 확인해야 해요. 예를 들어 leave_on_terminate가 설정되어 있고 서버를 제자리에서 업데이트하려는 경우, 다시 시작하기 전에 서버를 종료할 때 SIGTERM이 아닌 SIGINT를 보내야 해요.

2. 클러스터 상태 확인 (2. Check cluster health)

남아 있는 서버에서 Nomad 로그를 모니터링해 새 서버가 클러스터에 올바르게 조인했는지 확인해요.

새 서버에서 nomad agent-info를 실행하고 last_log_index가 다른 서버와 비슷한 값인지 확인해요. 이 단계는 변경 사항이 새 서버에 복제되었는지 확인해요.

nomad
  bootstrap = false
  known_regions = 1
  leader = false
  server = true
raft
  applied_index = 53460
  commit_index = 53460
  fsm_pending = 0
  last_contact = 54.512216ms
  last_log_index = 53460
  last_log_term = 1
  last_snapshot_index = 49511
  last_snapshot_term = 1
  num_peers = 2
...

한 번에 하나의 Nomad 서버씩 업그레이드를 계속해요. nomad server members로 서버 상태를, nomad node status로 클라이언트 노드 상태를 확인할 수 있어요.

3. 서버에서 이전 버전 제거 (3. Remove the old versions from servers)

기존 서버에서 제자리 업그레이드를 수행한다면 버전이 제자리에서 변경됐으므로 이 단계가 필요하지 않아요.

새 서버를 추가하고 기존 서버를 플릿에서 제거하는 방식으로 업그레이드한다면 서버가 플릿을 안전하게 떠났는지 확인해야 해요.

  1. 기존 호스트에서 서비스를 중지해요.
  2. 다른 서버에서 nomad server members를 실행하고 상태를 확인해요. 서버가 이제 left 상태라면 계속 진행해도 안전해요.
  3. 서버가 left 상태가 아니라면 nomad server force-leave <server id>를 실행해 클러스터에서 서버를 제거해요.

이 기간 동안 Nomad 클러스터의 다른 호스트 로그를 모니터링해요.

4. 클러스터 상태 확인 (4. Check cluster health)

위의 #2 단계와 동일한 작업을 사용해 클러스터 상태를 확인해요.

5. 클라이언트 업그레이드 (5. Upgrade clients)

서버 업그레이드에 성공한 후 서버와 유사한 과정으로 클라이언트를 업데이트할 수 있어요. 클라이언트를 제자리에서 업그레이드하거나 새 버전으로 새 노드를 시작할 수 있어요. nomad node drain 명령으로 실행 중인 할당을 이전 노드에서 새 노드로 마이그레이션하는 방법은 워크로드 마이그레이션 가이드를 참조해요.

완료 (Done)

이제 최신 Nomad 버전을 실행하고 있어요. nomad node status를 실행해 모든 클라이언트가 조인했는지, 모든 클라이언트가 ready 상태인지 확인할 수 있어요.

Nomad Enterprise로 업그레이드 (Upgrading to Nomad Enterprise)

서버를 Nomad Enterprise 버전 1.6.0 이상으로 업그레이드하기 전에, 업그레이드할 바이너리를 사용해 nomad license inspect 명령으로 엔터프라이즈 라이선스를 검증해야 해요. 자세한 내용은 라이선싱 FAQ를 참조해요.

그 후 Nomad Enterprise 버전으로 업그레이드하는 과정은 오픈 소스 Nomad 버전 간 업그레이드와 동일해요. 위의 동일한 지침을 따라야 하며, 항상 그렇듯이 업그레이드를 시작하기 전에 특정 버전 세부 정보 페이지를 확인해 주세요. 일부 버전 차이는 특정 단계를 요구할 수 있기 때문이에요.

Raft 프로토콜 3으로 업그레이드 (Upgrading to Raft Protocol 3)

이 섹션은 Raft 프로토콜 3으로 업그레이드하는 방법에 대한 세부 정보를 제공해요. Raft 프로토콜 버전 3은 작동하려면 모든 서버에서 Nomad 0.8.0 이상이 실행되고 있어야 해요. Raft 프로토콜 버전 2는 Nomad 1.4.0에서 제거될 거예요.

각 서버에서 사용 중인 Raft 프로토콜 버전을 보려면 nomad operator raft list-peers 명령을 사용해요.

장애 복구에 사용되는 peers.json 형식은 최신 Raft 프로토콜로 실행할 때 다르다는 점을 참고해요. 필요한 형식은 peers.json을 사용한 수동 복구를 참조해요.

Raft 프로토콜 버전 3을 사용할 때 Nomad가 내부 Raft 정족수 구성에 변경을 할 때 서버는 IP 주소 대신 node-id로 식별돼요. 즉, 모든 서버가 Raft 프로토콜 버전 3으로 업그레이드된 클러스터는 더 이상 이전 Raft 프로토콜 버전을 실행하는 서버가 추가되는 것을 허용하지 않아요.

프로덕션 클러스터를 Raft 버전 3으로 업그레이드 (Upgrading a Production Cluster to Raft Version 3)

멤버가 3개 이상인 프로덕션 Raft 클러스터의 경우 서버를 업그레이드하는 가장 쉬운 방법은 각 서버가 클러스터를 떠나 raft_protocol 버전을 server 블록에서 업그레이드하고(버전 v1.3.0보다 낮은 버전으로 업그레이드하는 경우), 다시 추가하는 것이에요. 새 서버가 성공적으로 조인하고 클러스터가 안정적인지 확인한 다음 다음 서버로 롤링 업그레이드를 진행해요. 새 서버 집합을 구성한 다음 유사한 방식으로 각각의 이전 서버를 천천히 종료하는 것도 가능해요.

제자리 Raft 프로토콜 업그레이드의 경우 각 서버에 대해 다음을 수행해요. 리더는 마지막에 남겨 두어 과정을 느리게 하는 리더 선출 가능성을 줄여요:

  • 서버를 중지해요.
  • nomad server force-leave $server_name을 실행해요.
  • 업그레이드가 v1.3.0보다 낮은 Nomad 버전에 대한 것이라면 서버 구성 파일의 raft_protocol을 3으로 업데이트해요.
  • 서버를 다시 시작해요.
  • nomad operator raft list-peers를 실행해 서버의 RaftProtocol이 이제 3인지 확인해요.
  • 서버에서 nomad agent-info를 실행하고 last_log_index가 다른 서버와 비슷한 값인지 확인해요. 이 단계는 raft가 정상이고 변경 사항이 새 서버에 복제되고 있는지 확인해요.

단일 서버 클러스터를 Raft 버전 3으로 업그레이드 (Upgrading a Single Server Cluster to Raft Version 3)

단일 Nomad 서버를 실행 중이라면 제자리에서 다시 시작할 때 해당 서버가 스스로 리더로 선출할 수 없게 될 거예요. 이를 피하려면 새 구성으로 서버를 다시 시작하기 전에 새 peers.json 파일을 만들어요. jq가 설치되어 있다면 서버 호스트에서 다음 스크립트를 실행해 올바른 peers.json 파일을 작성할 수 있어요:

 
NOMAD_DATA_DIR=$(nomad agent-info -json | jq -r '.config.DataDir')
NOMAD_ADDR=$(nomad agent-info -json | jq -r '.stats.nomad.leader_addr')
NODE_ID=$(cat "$NOMAD_DATA_DIR/server/node-id")
 
cat <<EOF > "$NOMAD_DATA_DIR/server/raft/peers.json"
[
  {
    "id": "$NODE_ID",
    "address": "$NOMAD_ADDR",
    "non_voter": false
  }
]
EOF

이 스크립트를 실행한 후 업그레이드가 v1.3.0보다 낮은 Nomad 버전에 대한 것이라면 서버 구성의 raft_protocol을 3으로 업데이트하고 서버를 다시 시작해요.

더 알아보기 (Learn more)