잡 스펙의 `volume` 블록

잡 스펙의 volume 블록

volume 블록은 그룹이 클러스터에서 주어진 볼륨을 요구한다고 명시할 수 있게 해요.

블록의 키는 태스크 구성에 노출될 볼륨의 이름이에요.

출처: 문서

본문

배치 job -> group -> **volume**
job "docs" {
  group "example" {
    volume "certs" {
      type      = "host"
      source    = "ca-certificates"
      read_only = true
    }
  }
}
job "docs" {
  group "example" {
    volume "data" {
      type            = "csi"
      source          = "csi-volume"
      read_only       = true
      attachment_mode = "file-system"
      access_mode     = "single-node-writer"
      per_alloc       = true

      mount_options {
        fs_type     = "ext4"
        mount_flags = ["noatime"]
      }
    }
  }
}

Nomad 서버는 volume 블록에 지정된 기준을 충족하는 일련의 볼륨을 가진 호스트에만 할당이 스케줄링되도록 보장해요. 이것들은 클라이언트에 구성된 정적 호스트 볼륨, volume create 또는 volume register로 만든 동적 호스트 볼륨, 또는 CSI 플러그인이 동적으로 마운트한 CSI 볼륨일 수 있어요.

Nomad 클라이언트는 task 구성의 volume_mount 블록에 따라 볼륨을 태스크에 사용할 수 있게 해요.

매개변수 (Parameters)

  • type (string: "") - 주어진 볼륨의 타입. 유효한 볼륨 타입은 "host"와 "csi". "host" 값을 설정하면 주어진 노드에서 사용 가능한 것에 따라 정적으로 구성된 호스트 볼륨 또는 동적 호스트 볼륨을 요청할 수 있어요.

  • source (string: <required>) - 요청할 볼륨의 이름. host_volume를 사용할 때는 호스트 볼륨의 게시된 이름과 일치해야 해요. csi 볼륨을 사용할 때는 등록된 볼륨의 ID와 일치해야 해요.

  • read_only (bool: false) - 그룹이 볼륨에 대한 읽기 전용 접근만 필요로 함을 지정하고 volume_mount -> read_only 구성의 기본값으로 사용돼요. 이 값은 host_volume ACL 검증과 일치하는 host_volume이 read_only 사용을 요구할 때 스케줄링에도 사용돼요.

  • sticky (bool: false) - 이 볼륨이 그것을 사용하는 할당에 고정된다고 지정. 모든 재스케줄·교체 시 태스크 그룹은 사용 가능하면 항상 같은 ID의 볼륨을 받아요. stateful deployments에 sticky 볼륨을 사용하세요. sticky 필드는 동적 호스트 볼륨에서만 사용할 수 있어요. CSI 볼륨의 경우 per_alloc 필드가 유사한 기능을 제공해요.

  • per_alloc (bool: false) - 볼륨의 source에 접미사 [n]이 있어야 한다고 지정. 여기서 n은 할당 인덱스예요. 이렇게 하면 볼륨의 source가 적절히 명명되는 한 할당별 고유 볼륨을 마운트할 수 있어요. 예를 들어 source myvolume과 per_alloc = true이면 myjob.mygroup.mytask[0]이라는 할당은 볼륨 ID myvolume[0]을 요구해요.

per_alloc 필드는 시스템 잡, sysbatch 잡, 또는 카나리를 사용하는 잡에서는 true일 수 없어요. per_alloc는 sticky 속성과 상호 배타적이에요. per_alloc를 동적 호스트 볼륨과 함께 사용하면 볼륨이 고유한 볼륨 이름을 갖도록 보장할 책임은 당신에게 있어요. 같은 잡의 여러 할당이 같은 호스트에서 동적 호스트 볼륨을 사용해야 하는 경우가 아니라면, 동적 호스트 볼륨에는 sticky를, CSI 볼륨에는 per_alloc을 사용할 것을 권장해요.

다음 필드는 type = "csi" 볼륨 또는 type = "host" 동적 호스트 볼륨에서만 유효해요:

대부분의 CSI 플러그인은 단일 노드 모드만 지원해요. 스토리지 공급자와 CSI 플러그인의 문서를 확인하세요.

- 동적 호스트 볼륨의 경우 `access_mode`는 선택적이에요. 다음 중 하나일 수 있어요:

  - [`"single-node-writer"`](https://developer.hashicorp.com/nomad/docs/job-specification/volume#single-node-writer-1)
  - [`"single-node-reader-only"`](https://developer.hashicorp.com/nomad/docs/job-specification/volume#single-node-reader-only-1)
  - [`"single-node-single-writer"`](https://developer.hashicorp.com/nomad/docs/job-specification/volume#single-node-single-writer)
  - [`"single-node-multi-writer"`](https://developer.hashicorp.com/nomad/docs/job-specification/volume#single-node-multi-writer)

read_only = true가 아니면 single-node-writer로 기본 설정되고, read_only = true이면 single-node-reader-only로 기본 설정돼요.

  • attachment_mode (string) - 볼륨이 사용하는 스토리지 API. "file-system" 또는 "block-device" 중 하나. access_mode와 attachment_mode는 함께 볼륨의 capability 블록 중 하나와 정확히 일치해야 해요.

    • CSI 볼륨의 경우 attachment_mode 필드는 필수예요. 대부분의 스토리지 공급자는 CSI 파일시스템 API로 볼륨을 마운트하는 "file-system"을 지원해요. 일부 스토리지 공급자는 컨테이너 안에서 CSI 블록 장치 API로 볼륨을 마운트하는 "block-device"를 지원해요.

    • 동적 호스트 볼륨의 경우 attachment_mode 필드는 선택적이고 기본값은 "file-system"이에요.

다음 필드는 type = "csi" 볼륨에서만 유효해요:

  • mount_options - file-system attachment mode를 가진 CSI 볼륨을 마운트하기 위한 옵션. 이 옵션들은 볼륨 등록의 mount_options 필드를 덮어써요. 이 옵션들이 필요한지 여부는 스토리지 공급자와 CSI 플러그인의 문서를 확인하세요.

    • fs_type: 파일시스템 타입 (예: "ext4")
    • mount_flags: mount에 전달되는 플래그 (예: ["ro", "noatime"])

볼륨 보간 (Volume interpolation)

볼륨은 상태를 나타내므로, 여러 할당이 있는 많은 워크로드가 특정 볼륨을 특정 태스크에 마운트하기를 원할 거예요. volume 블록은 워크로드를 스케줄링하는 데 사용되므로 ${NOMAD_ALLOC_INDEX}를 volume.source 필드에서 직접 사용할 수 없어요. 다음 잡 스펙은 per_alloc 필드를 사용해 여러 할당으로 여러 볼륨을 사용하는 방법을 보여줘요. 이 잡 스펙은 또한 HCL2 변수 보간을 사용해 태스크 환경에 정보를 노출하는 방법도 보여줘요.

variables {
  path = "test"
}

job "example" {
  datacenters = ["dc1"]

  group "cache" {

    count = 2

    volume "cache-volume" {
      type            = "csi"
      source          = "test-volume"
      attachment_mode = "file-system"
      access_mode     = "single-node-writer"
      per_alloc       = true
    }

    network {
      port "db" {
        to = 6379
      }
    }

    task "redis" {
      driver = "docker"
      config {
        image = "redis:7"
        ports = ["db"]
      }
      resources {
        cpu    = 500
        memory = 256
      }

      env {
        # this will be available as the MOUNT_PATH environment
        # variable in the task
        MOUNT_PATH = "${NOMAD_ALLOC_DIR}/${var.path}"
      }

      volume_mount {
        volume      = "cache-volume"
        destination = "${NOMAD_ALLOC_DIR}/${var.path}"
      }

    }
  }
}

이 잡 스펙에서 나오는 잡은 두 개의 볼륨 각각에 대해 하나씩 이름이 붙은 두 개의 태스크 그룹을 가져요. 각 할당은 자체 볼륨을 가져요.

$ nomad job status example
ID            = example
...

Allocations
ID        Node ID   Task Group  Version  Desired  Status   Created  Modified
81d32909  352c6926  cache-1     0        run      running  4s ago   3s ago
ce6fbfc8  352c6926  cache-0     0        run      running  4s ago   3s ago

$ nomad volume status 'test-volume[0]'
...
Allocations
ID        Node ID   Task Group  Version  Desired  Status   Created  Modified
ce6fbfc8  352c6926  cache-0     0        run      running  29s ago  18s ago

$ nomad volume status 'test-volume[1]'
...
Allocations
ID        Node ID   Task Group  Version  Desired  Status   Created  Modified
81d32909  352c6926  cache-0     0        run      running  29s ago  18s ago

더 알아보기 (Learn more)