노마드 에이전트 운영하기
노마드 에이전트 운영하기
노마드 에이전트(Nomad agent)는 노마드 클러스터의 모든 머신에서 실행되는 오래 지속되는 프로세스예요. 에이전트의 동작은 클라이언트 모드로 실행하는지 서버 모드로 실행하는지에 따라 달라져요. 클라이언트는 작업을 실행하고, 서버는 클러스터를 관리해요.
서버 에이전트는 합의(consensus) 프로토콜과 gossip 프로토콜의 일부예요. Raft로 구동되는 합의 프로토콜은 서버가 리더 선출과 상태 복제를 수행하게 해요. gossip 프로토콜은 서버 클러스터링과 멀티 리전 연합을 가능하게 해요. 서버 노드에 부담이 더 크므로, 서버는 클라이언트 노드보다 리소스를 더 많이 사용하기 때문에 전용 인스턴스에서 실행해야 해요.
클라이언트 에이전트는 fingerprinting을 사용해 호스트 머신의 기능과 리소스, 그리고 사용 가능한 드라이버를 파악해요. 클라이언트는 서버에 등록해 노드 정보와 하트비트를 제공해요. 클라이언트는 서버가 할당한 작업을 실행해요. 클라이언트 노드는 클러스터의 대부분을 차지하며 매우 가벼워요. 서버 노드와 인터페이스하고 자체 상태는 거의 유지하지 않아요. 각 클러스터에는 보통 서버 에이전트가 3개 또는 5개 있고 잠재적으로 수천 개의 클라이언트가 있어요.
출처: 문서
본문
에이전트 실행
nomad agent 명령으로 에이전트를 시작해요. 이 명령은 종료하라는 지시가 있을 때까지 또는 영원히 실행되면서 블로킹돼요. nomad agent 명령은 다양한 구성 옵션을 받지만, 대부분은 합리적인 기본값을 갖고 있어요.
Linux 사용자: 클라이언트 에이전트는 root 또는 sudo로 실행해야 해요. 그래야 cpuset 회계와 네트워크 네임스페이스가 올바르게 동작해요.
이 예시는 개발 모드에서 에이전트를 시작해요. 즉 에이전트가 서버와 클라이언트를 모두 수행해요. 프로덕션 환경에서는 -dev를 사용하지 마세요.
$ sudo nomad agent -dev
==> Starting Nomad agent...
==> Nomad agent configuration:
Client: true
Log Level: INFO
Region: global (DC: dc1)
Server: true
==> Nomad agent started! Log data will stream in below:
[INFO] serf: EventMemberJoin: server-1.node.global 127.0.0.1
[INFO] nomad: starting 4 scheduling worker(s) for [service batch _core]
...
nomad agent 명령은 다음 중요한 정보를 출력해요:
- Client: 에이전트가 클라이언트로 실행 중인지 여부를 나타내요. 클라이언트 노드는 호스트 환경을 fingerprint하고, 서버에 등록하며, 작업을 실행해요.
- Log Level: 구성된 로그 레벨을 나타내요. 노마드는 동일하거나 더 높은 심각도의 메시지만 기록해요. 디버깅을 위해 장황함을 늘리거나 시끄러운 로깅을 피하려면 로그 레벨을 바꿀 수 있어요.
- Region: 에이전트가 실행되는 리전과 데이터센터예요. 노마드는 멀티 데이터센터와 멀티 리전 구성을 일급 지원해요. 리전과 데이터센터를 설정하려면
-region과-dc플래그를 사용해요. 기본값은 dc1의 global 리전이에요. - Server: 에이전트가 서버로 실행 중인지 여부를 나타내요. 서버 노드는 합의 프로토콜 참여, 클러스터 상태 저장, 스케줄링 결정 수행이라는 추가 부담을 갖고 있어요.
에이전트 중지
기본적으로 interrupt나 terminate 같은 어떤 중지 신호도, 필요에 따라 내부 상태가 디스크에 기록된 것을 확인한 뒤 에이전트를 종료시켜요. 해당 신호에 응답하도록 shutdown의 leave_on_interrupt나 leave_on_terminate를 설정해 추가 동작을 구성할 수 있어요.
서버의 경우 leave_on_interrupt나 leave_on_terminate를 설정하면 서버가 클러스터를 떠나려는 의도를 다른 서버에 알려줘서 합의 피어 집합을 떠날 수 있게 해요. 서버가 합의 피어 집합을 떠날 때 가용성에 미치는 영향을 최소화하려면 서버 노드가 정상적으로 떠나도록 허용하는 것이 특히 중요해요. 서버가 정상적으로 떠나지 않고 서비스에 돌아오지 않을 것이라면, server force-leave 명령을 사용해 그 서버를 합의 피어 집합에서 제거해요.
클라이언트의 경우 leave_on_interrupt나 leave_on_terminate를 설정하고 클라이언트가 drain_on_shutdown으로 구성되어 있으면, 클라이언트는 종료 전에 자신의 워크로드를 드레인해요.
신호 처리
Stop an agent 섹션에서 설명한 interrupt(SIGINT)와 terminate 신호(SIGTERM)의 선택적 처리를 제외하고, 노마드는 디버깅에 유용한 몇 가지 다른 신호에 대한 특별한 동작을 지원해요.
SIGHUP은 노마드가 구성을 다시 로드하고 fingerprint를 다시 로드하게 해요.SIGUSR1은 에이전트를 멈추지 않고 노마드가 자체 메트릭을 출력하게 해요.SIGQUIT,SIGILL,SIGTRAP,SIGABRT,SIGSTKFLT,SIGEMT,SIGSYS신호는 Go 런타임이 처리해요. 이 신호들은 노마드 에이전트를 종료시키고 스택 트레이스를 출력하게 해요.
Linux에서 공식 HashiCorp 패키지를 사용할 때 systemctl로 이 신호들을 보낼 수 있어요.
이 예시는 노마드 에이전트의 메트릭을 출력해요.
$ sudo systemctl kill nomad -s SIGUSR1
그런 다음 서비스 로그에서 그 메트릭을 읽을 수 있어요:
$ journalctl -u nomad
수명 주기
노마드 클러스터의 모든 에이전트는 수명 주기를 거쳐요. 이 수명 주기를 이해하는 것은 에이전트가 클러스터와 상호작용하는 방식과 클러스터가 노드를 어떻게 취급하는지에 대한 정신적 모델을 만드는 데 유용해요.
클라이언트 에이전트가 시작되면 호스트 머신을 fingerprint해 속성, 기능, 작업 드라이버를 파악해요. 그런 다음 클라이언트는 최초 등록 중에 이 정보를 서버에 보고해요. 구성에서 알려진 서버 주소를 에이전트에 제공하며, 해석에 DNS를 사용할 수도 있어요. 주소를 하드코딩하는 대신 Consul을 사용해 요청 시 해석하도록 할 수도 있어요.
클라이언트가 실행되는 동안 하트비트를 서버에 보내 활성 상태를 유지해요. 하트비트가 실패하면 서버는 클라이언트 노드가 실패했다고 가정해요. 그러면 서버는 새 작업 할당을 중지하고 기존 작업을 이전해요. 네트워크 장애와 에이전트 충돌을 구분하는 것은 불가능하므로, 노마드는 두 경우를 동일하게 처리해요. 네트워크가 복구되거나 충돌한 에이전트가 다시 시작되면 노마드는 노드 상태를 업데이트하고 정상 동작을 재개해요.
터미널 상태의 노드가 쌓이는 것을 방지하기 위해 노마드는 노드의 주기적 가비지 컬렉션을 수행해요. 기본적으로 노드가 24시간 넘게 실패(failed) 또는 'down' 상태에 있으면 노마드는 그 노드를 가비지 컬렉션해요.
서버는 추가 기능을 수행하므로 조금 더 복잡해요. 리전 내 클러스터링과 멀티 리전 구성 지원을 위해 gossip 프로토콜에 참여해요. 서버가 시작되면 클러스터의 다른 서버 주소를 알지 못해요. 피어를 발견하려면 클러스터에 조인해야 해요. server join 명령이나 시작 시 적절한 구성 제공으로 이를 수행해요. 노드가 조인하면 이 정보는 전체 클러스터에 gossip되어 결국 모든 노드가 서로를 알게 돼요.
서버가 떠날 때는 떠나겠다는 의도를 명시하고, 클러스터는 그 노드를 클러스터에서 떠난 것으로 표시해요. 서버가 떠났다면 그 서버로의 복제는 중지되고 합의 피어 집합에서 제거돼요. 서버가 실패했다면 복제는 소프트웨어 또는 네트워크 장애에서 회복하기 위해 진전을 이루려 해요.
권한
노마드 서버와 노마드 클라이언트는 권한 요구사항이 달라요.
노마드 서버는 가능한 가장 낮은 권한으로 실행해요. 서버는 자체 데이터 디렉터리에 접근하고 자신의 포트에 바인딩할 수 있는 권한만 필요해요. 최소한의 필수 권한을 가진 nomad 사용자를 만들어야 해요.
노마드 클라이언트는 root 권한이 필요한 OS 격리 메커니즘 때문에 root로 실행해요. 권한 없는 사용자로 노마드를 실행하는 것도 가능하지만, 사용하는 작업 드라이버와 기능이 예상대로 동작하는지 신중하게 테스트해야 해요. 노마드 클라이언트의 데이터 디렉터리는 root가 소유하고 파일시스템 권한은 0700으로 설정해야 해요.
더 알아보기 (Learn more)
- 에이전트 구성: Nomad agent configuration
- 서버 구성: server stanza
- 클라이언트 구성: client stanza