Nomad 系列-Nomad 掛載儲存卷

2023-09-07 13:28:26

系列文章

概述

顯然,如果 Nomad 要執行有狀態儲存,那麼掛載儲存卷就是必備功能。

Nomad 允許使用者通過多種方式將持久資料從本地或遠端儲存卷裝載到任務環境中:

  • 容器儲存介面(CSI)外掛
  • Nomad 主機卷支援
  • Docker Volume 驅動程式

預設沒有安裝 CSI 的情況下,主要使用的是 Nomad 主機卷 方式。

Nomad 的主機卷允許將 Nomad 使用者端上的任何目錄掛載到分配中。這些目錄可以是客戶機上的簡單目錄,但也可以是掛載檔案系統,如 NFS 或 GlusterFS。然後可以將這些 mounts 連線到任務組中的各個任務。

Tailscale 掛載 socket

在後文中,Traefik 要通過 Tailscale 的 socket 和 Tailscale 通訊以獲取證書。那麼我麼也可以通過 Nomad 主機卷(唯讀)的方式將 socket 掛載到 Traefik 容器中。

Nomad 主機卷簡介

Nomad 主機卷 (Host Volume) 可以管理 Nomad 叢集內執行的有狀態工作負載的儲存。

Nomad 主機卷提供了一種與工作負載無關的方式來指定資源,可用於 Nomad 驅動程式,如 execjavadocker

Nomad 主機卷使用步驟

建立主機目錄

在叢集中的 Nomad 使用者端節點上,建立一個用於持久化 MySQL 資料的目錄。對於本例,讓我們建立目錄 /opt/mysql/data:

sudo mkdir -p /opt/mysql/data

設定 Nomad 使用者端

編輯對應的 Nomad 使用者端上的 Nomad 設定以建立主機卷。

host_volume 塊新增到 Nomad 設定的 client 塊:

  host_volume "mysql" {
    path      = "/opt/mysql/data"
    read_only = false
  }

儲存,然後在此使用者端上重新啟動 Nomad 服務,以啟用主機卷。在使用者端上,您可以使用 nomad node status 命令驗證主機卷是否已設定,如下所示:

$ nomad node status -short -self
ID           = 12937fa7
Name         = ip-172-31-15-65
Class        = <none>
DC           = dc1
Drain        = false
Eligibility  = eligible
Status       = ready
Host Volumes = mysql
Drivers      = docker,exec,java,mock_driver,raw_exec,rkt
...

Job 使用 Nomad 主機卷

以一個 MySQL Job - mysql.nomad.hcl 為例,範例如下:

job "mysql-server" {
  type        = "service"

  group "mysql-server" {
    count = 1

    volume "mysql" {
      type      = "host"
      read_only = false
      source    = "mysql"
    }

    task "mysql-server" {
      driver = "docker"

      volume_mount {
        volume      = "mysql"
        destination = "/var/lib/mysql"
        read_only   = false
      }

      env = {
        "MYSQL_ROOT_PASSWORD" = "password"
      }

      config {
        image = "hashicorp/mysql-portworx-demo:latest"
        ports = ["db"]
      }
    }
    network {
      port "db" {
        static = 3306
      }
    }
  }
}

具體說明如下:

  • volume "mysql" {: 指定要使用的 volume, 類似於 K8s 中的 PV, 這裡具體是:
    • type = "host": Nomad Host Volume 型別
    • read_only = false: 非唯讀
    • source = "mysql": source 是 Nomad Client 裡設定的host_volume "mysql"
  • volume_mount {: Docker Driver 中的 volume_mount 塊,指定掛載到容器中的具體路徑,類似於 K8s 中的 PVC:
    • volume = "mysql": 對應的 volume 是上面的 mysql volume
    • destination = "/var/lib/mysql": 掛載到容器中的 /var/lib/mysql 目錄
    • read_only = false: volume_mount 塊的 read_only 設定

啟動該 Job 即可使用 host volume:

nomad run mysql.nomad.hcl

完成