Java 작업 드라이버 구성하기

Java 작업 드라이버 구성하기

이름: java

java 드라이버는 Java Jar 파일에 패키징된 Java 애플리케이션을 실행하는 데 사용돼요. 드라이버는 Jar 파일이 아티팩트 다운로더(artifact downloader)를 통해 노마드 클라이언트에서 접근 가능해야 해요.

출처: 문서

본문

기능

java 드라이버는 다음 기능을 구현해요.

Feature Implementation
nomad alloc signal false
nomad alloc exec false
filesystem isolation none, chroot (only for linux)
network isolation host, group
volume mounting none, all (only for linux)

플러그인 옵션

  • default_pid_mode (string: optional) — 기본값은 "private"이에요. 작업에 대해 PID 네임스페이스 격리를 기본적으로 활성화하려면 "private"으로, 격리를 비활성화하려면 "host"로 설정해요.

    ⚠️ "host"로 설정하면 같은 사용자로 실행 중인 다른 프로세스가 환경 변수 같은 민감한 프로세스 정보에 접근할 수 있게 돼요.

  • default_ipc_mode (string: optional) — 기본값은 "private"이에요. 작업에 대해 IPC 네임스페이스 격리를 기본적으로 활성화하려면 "private"으로, 격리를 비활성화하려면 "host"로 설정해요.

    ⚠️ "host"로 설정하면 같은 사용자로 실행 중인 다른 프로세스가 예상치 못한 POSIX 신호 보내기 같은 IPC 기능을 사용할 수 있게 돼요.

  • allow_caps — 허용되는 Linux 기능(capabilities) 목록이에요. 기본값은
    ["audit_write", "chown", "dac_override", "fowner", "fsetid", "kill", "mknod",
     "net_bind_service", "setfcap", "setgid", "setpcap", "setuid", "sys_chroot"]
    
    이며, docker가 기본적으로 허용하는 기능(NET_RAW 제외)을 모델로 해요. 운영자가 cap_add와 cap_drop 옵션으로 작업이 획득할 수 있는 기능을 제어할 수 있게 해요. 운영 체제가 지원하는 모든 기능을 허용 목록에 넣는 단축값으로 "all" 값을 지원해요.

    ⚠️ 기본 이상의 기능을 더 허용하면 신뢰할 수 없는 작업이 호스트 시스템을 손상시킬 수 있는 등 바람직하지 않은 결과를 초래할 수 있어요.

클라이언트 요구사항

java 드라이버는 Java가 설치되어 있고 시스템의 $PATH에 있어야 해요. Linux에서 노마드는 chroot와 cgroups(둘 다 root 권한이 필요함)를 사용하므로 root로 실행해야 해요. 또한 실행 중인 Jar를 가져올 수 있는 유일한 방법이므로 작업은 적어도 하나의 아티팩트 다운로드를 지정해야 해요.

클라이언트 속성

java 드라이버는 다음 클라이언트 속성을 설정해요:

  • driver.java — 호스트 노드에서 Java가 발견되면 1로 설정돼요. 노마드는 호스트에서 java -version을 실행하고 출력을 파싱해 이를 판단해요.
  • driver.java.version — Java 버전. 예: 1.6.0_65
  • driver.java.runtime — 런타임 버전. 예: Java(TM) SE Runtime Environment (build 1.6.0_65-b14-466.1-11M4716)
  • driver.java.vm — 가상 머신 정보. 예: Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-466.1, mixed mode)

작업 파일에서 이 속성들을 사용하는 예시예요:

job "docs" {
  # Only run this job where the JVM is higher than version 1.6.0.
  constraint {
    attribute = "${attr.driver.java.version}"
    operator  = ">"
    value     = "1.6.0"
  }
}

리소스 격리

제공되는 리소스 격리는 클라이언트의 운영 체제와 구성에 따라 달라져요.

Linux에서 노마드는 cgroups, 네임스페이스, chroot를 사용해 프로세스의 리소스를 격리하려 해요. 노마드 에이전트가 root로 실행 중이 아니면 많은 메커니즘을 사용할 수 없어요.

기본적으로 Java Jar는 Java 가상 머신 안에서 실행되므로 최소한의 격리를 제공해요.

노마드는 필요한 컨트롤러가 모두 사용 가능할 때만 cgroup으로 리소스를 제어할 수 있어요. 필요한 cgroup이 하나라도 없으면 노마드는 cgroup이 필요한 리소스 제어를 완전히 비활성화해요. 자세한 내용은 cgroup 컨트롤러 요구사항 문서를 참고해 주세요.

Chroot

Linux에서 생성된 chroot는 호스트 머신의 다음 디렉터리의 데이터로 채워져요:

[
  "/bin",
  "/etc",
  "/lib",
  "/lib32",
  "/lib64",
  "/run/resolvconf",
  "/sbin",
  "/usr",
]

작업의 chroot는 호스트의 데이터를 chroot로 링크하거나 복사해 채워져요. 이는 상당한 디스크 공간을 차지할 수 있다는 점을 유의하세요. Nomad v0.5.3부터 클라이언트가 로컬에서 가비지 컬렉션을 관리하므로 이로 인해 생길 수 있는 문제를 완화해요.

이 목록은 에이전트 클라이언트 구성 파일에서 구성할 수 있어요.

다음 단계

작업에서 Java 작업 드라이버를 사용해요.

더 알아보기 (Learn more)