顯然,如果 Nomad 要執行有狀態儲存,那麼掛載儲存卷就是必備功能。
Nomad 允許使用者通過多種方式將持久資料從本地或遠端儲存卷裝載到任務環境中:
預設沒有安裝 CSI 的情況下,主要使用的是 Nomad 主機卷 方式。
Nomad 的主機卷允許將 Nomad 使用者端上的任何目錄掛載到分配中。這些目錄可以是客戶機上的簡單目錄,但也可以是掛載檔案系統,如 NFS 或 GlusterFS。然後可以將這些 mounts 連線到任務組中的各個任務。
在後文中,Traefik 要通過 Tailscale 的 socket 和 Tailscale 通訊以獲取證書。那麼我麼也可以通過 Nomad 主機卷(唯讀)的方式將 socket 掛載到 Traefik 容器中。
Nomad 主機卷 (Host Volume) 可以管理 Nomad 叢集內執行的有狀態工作負載的儲存。
Nomad 主機卷提供了一種與工作負載無關的方式來指定資源,可用於 Nomad 驅動程式,如 exec
、 java
和 docker
。
在叢集中的 Nomad 使用者端節點上,建立一個用於持久化 MySQL 資料的目錄。對於本例,讓我們建立目錄 /opt/mysql/data
:
sudo mkdir -p /opt/mysql/data
編輯對應的 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
...
以一個 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
volumedestination = "/var/lib/mysql"
: 掛載到容器中的 /var/lib/mysql
目錄read_only = false
: volume_mount
塊的 read_only
設定啟動該 Job 即可使用 host volume:
nomad run mysql.nomad.hcl
完成