작업 명세의 csi_plugin 블록

작업 명세의 csi_plugin 블록 (csi_plugin block in the job specification)

배치 job -> group -> task -> **csi_plugin**

"csi_plugin" 블록은 태스크가 클러스터에 Container Storage Interface 플러그인을 제공함을 명시할 수 있게 해줘요. Nomad는 플러그인을 자동으로 등록해 다른 작업이 volumes를 요청하는 데 사용할 수 있게 해요.

csi_plugin {
  id                     = "csi-hostpath"
  type                   = "monolith"
  mount_dir              = "/csi"
  stage_publish_base_dir = "/local/csi"
  health_timeout         = "30s"
}

출처: 문서

본문

매개변수 (Parameters)

  • id (string: <required>) — 플러그인의 ID. 일부 플러그인은 controller와 node 플러그인 유형을 모두 요구해요(아래 참조); Nomad가 같은 플러그인임을 알 수 있도록 둘 다 같은 ID를 사용해야 해요.

  • type (string: <required>) — node, controller, monolith 중 하나. 각 플러그인은 하나 이상의 유형을 지원해요. 볼륨을 마운트하려는 각 Nomad 클라이언트 노드에는 node 플러그인 인스턴스가 필요해요. 일부 플러그인은 스토리지 제공자의 API와 통신하기 위해 하나 이상의 controller 플러그인 인스턴스도 요구해요. 일부 플러그인은 controller와 node를 동시에 담당할 수 있으며 이를 monolith 플러그인이라고 해요. CSI 플러그인의 문서를 참조하세요.

  • mount_dir (string: <optional>) — 컨테이너 내부에서 플러그인이 Nomad와 양방향 통신을 위한 Unix 도메인 소켓을 기대하는 디렉토리 경로. 이 필드는 일반적으로 필요하지 않아요. 자세한 내용은 CSI 플러그인의 문서를 참조하세요.

  • stage_publish_base_dir (string: <optional>) — 컨테이너 내부에서 플러그인이 볼륨을 stage하고 publish하도록 지시받을 기본 디렉토리 경로. 이 필드는 일반적으로 필요하지 않아요. 자세한 내용은 CSI 플러그인의 문서를 참조하세요. mount_dir의 하위 디렉토리가 될 수 없어요.

  • health_timeout (duration: <optional>) — 플러그인 감시자(supervisor)가 비정상 CSI 플러그인을 재시작하기 전에 기다리는 지속 시간. 30s나 2m 같은 지속 시간 값이어야 해요. 설정하지 않으면 기본값은 30s예요.

Note: node 또는 monolith로 실행되는 플러그인은 호스트에 볼륨을 마운트하려면 루트 권한(또는 Linux의 CAP_SYS_ADMIN)이 필요해요. Docker 태스크 드라이버에서는 privileged = true 구성을 사용할 수 있지만, 현재 다른 기본 태스크 드라이버에는 이 옵션이 없어요.

CSI 플러그인 배포 권장 사항 (Recommendations for deploying CSI plugins)

CSI 플러그인은 Nomad 태스크로 실행되지만, 볼륨을 마운트한 후에는 볼륨의 데이터 경로에 있지 않아요. 볼륨을 마운트하는 태스크는 바인드 마운트를 통해 볼륨에 직접 쓰고 읽으며 작업과 CSI 플러그인 사이에는 통신이 없어요. 하지만 볼륨을 마운트한 할당이 중지되면 Nomad는 해당 할당의 노드에서 플러그인과 통신해 볼륨을 마운트 해제해야 해요. 이는 CSI 플러그인을 어떻게 배포해야 하는지에 대한 의미를 갖습니다:

  • 노드에서 작업을 중지하는 경우, 해당 볼륨에 대한 node 또는 monolith 플러그인을 중지하기 전에 볼륨을 요청하는 태스크를 중지해야 해요. node drain 기능을 사용하면 플러그인 태스크가 자동으로 가장 마지막에 드레인돼요.

  • 특정 플러그인 ID와 유형(controller 또는 node)에 대해 가장 최근에 배치된 할당만 특정 클라이언트 노드에서 사용돼요. node 플러그인은 시스템 작업으로 실행하고 controller 플러그인은 아래와 같이 constraint를 사용해 클라이언트 노드에 분산해요.

  • 일부 플러그인은 플러그인과 같은 위치에서만 볼륨을 만들어요. 예를 들어 AWS EBS 플러그인은 같은 가용 영역 안에서만 볼륨을 만들고 마운트해요. 플러그인의 문서가 권장하는 대로 플러그인 태스크를 구성해 볼륨 명세의 topology_request 필드를 사용해야 해요.

예제 (Examples)

job "plugin-efs" {
  datacenters = ["dc1"]

  # you can run node plugins as service jobs as well, but running
  # as a system job ensures all nodes in the DC have a copy.
  type = "system"

  # only one plugin of a given type and ID should be deployed on
  # any given client node
  constraint {
    operator = "distinct_hosts"
    value = true
  }

  group "nodes" {
    task "plugin" {
      driver = "docker"

      config {
        image = "amazon/aws-efs-csi-driver:v.1.3.2"

        args = [
          "--endpoint=unix://csi/csi.sock",
          "--logtostderr",
          "--v=5",
        ]

        # all CSI node plugins will need to run as privileged tasks
        # so they can mount volumes to the host. controller plugins
        # do not need to be privileged.
        privileged = true
      }

      csi_plugin {
        id             = "aws-efs0"
        type           = "node"
        mount_dir      = "/csi"  # this path /csi matches the --endpoint
                            # argument for the container
        health_timeout = "30s"
      }
    }
  }
}

더 알아보기 (Learn more)