Autopilot
Autopilot
Autopilot는 Nomad 0.8에 추가된 새 기능 묶음으로, 운영자 친화적인 Nomad 서버 자동 관리를 가능하게 해요. 여기에는 죽은 서버 정리, Raft 클러스터 상태 모니터링, 안정적인 서버 도입이 포함돼요.
Autopilot 기능(죽은 서버 정리 제외)을 활성화하려면 모든 서버의 server stanza에서 raft_protocol 설정을 3으로 해야 해요.
출처: 문서
본문
구성 (Configuration)
Autopilot의 구성은 리더가 클러스터를 초기 부트스트랩할 때 에이전트의 Autopilot settings에서 로드해요:
autopilot {
cleanup_dead_servers = true
last_contact_threshold = "200ms"
max_trailing_logs = 250
server_stabilization_time = "10s"
enable_redundancy_zones = false
disable_upgrade_migration = false
enable_custom_upgrades = false
}
부트스트래핑 후 구성은 operator autopilot 하위 명령 또는 /v1/operator/autopilot/configuration HTTP 엔드포인트로 보고 수정할 수 있어요:
구성 보기:
$ nomad operator autopilot get-config
CleanupDeadServers = true
LastContactThreshold = 200ms
MaxTrailingLogs = 250
ServerStabilizationTime = 10s
EnableRedundancyZones = false
DisableUpgradeMigration = false
EnableCustomUpgrades = false
구성 업데이트:
$ nomad operator autopilot set-config -cleanup-dead-servers=false
Configuration updated!
구성을 다시 확인해 변경 사항을 확인하세요:
$ nomad operator autopilot get-config
CleanupDeadServers = false
LastContactThreshold = 200ms
MaxTrailingLogs = 250
ServerStabilizationTime = 10s
EnableRedundancyZones = false
DisableUpgradeMigration = false
EnableCustomUpgrades = false
죽은 서버 정리 (Dead server cleanup)
죽은 서버는 쿼럼 크기와 리더 선거를 방해하지 않도록 주기적으로 정리되고 Raft peer 집합에서 제거돼요. 이 정리는 새 서버가 클러스터에 성공적으로 추가될 때마다도 발생해요.
Autopilot 이전에는 죽은 서버가 자동으로 수거되는 데 72시간이 걸렸거나, 운영자가 nomad force-leave를 스크립트로 작성해야 했어요. 또 다른 서버 장애가 발생하면, 실패한 Nomad 서버가 자동으로 교체되었더라도 쿼럼을 위태롭게 만들 수 있었어요. Autopilot은 교체 Nomad 서버가 온라인 상태가 되는 즉시 실패한 서버를 빠르게 제거해 이러한 종류의 중단을 예방하는 데 도움을 줘요. 정리 프로세스로 서버가 제거되면 "left" 상태로 들어가요.
이 옵션은 nomad operator autopilot set-config -cleanup-dead-servers=false 옵션으로 실행해 비활성화할 수 있어요.
서버 헬스 체크 (Server health checking)
서버의 안정성을 모니터링하는 내부 헬스 체크가 리더에서 실행돼요. 서버는 다음 조건이 모두 참일 때 healthy로 간주돼요:
- Serf에 따른 상태가 'Alive'
- 현재 리더와 마지막 접촉 이후 시간이
LastContactThreshold미만 - 최신 Raft term이 리더의 term과 일치
- 리더보다 뒤처진 Raft 로그 항목 수가
MaxTrailingLogs를 초과하지 않음
이 헬스 체크의 상태는 클러스터의 전반적 상태를 나타내는 최상위 Healthy 필드와 함께 /v1/operator/autopilot/health HTTP 엔드포인트로 볼 수 있어요:
$ curl localhost:4646/v1/operator/autopilot/health
{
"Healthy": true,
"FailureTolerance": 0,
"Servers": [
{
"ID": "e349749b-3303-3ddf-959c-b5885a0e1f6e",
"Name": "node1",
"Address": "127.0.0.1:4647",
"SerfStatus": "alive",
"Version": "0.8.0",
"Leader": true,
"LastContact": "0s",
"LastTerm": 2,
"LastIndex": 10,
"Healthy": true,
"Voter": true,
"StableSince": "2017-03-28T18:28:52Z"
},
{
"ID": "e35bde83-4e9c-434f-a6ef-453f44ee21ea",
"Name": "node2",
"Address": "127.0.0.1:4747",
"SerfStatus": "alive",
"Version": "0.8.0",
"Leader": false,
"LastContact": "35.371007ms",
"LastTerm": 2,
"LastIndex": 10,
"Healthy": true,
"Voter": false,
"StableSince": "2017-03-28T18:29:10Z"
}
]
}
안정적인 서버 도입 (Stable server introduction)
새 서버가 클러스터에 추가되면, 전체 투표 구성원으로 승격되기 전에 일정 시간 동안 healthy하고 안정적이어야 하는 대기 기간이 있어요. 이것은 ServerStabilizationTime 설정으로 구성할 수 있어요.
서버 읽기·스케줄링 스케일링 (Server read and scheduling scaling)
Enterprise
non_voting_server 옵션으로 서버를 명시적으로 non-voter로 표시할 수 있고 결코 투표 구성원으로 승격되지 않아요. 이것은 더 많은 읽기 스케일링이 필요할 때 유용해요. non-voter라는 것은 서버에 여전히 데이터가 복제되지만, 리더가 로그 항목을 커밋하기 전에 기다려야 하는 쿼럼의 일부가 아니라는 뜻이에요. Non-voting 서버는 또한 대규모 클러스터에서 스케줄링 처리량을 높이기 위해 스케줄링 워커로도 동작할 수 있어요.
리던던시 영역 (Redundancy zones)
Enterprise
Autopilot 이전에는 AWS 가용 영역 같은 격리된 장애 도메인을 활용하는 방식으로 서버를 배포하기 어려웠어요. 사용자는 지나치게 큰 쿼럼(AZ당 2-3 노드)을 가지거나 각 영역에 서버 하나만 배포해 AZ 내 리던던시를 포기해야 했어요.
EnableRedundancyZones 설정이 설정되면 Nomad는 그 값을 사용해 각 서버의 지정된 redundancy_zone 필드에서 영역을 찾아요.
구성 방법을 보여주는 예시:
/* config.hcl */
server {
redundancy_zone = "west-1"
}
$ nomad operator autopilot set-config -enable-redundancy-zones=true
Configuration updated!
그러면 Nomad는 이 값들을 사용해 리던던시 영역별로 서버를 분할하고 영역당 투표 서버 하나를 유지하는 것을 목표로 해요. 각 영역의 추가 서버는 활성 투표자가 떠나거나 죽으면 승격되도록 대기하는 non-voter로 남아요.
업그레이드 마이그레이션 (Upgrade migrations)
Enterprise
Nomad Enterprise의 Autopilot은 기본적으로 업그레이드 마이그레이션을 지원해요. 이 기능을 비활성화하려면 DisableUpgradeMigration을 true로 설정하세요.
새 서버가 추가되고 Autopilot이 그 Nomad 버전이 기존 서버보다 새 것임을 감지하면, Autopilot은 충분한 수의 새 버전 서버가 클러스터에 추가될 때까지 새 서버 승격을 피해요. 새 서버 수가 이전 서버 수와 같거나 초과하면 Autopilot은 새 서버를 voter로 승격하고 이전 서버를 강등하기 시작해요. 이것이 끝나면 이전 서버는 안전하게 클러스터에서 제거할 수 있어요.
서버의 Nomad 버전을 확인하려면 autopilot health 엔드포인트 또는 nomad members 명령을 사용할 수 있어요:
$ nomad server members
Name Address Port Status Leader Protocol Build Datacenter Region
node1 127.0.0.1 4648 alive true 3 0.7.1 dc1 global
node2 127.0.0.1 4748 alive false 3 0.7.1 dc1 global
node3 127.0.0.1 4848 alive false 3 0.7.1 dc1 global
node4 127.0.0.1 4948 alive false 3 0.8.0 dc1 global
Nomad 버전 변경 없는 마이그레이션 (Migrations without a Nomad version change)
EnableCustomUpgrades 필드는 마이그레이션 중 사용되는 버전 정보를 덮어쓰는 데 사용할 수 있어서, 구성 변경 시 클러스터 업데이트에 마이그레이션 로직을 사용할 수 있어요.
EnableCustomUpgrades 설정이 true로 설정되면 Nomad는 그 값을 사용해 각 서버의 지정된 upgrade_version 태그에서 버전을 찾아요. 업그레이드 로직은 시맨틱 버저닝을 따르며 upgrade_version은 X, X.Y, 또는 X.Y.Z 형태여야 해요.