democratic-csiをnomadで試してみる

nomaddemocratic-csiを利用して、SynologyのNASから動的にiscsiの領域を確保して、マウントして、コンテナのストレージとして利用できるようにしてみました。ノードを跨いで、ステートを保持できるようになるよ。

Kubernetesnomadのようなコンテナオーケストレーションツールを利用している際に、ストレージをどのように手配するかというのは大きなポイントです。これがお金を払ったサービスなどであれば、自動的にストレージをアタッチしてくれたりもするのでしょうが、お家検証ラボ環境ではそんな便利な仕組みは利用できません。。

このため、勢いnomad はステートレスなアプリを動かすために利用していました。もしくは外部にDBなどを立てて、そこにステートを保管できるアプリの場合は、それで騙し騙し運用していました。

しかし、これではいかんということで、重い腰を上げて解決策を探ってみました。そこで見つけたのが、democratic-csiでした。

ちょうど「おうち Kubernetes に最適な Synology 公式の CSI Driver がリリースされた話と Cloning / Snapshot feature deep dive - @amsy810's Blog」を見つけたのがきっかけとして一番大きいです。

環境情報について説明します。

ネットワーク図はこのようになります。3台のサーバーにnomadがインストールされていて、稼働しています:

20220109.drawio

条件としては以下になります:

  • Synology NAS側にSAN Managerが導入されていること
  • adminアカウントが有効で、2-Factor認証は利用していないこと。パスワード認証できること

CSIとは、Cloud Native Computing Foundationで定義されたContainer Orchestrator(CO)で利用可能な業界標準のストレージ・インターフェースを指しているそうです。この仕組を利用して、たとえばKubernetesnomadなどのコンテナオーケストレーションツールがストレージを操作できるようになっているそうです。

今回はdemocratic-csiというのを利用して、Synology NASからiSCSI領域を切り出して、コンテナから利用できるようにします。

事前にやっておく作業を書きます。正直nomadはこの分野では成熟していないため、色々とやる必要があります。

Storage Manager上で、Volume 1がある前提で話を進めていきます:

ds418 - Synology DiskStation

また、SAN Managerが動作していることも確認しておきます:

ds418 - Synology DiskStation-2

nomadが動作しているサーバ側で実施する手順になります。

次のようにして必要なパッケージをインストールします:

  • open-iscsi
  • lsscsi
  • sg3-utils
  • multipath-tools
  • scsitools

実行ログはこんな感じです:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
kazu634@test02% sudo apt-get install -y open-iscsi lsscsi sg3-utils multipath-tools scsitools
[sudo] kazu634 のパスワード:
パッケージリストを読み込んでいます... 完了                                                              
依存関係ツリーを作成しています                                                                          
状態情報を読み取っています... 完了                                                                      
multipath-tools はすでに最新バージョン (0.8.3-1ubuntu2) です。                                          
multipath-tools は手動でインストールしたと設定されました。                                              
sg3-utils はすでに最新バージョン (1.44-1ubuntu2) です。                                                 
sg3-utils は手動でインストールしたと設定されました。                                                    
open-iscsi はすでに最新バージョン (2.0.874-7.1ubuntu6.2) です。                                         
open-iscsi は手動でインストールしたと設定されました。                                                   
以下のパッケージが新たにインストールされます:                                                           
  lsscsi scsitools
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
163 kB のアーカイブを取得する必要があります。 
この操作後に追加で 490 kB のディスク容量が消費されます。
取得:1 http://192.168.10.200:8080/ubuntu/apt-mirror/mirror/jp.archive.ubuntu.com/ubuntu focal/main amd64
 lsscsi amd64 0.30-0.1 [46.1 kB]
取得:2 http://192.168.10.200:8080/ubuntu/apt-mirror/mirror/jp.archive.ubuntu.com/ubuntu focal/universe a
md64 scsitools amd64 0.12-3ubuntu1 [117 kB]
163 kB を 0秒 で取得しました (620 kB/s)
以前に未選択のパッケージ lsscsi を選択しています。
(データベースを読み込んでいますi... 現在 81800 個のファイルとディレクトリがインストールされています。)
.../lsscsi_0.30-0.1_amd64.deb を展開する準備をしています ... 
lsscsi (0.30-0.1) を展開しています... 
以前に未選択のパッケージ scsitools を選択しています。
.../scsitools_0.12-3ubuntu1_amd64.deb を展開する準備をしています ...
scsitools (0.12-3ubuntu1) を展開しています... 
scsitools (0.12-3ubuntu1) を設定しています ...
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
lsscsi (0.30-0.1) を設定しています ...
man-db (2.9.1-1) のトリガを処理しています ...
systemd (245.4-4ubuntu3.13) のトリガを処理しています ...

Ubuntuでopen-iscsi(2.0.874 @raspberry pi 4 / ubuntu 20.04)を参照して、こんな感じで探索をします:

1
2
3
4
5
kazu634@test02% sudo iscsiadm -m discoverydb -t st -p 192.168.10.200 --discover
192.168.10.200:3260,1 iqn.2000-01.com.synology:ds418.default-target.670eccce521
[fe80::211:32ff:fe8a:58a3]:3260,1 iqn.2000-01.com.synology:ds418.default-target.670eccce521
192.168.10.200:3260,1 iqn.2000-01.com.synology:ds418.nomad.target-mysql
[fe80::211:32ff:fe8a:58a3]:3260,1 iqn.2000-01.com.synology:ds418.nomad.target-mysql

このコマンドを実行しないと、/etc/iscsi/nodes/配下に探索した結果を格納したファイルが作成されず、後で実施するsudo systemctl start iscsi.serviceが失敗するので、必ず実行しましょう。

次のように行います:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
kazu634@test02% sudo tee /etc/multipath.conf <<-'EOF'
defaults {
    user_friendly_names yes
    find_multipaths yes
}
EOF
defaults {
    user_friendly_names yes
    find_multipaths yes
}

multipath-toolsopen-iscsiを自動実行させ、起動します。

以下のようにコマンドを実行します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
kazu634@test02% sudo systemctl enable multipath-tools.service
Synchronizing state of multipath-tools.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable multipath-tools
Created symlink /etc/systemd/system/multipath-tools.service → /lib/systemd/system/multipathd.service.
Created symlink /etc/systemd/system/sysinit.target.wants/multipathd.service → /lib/systemd/system/multipathd.service.
Created symlink /etc/systemd/system/sockets.target.wants/multipathd.socket → /lib/systemd/system/multipathd.socket.

kazu634@test02% sudo service multipath-tools restart

kazu634@test02% sudo systemctl status multipath-tools.service
multipathd.service - Device-Mapper Multipath Device Controller
     Loaded: loaded (/lib/systemd/system/multipathd.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2021-12-29 12:00:21 JST; 1min 26s ago
TriggeredBy: ● multipathd.socket
    Process: 28848 ExecStartPre=/sbin/modprobe -a scsi_dh_alua scsi_dh_emc scsi_dh_rdac dm-multipath (c>
   Main PID: 28849 (multipathd)
     Status: "up"
      Tasks: 7
     Memory: 10.7M
     CGroup: /system.slice/multipathd.service
             └─28849 /sbin/multipathd -d -s

12月 29 12:01:36 test02 multipathd[28849]: sda: failed to get sysfs uid: Invalid argument
12月 29 12:01:36 test02 multipathd[28849]: sda: failed to get sgio uid: No such file or directory
12月 29 12:01:41 test02 multipathd[28849]: sda: add missing path
12月 29 12:01:41 test02 multipathd[28849]: sda: failed to get udev uid: Invalid argument
12月 29 12:01:41 test02 multipathd[28849]: sda: failed to get sysfs uid: Invalid argument
12月 29 12:01:41 test02 multipathd[28849]: sda: failed to get sgio uid: No such file or directory
12月 29 12:01:46 test02 multipathd[28849]: sda: add missing path
12月 29 12:01:46 test02 multipathd[28849]: sda: failed to get udev uid: Invalid argument

以下のようにコマンドを実行します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
kazu634@test02% sudo systemctl enable open-iscsi.service
Synchronizing state of open-iscsi.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable open-iscsi

kazu634@test02% sudo service open-iscsi start

kazu634@test02% sudo systemctl status open-iscsi
● open-iscsi.service - Login to default iSCSI targets
     Loaded: loaded (/lib/systemd/system/open-iscsi.service; enabled; vendor preset: enabled)
     Active: active (exited) since Wed 2021-12-29 12:03:38 JST; 8s ago
       Docs: man:iscsiadm(8)
             man:iscsid(8)
    Process: 29166 ExecStart=/sbin/iscsiadm -m node --loginall=automatic (code=exited, status=21)
    Process: 29167 ExecStart=/lib/open-iscsi/activate-storage.sh (code=exited, status=0/SUCCESS)
   Main PID: 29167 (code=exited, status=0/SUCCESS)

12月 29 12:03:38 test02 systemd[1]: Starting Login to default iSCSI targets...
12月 29 12:03:38 test02 iscsiadm[29166]: iscsiadm: No records found
12月 29 12:03:38 test02 systemd[1]: Finished Login to default iSCSI targets.   

先ほど書いたようにnomadのCSIサポートは成熟していないため、次のようなことを色々としてあげる必要があります。

democratic-csiControllerコンポーネントはnomadBridgeネットワークで動作させる必要があるのですが、Bridgeネットワークで動作させるためには、手動でCNIプラグインをインストールする必要がありました。。さらにCNIプラグインをインストールするためには、Golangが必要なのでした。。

次のようにしてGolangをインストールします:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
kazu634@test02% sudo add-apt-repository ppa:longsleep/golang-backports
 Golang 1.8, 1.9, 1.10, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16 and 1.17 PPA for Ubuntu
 More info: https://launchpad.net/~longsleep/+archive/ubuntu/golang-backports
Press [ENTER] to continue or Ctrl-c to cancel adding it.
ヒット:1 http://192.168.10.200:8080/ubuntu/apt-mirror/mirror/jp.archive.ubuntu.com/ubuntu focal InRelease
ヒット:2 http://192.168.10.200:8080/ubuntu/apt-mirror/mirror/jp.archive.ubuntu.com/ubuntu focal-updates InRelease
ヒット:3 http://192.168.10.200:8080/ubuntu/apt-mirror/mirror/jp.archive.ubuntu.com/ubuntu focal-backports InRelease
ヒット:4 http://192.168.10.200:8080/ubuntu/apt-mirror/mirror/jp.archive.ubuntu.com/ubuntu focal-security InRelease
ヒット:5 https://download.docker.com/linux/ubuntu focal InRelease                                      
ヒット:6 https://apt.releases.hashicorp.com focal InRelease                                            
取得:7 https://repositories.timber.io/public/vector/deb/ubuntu focal InRelease [4,932 B]               
取得:8 https://repositories.timber.io/public/vector/deb/ubuntu focal/main amd64 Packages [2,815 B]
ヒット:9 http://ppa.launchpad.net/git-core/ppa/ubuntu focal InRelease
取得:10 http://ppa.launchpad.net/longsleep/golang-backports/ubuntu focal InRelease [17.5 kB]
取得:11 http://ppa.launchpad.net/longsleep/golang-backports/ubuntu focal/main amd64 Packages [3,196 B]
取得:12 http://ppa.launchpad.net/longsleep/golang-backports/ubuntu focal/main Translation-en [1,768 B]
30.3 kB を 2秒 で取得しました (14.5 kB/s)                      
パッケージリストを読み込んでいます... 完了

kazu634@test02% apt update
ヒット:1 http://192.168.10.200:8080/ubuntu/apt-mirror/mirror/jp.archive.ubuntu.com/ubuntu focal InRelease
ヒット:2 http://192.168.10.200:8080/ubuntu/apt-mirror/mirror/jp.archive.ubuntu.com/ubuntu focal-updates InRelease
ヒット:3 http://192.168.10.200:8080/ubuntu/apt-mirror/mirror/jp.archive.ubuntu.com/ubuntu focal-backports InRelease
ヒット:4 http://192.168.10.200:8080/ubuntu/apt-mirror/mirror/jp.archive.ubuntu.com/ubuntu focal-security InRelease
ヒット:5 https://download.docker.com/linux/ubuntu focal InRelease              
ヒット:6 https://apt.releases.hashicorp.com focal InRelease                           
取得:7 https://repositories.timber.io/public/vector/deb/ubuntu focal InRelease [4,932 B]
ヒット:8 http://ppa.launchpad.net/git-core/ppa/ubuntu focal InRelease
ヒット:9 http://ppa.launchpad.net/longsleep/golang-backports/ubuntu focal InRelease
4,932 B を 1秒 で取得しました (3,617 B/s)                     
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています       
状態情報を読み取っています... 完了
アップグレードできるパッケージが 1 個あります。表示するには 'apt list --upgradable' を実行してください

kazu634@test02% apt install golang
パッケージリストを読み込んでいます... 完了                                                              
依存関係ツリーを作成しています                                                                          
状態情報を読み取っています... 完了                                                                      
以下の追加パッケージがインストールされます:                                                             
  golang-1.17 golang-1.17-doc golang-1.17-go golang-1.17-src golang-doc golang-go golang-src            
  pkg-config                                                                                            
提案パッケージ:
  bzr | brz mercurial subversion
以下のパッケージが新たにインストールされます:
  golang golang-1.17 golang-1.17-doc golang-1.17-go golang-1.17-src golang-doc golang-go golang-src
  pkg-config
アップグレード: 0 個、新規インストール: 9 個、削除: 0 個、保留: 1 個。
72.0 MB のアーカイブを取得する必要があります。
この操作後に追加で 424 MB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://192.168.10.200:8080/ubuntu/apt-mirror/mirror/jp.archive.ubuntu.com/ubuntu focal/main amd64
 pkg-config amd64 0.29.1-0ubuntu4 [45.5 kB]
取得:2 http://ppa.launchpad.net/longsleep/golang-backports/ubuntu focal/main amd64 golang-1.17-doc all 1
.17.5-1longsleep1+focal [105 kB]
取得:3 http://ppa.launchpad.net/longsleep/golang-backports/ubuntu focal/main amd64 golang-1.17-src all 1
.17.5-1longsleep1+focal [15.2 MB]
取得:4 http://ppa.launchpad.net/longsleep/golang-backports/ubuntu focal/main amd64 golang-1.17-go amd64 
1.17.5-1longsleep1+focal [56.6 MB]
取得:5 http://ppa.launchpad.net/longsleep/golang-backports/ubuntu focal/main amd64 golang-1.17 all 1.17.
5-1longsleep1+focal [27.9 kB]
取得:6 http://ppa.launchpad.net/longsleep/golang-backports/ubuntu focal/main amd64 golang-src amd64 2:1.
17~1longsleep1 [5,056 B]
取得:7 http://ppa.launchpad.net/longsleep/golang-backports/ubuntu focal/main amd64 golang-go amd64 2:1.1
7~1longsleep1 [24.1 kB]
取得:8 http://ppa.launchpad.net/longsleep/golang-backports/ubuntu focal/main amd64 golang-doc all 2:1.17
~1longsleep1 [5,052 B]
取得:9 http://ppa.launchpad.net/longsleep/golang-backports/ubuntu focal/main amd64 golang amd64 2:1.17~1
longsleep1 [5,008 B]
72.0 MB を 15秒 で取得しました (4,900 kB/s)                                                             
以前に未選択のパッケージ golang-1.17-doc を選択しています。
(データベースを読み込んでいます .1. 現在c81861 個のファイルとディレクトリがインストールされています。)
.../0-golang-1.17-doc_1.17.5-1longsleep1+focal_all.deb を展開する準備をしています ...
golang-1.17-doc (1.17.5-1longsleep1+focal) を展開しています... 
以前に未選択のパッケージ golang-1.17-src を選択しています。
.../1-golang-1.17-src_1.17.5-1longsleep1+focal_all.deb を展開する準備をしています ...
golang-1.17-src (1.17.5-1longsleep1+focal) を展開しています... 
以前に未選択のパッケージ golang-1.17-go を選択しています。 
.../2-golang-1.17-go_1.17.5-1longsleep1+focal_amd64.deb を展開する準備をしています ...
golang-1.17-go (1.17.5-1longsleep1+focal) を展開しています... 
以前に未選択のパッケージ golang-1.17 を選択しています。 
.../3-golang-1.17_1.17.5-1longsleep1+focal_all.deb を展開する準備をしています ...
golang-1.17 (1.17.5-1longsleep1+focal) を展開しています... 
以前に未選択のパッケージ golang-src:amd64 を選択しています
1948
.../4-golang-src_2%3a1.17~1longsleep1_amd64.deb を展開する準備をしています ...
golang-src:amd64 (2:1.17~1longsleep1) を展開しています... 
以前に未選択のパッケージ golang-go を選択しています。 
.../5-golang-go_2%3a1.17~1longsleep1_amd64.deb を展開する準備をしています ...
golang-go (2:1.17~1longsleep1) を展開しています... 
以前に未選択のパッケージ golang-doc を選択しています。
.../6-golang-doc_2%3a1.17~1longsleep1_all.deb を展開する準備をしています ...
golang-doc (2:1.17~1longsleep1) を展開しています... 
以前に未選択のパッケージ golang:amd64 を選択しています。
.../7-golang_2%3a1.17~1longsleep1_amd64.deb を展開する準備をしています ...
golang:amd64 (2:1.17~1longsleep1) を展開しています... 
以前に未選択のパッケージ pkg-config を選択しています。
.../8-pkg-config_0.29.1-0ubuntu4_amd64.deb を展開する準備をしています ...
pkg-config (0.29.1-0ubuntu4) を展開しています... 
golang-1.17-doc (1.17.5-1longsleep1+focal) を設定しています ...
golang-1.17-src (1.17.5-1longsleep1+focal) を設定しています ...
pkg-config (0.29.1-0ubuntu4) を設定しています ...
golang-1.17-go (1.17.5-1longsleep1+focal) を設定しています ...
golang-src:amd64 (2:1.17~1longsleep1) を設定しています ...
golang-go (2:1.17~1longsleep1) を設定しています ... 
golang-1.17 (1.17.5-1longsleep1+focal) を設定しています ...
golang-doc (2:1.17~1longsleep1) を設定しています ... 
golang:amd64 (2:1.17~1longsleep1) を設定しています ...
man-db (2.9.1-1) のトリガを処理しています ... 

kazu634@test02% which go
/usr/bin/go

kazu634@test02% go version
go version go1.17.5 linux/amd64

ようやくCNIプラグインをインストールしていきます。まずはCNIプラグインをビルドします。Makefileなどはなく、build_linux.shを実行します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
kazu634@test02% git clone https://github.com/containernetworking/plugins.git
Cloning into 'plugins'...
remote: Enumerating objects: 13094, done.
remote: Counting objects: 100% (1813/1813), done.
remote: Compressing objects: 100% (1125/1125), done.
remote: Total 13094 (delta 780), reused 1431 (delta 621), pack-reused 11281
Receiving objects: 100% (13094/13094), 10.98 MiB | 9.59 MiB/s, done.
Resolving deltas: 100% (6885/6885), done.

kazu634@test02% cd plugins/
kazu634@test02% ./build_linux.sh
Building plugins 
  bandwidth
  firewall
  portmap
  sbr
  tuning
  vrf
  bridge
  host-device
  ipvlan
  loopback
  macvlan
  ptp
  vlan
  dhcp
  host-local
  static

kazu634@test02% ll bin/
合計 63M
drwxrwxr-x  2 kazu634 kazu634 4.0K 12月 29 12:15 .
drwxrwxr-x 10 kazu634 kazu634 4.0K 12月 29 12:15 ..
-rwxrwxr-x  1 kazu634 kazu634 3.7M 12月 29 12:15 bandwidth
-rwxrwxr-x  1 kazu634 kazu634 4.1M 12月 29 12:15 bridge
-rwxrwxr-x  1 kazu634 kazu634 9.4M 12月 29 12:15 dhcp
-rwxrwxr-x  1 kazu634 kazu634 4.2M 12月 29 12:15 firewall
-rwxrwxr-x  1 kazu634 kazu634 3.7M 12月 29 12:15 host-device
-rwxrwxr-x  1 kazu634 kazu634 3.2M 12月 29 12:15 host-local
-rwxrwxr-x  1 kazu634 kazu634 3.9M 12月 29 12:15 ipvlan
-rwxrwxr-x  1 kazu634 kazu634 3.2M 12月 29 12:15 loopback
-rwxrwxr-x  1 kazu634 kazu634 3.9M 12月 29 12:15 macvlan
-rwxrwxr-x  1 kazu634 kazu634 3.6M 12月 29 12:15 portmap
-rwxrwxr-x  1 kazu634 kazu634 4.0M 12月 29 12:15 ptp
-rwxrwxr-x  1 kazu634 kazu634 3.4M 12月 29 12:15 sbr
-rwxrwxr-x  1 kazu634 kazu634 2.8M 12月 29 12:15 static
-rwxrwxr-x  1 kazu634 kazu634 3.4M 12月 29 12:15 tuning
-rwxrwxr-x  1 kazu634 kazu634 3.8M 12月 29 12:15 vlan
-rwxrwxr-x  1 kazu634 kazu634 3.4M 12月 29 12:15 vrf

ビルドしたコマンドを任意のディレクトリに格納します。今回は/opt/cni/binとしました:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
kazu634@test02% cd bin/
./   bandwidth*  dhcp*      host-device*  ipvlan*    macvlan*  ptp*  static*  vlan*                     
../  bridge*     firewall*  host-local*   loopback*  portmap*  sbr*  tuning*  vrf*                      
kazu634@test02% sudo chown root:root *
kazu634@test02% ll
合計 63M                                                                                                
drwxrwxr-x  2 kazu634 kazu634 4.0K 12月 29 12:15 .                                                      
drwxrwxr-x 10 kazu634 kazu634 4.0K 12月 29 12:15 .. 
-rwxrwxr-x  1 root    root    3.7M 12月 29 12:15 bandwidth
-rwxrwxr-x  1 root    root    4.1M 12月 29 12:15 bridge
-rwxrwxr-x  1 root    root    9.4M 12月 29 12:15 dhcp
-rwxrwxr-x  1 root    root    4.2M 12月 29 12:15 firewall
-rwxrwxr-x  1 root    root    3.7M 12月 29 12:15 host-device
-rwxrwxr-x  1 root    root    3.2M 12月 29 12:15 host-local
-rwxrwxr-x  1 root    root    3.9M 12月 29 12:15 ipvlan
-rwxrwxr-x  1 root    root    3.2M 12月 29 12:15 loopback
-rwxrwxr-x  1 root    root    3.9M 12月 29 12:15 macvlan
-rwxrwxr-x  1 root    root    3.6M 12月 29 12:15 portmap
-rwxrwxr-x  1 root    root    4.0M 12月 29 12:15 ptp
-rwxrwxr-x  1 root    root    3.4M 12月 29 12:15 sbr
-rwxrwxr-x  1 root    root    2.8M 12月 29 12:15 static
-rwxrwxr-x  1 root    root    3.4M 12月 29 12:15 tuning
-rwxrwxr-x  1 root    root    3.8M 12月 29 12:15 vlan
-rwxrwxr-x  1 root    root    3.4M 12月 29 12:15 vrf
kazu634@test02% sudo mkdir -p /opt/cni/bin/
kazu634@test02% sudo mv * /opt/cni/bin/
kazu634@test02% ll /opt/cni/bin/
合計 63M
drwxr-xr-x 2 root root 4.0K 12月 29 12:18 .
drwxr-xr-x 3 root root 4.0K 12月 29 12:18 ..
-rwxrwxr-x 1 root root 3.7M 12月 29 12:15 bandwidth
-rwxrwxr-x 1 root root 4.1M 12月 29 12:15 bridge
-rwxrwxr-x 1 root root 9.4M 12月 29 12:15 dhcp
-rwxrwxr-x 1 root root 4.2M 12月 29 12:15 firewall
-rwxrwxr-x 1 root root 3.7M 12月 29 12:15 host-device
-rwxrwxr-x 1 root root 3.2M 12月 29 12:15 host-local
-rwxrwxr-x 1 root root 3.9M 12月 29 12:15 ipvlan
-rwxrwxr-x 1 root root 3.2M 12月 29 12:15 loopback
-rwxrwxr-x 1 root root 3.9M 12月 29 12:15 macvlan
-rwxrwxr-x 1 root root 3.6M 12月 29 12:15 portmap
-rwxrwxr-x 1 root root 4.0M 12月 29 12:15 ptp
-rwxrwxr-x 1 root root 3.4M 12月 29 12:15 sbr                     
-rwxrwxr-x 1 root root 2.8M 12月 29 12:15 static
-rwxrwxr-x 1 root root 3.4M 12月 29 12:15 tuning
-rwxrwxr-x 1 root root 3.8M 12月 29 12:15 vlan
-rwxrwxr-x 1 root root 3.4M 12月 29 12:15 vrf

以下の内容で/etc/cni/nomad.conflistというファイル名で保存します。拡張子は必ず.conflist にしましょう。nomadは拡張子.conflistを読み込みます:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
  "cniVersion": "0.3.1",
  "name": "nomad",
  "plugins": [
    {
      "type": "ptp",
      "ipMasq": true,
      "ipam": {
        "type": "host-local",
        "subnet": "172.16.30.0/24",
        "routes": [
          {
            "dst": "0.0.0.0/0"
          }
        ]
      }
    },
    {
      "type": "portmap",
      "capabilities": { "portMappings": true }
    }
  ]
}

nomadの設定ファイルに以下の記述を追加します:

1
2
3
4
5
6
client {
  enabled          = true

  cni_path = "/opt/cni/bin"
  cni_config_dir = "/etc/cni/"                                                          
}

/etc/nomad.d/csi.hclに以下の内容を書き込みます:

1
2
3
4
5
6
7
8
9
plugin "docker" {
  config {
    volumes {
      enabled = true
    }

    allow_privileged = true
  }
}

設定を反映させるために、nomadの再起動を忘れずに。以上の作業をnoamdサーバ3台で実施します。

CSIプラグインのまずはControllerを起動させます。ここからはnomadのジョブ定義となります。Nomad Supportを参考にしていきます。ただ、個々の記述も最新の記述とは言えず、試行錯誤したのはここだけの話。Synology NASで動作させるためには、democratic-csi/docs/Nomad/examplesも合わせて読む必要がありました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
job "storage-controller" {
  datacenters = ["dc1"]
  type        = "service"

  group "controller" {
    network {
      mode = "bridge"

      port "grpc" {
        static = 9000
        to     = 9000
      }
    }

    task "controller" {
      driver = "docker"

      config {
        image = "democraticcsi/democratic-csi:latest"
        ports = ["grpc"]

        args = [
          "--csi-version=1.2.0",
          "--csi-name=org.democratic-csi.iscsi",
          "--driver-config-file=${NOMAD_TASK_DIR}/driver-config-file.yaml",
          "--log-level=debug",
          "--csi-mode=controller",
          "--server-socket=/csi/csi.sock",
          "--server-address=0.0.0.0",
          "--server-port=9000",
        ]
      }

      csi_plugin {
        id        = "org.democratic-csi.iscsi"
        type      = "controller"
        mount_dir = "/csi"
      }

      template {
        destination = "${NOMAD_TASK_DIR}/driver-config-file.yaml"

        data = <<EOH
ここに設定を記述する
EOH
      }

      resources {
        cpu    = 500
        memory = 256
      }
    }
  }
}

「ここに設定を記述する」の部分は以下のように記述します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
driver: synology-iscsi
httpConnection:
  # NASの管理コンソールのプロトコル (http or https)
  protocol: http
  # NASのIPアドレス
  host: 192.168.10.200
  # ポート番号 (通常はhttp 5000, https 5001)
  port: 5000
  # 管理者ユーザーのユーザー名
  username: admin
  # パスワード
  password: Holiday88
  # httpsの場合、証明書の検証結果を無視するかどうか(true: 無視する)
  allowInsecure: true
  # should be uniqe across all installs to the same nas
  session: "democratic-csi"
  serialize: true

synology:
  # choose the proper volume for your system
  # ここはNAS上のボリューム名を指定する
  volume: /volume1

iscsi:
  # NASのIPアドレス
  targetPortal: "192.168.10.200"
  # for multipath
  targetPortals: [] # [ "server[:port]", "server[:port]", ... ]
  # leave empty to omit usage of -I with iscsiadm
  interface: ""
  # NAS側にターゲット作成する際のターゲット名の基準となる名前
  baseiqn: "iqn.2000-01.com.synology:ds418.nomad.target-"

  # MUST ensure uniqueness
  # full iqn limit is 223 bytes, plan accordingly
  namePrefix: ""
  nameSuffix: ""

  # documented below are several blocks
  # pick the option appropriate for you based on what your backing fs is and desired features
  # you do not need to alter dev_attribs under normal circumstances but they may be altered in advanced use-cases
  lunTemplate:
    # btrfs thin provisioning
    type: "BLUN"
    # tpws = Hardware-assisted zeroing
    # caw = Hardware-assisted locking
    # 3pc = Hardware-assisted data transfer
    # tpu = Space reclamation
    # can_snapshot = Snapshot
    #dev_attribs:
    #- dev_attrib: emulate_tpws
    #  enable: 1
    #- dev_attrib: emulate_caw
    #  enable: 1
    #- dev_attrib: emulate_3pc
    #  enable: 0
    #- dev_attrib: can_snapshot
    #  enable: 1

    # btfs thick provisioning
    # only zeroing and locking supported
    #type: "BLUN_THICK"
    # tpws = Hardware-assisted zeroing
    # caw = Hardware-assisted locking
    #dev_attribs:
    #- dev_attrib: emulate_tpws
    #  enable: 1
    #- dev_attrib: emulate_caw
    #  enable: 1

    # ext4 thinn provisioning UI sends everything with enabled=0
    #type: "THIN"

    # ext4 thin with advanced legacy features set
    # can only alter tpu (all others are set as enabled=1)
    #type: "ADV"
    #dev_attribs:
    #- dev_attrib: emulate_tpu
    #  enable: 1

    # ext4 thick
    # can only alter caw
    #type: "FILE"
    #dev_attribs:
    #- dev_attrib: emulate_caw
    #  enable: 1

  lunSnapshotTemplate:
    is_locked: true
    # https://kb.synology.com/en-me/DSM/tutorial/What_is_file_system_consistent_snapshot
    is_app_consistent: true

  targetTemplate:
    auth_type: 0
    max_sessions: 0

一つにまとめるとこうなります:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
job "storage-controller" {
  datacenters = ["dc1"]
  type        = "service"

  group "controller" {
    network {
      mode = "bridge"

      port "grpc" {
        static = 9000
        to     = 9000
      }
    }

    task "controller" {
      driver = "docker"

      config {
        image = "democraticcsi/democratic-csi:latest"
        ports = ["grpc"]

        args = [
          "--csi-version=1.2.0",
          "--csi-name=org.democratic-csi.iscsi",
          "--driver-config-file=${NOMAD_TASK_DIR}/driver-config-file.yaml",
          "--log-level=debug",
          "--csi-mode=controller",
          "--server-socket=/csi/csi.sock",
          "--server-address=0.0.0.0",
          "--server-port=9000",
        ]
      }

      csi_plugin {
        id        = "org.democratic-csi.iscsi"
        type      = "controller"
        mount_dir = "/csi"
      }

      template {
        destination = "${NOMAD_TASK_DIR}/driver-config-file.yaml"

        data = <<EOH
driver: synology-iscsi
httpConnection:
  # NASの管理コンソールのプロトコル (http or https)
  protocol: http
  # NASのIPアドレス
  host: 192.168.10.200
  # ポート番号 (通常はhttp 5000, https 5001)
  port: 5000
  # 管理者ユーザーのユーザー名
  username: admin
  # パスワード
  password: Holiday88
  # httpsの場合、証明書の検証結果を無視するかどうか(true: 無視する)
  allowInsecure: true
  # should be uniqe across all installs to the same nas
  session: "democratic-csi"
  serialize: true

synology:
  # choose the proper volume for your system
  # ここはNAS上のボリューム名を指定する
  volume: /volume1

iscsi:
  # NASのIPアドレス
  targetPortal: "192.168.10.200"
  # for multipath
  targetPortals: [] # [ "server[:port]", "server[:port]", ... ]
  # leave empty to omit usage of -I with iscsiadm
  interface: ""
  # NAS側にターゲット作成する際のターゲット名の基準となる名前
  baseiqn: "iqn.2000-01.com.synology:ds418.nomad.target-"

  # MUST ensure uniqueness
  # full iqn limit is 223 bytes, plan accordingly
  namePrefix: ""
  nameSuffix: ""

  # documented below are several blocks
  # pick the option appropriate for you based on what your backing fs is and desired features
  # you do not need to alter dev_attribs under normal circumstances but they may be altered in advanced use-cases
  lunTemplate:
    # btrfs thin provisioning
    type: "BLUN"
    # tpws = Hardware-assisted zeroing
    # caw = Hardware-assisted locking
    # 3pc = Hardware-assisted data transfer
    # tpu = Space reclamation
    # can_snapshot = Snapshot
    #dev_attribs:
    #- dev_attrib: emulate_tpws
    #  enable: 1
    #- dev_attrib: emulate_caw
    #  enable: 1
    #- dev_attrib: emulate_3pc
    #  enable: 0
    #- dev_attrib: can_snapshot
    #  enable: 1

    # btfs thick provisioning
    # only zeroing and locking supported
    #type: "BLUN_THICK"
    # tpws = Hardware-assisted zeroing
    # caw = Hardware-assisted locking
    #dev_attribs:
    #- dev_attrib: emulate_tpws
    #  enable: 1
    #- dev_attrib: emulate_caw
    #  enable: 1

    # ext4 thinn provisioning UI sends everything with enabled=0
    #type: "THIN"

    # ext4 thin with advanced legacy features set
    # can only alter tpu (all others are set as enabled=1)
    #type: "ADV"
    #dev_attribs:
    #- dev_attrib: emulate_tpu
    #  enable: 1

    # ext4 thick
    # can only alter caw
    #type: "FILE"
    #dev_attribs:
    #- dev_attrib: emulate_caw
    #  enable: 1

  lunSnapshotTemplate:
    is_locked: true
    # https://kb.synology.com/en-me/DSM/tutorial/What_is_file_system_consistent_snapshot
    is_app_consistent: true

  targetTemplate:
    auth_type: 0
    max_sessions: 0
EOH
      }

      resources {
        cpu    = 500
        memory = 256
      }
    }
  }
}

それではジョブを実行させます:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
kazu634@test02% nomad job run controller.nomad
==> 2021-12-29T14:22:33+09:00: Monitoring evaluation "bbb4d4af"                  
    2021-12-29T14:22:33+09:00: Evaluation triggered by job "storage-controller"     
==> 2021-12-29T14:22:34+09:00: Monitoring evaluation "bbb4d4af"
    2021-12-29T14:22:34+09:00: Evaluation within deployment: "b8269ab5"
    2021-12-29T14:22:34+09:00: Allocation "a9500c24" created: node "84bb93d7", group "controller"
    2021-12-29T14:22:34+09:00: Evaluation status changed: "pending" -> "complete"
==> 2021-12-29T14:22:34+09:00: Evaluation "bbb4d4af" finished with status "complete"
==> 2021-12-29T14:22:34+09:00: Monitoring deployment "b8269ab5"
  ✓ Deployment "b8269ab5" successful
     
    2021-12-29T14:23:04+09:00
    ID          = b8269ab5 
    Job ID      = storage-controller
    Job Version = 0
    Status      = successful
    Description = Deployment completed successfully
     
    Deployed
    Task Group  Desired  Placed  Healthy  Unhealthy  Progress Deadline
    controller  1        1       1        0          2021-12-29T14:33:02+09:00

kazu634@test02% nomad job status storage-controller
ID            = storage-controller                                                                      
Name          = storage-controller                                                                      
Submit Date   = 2021-12-29T14:22:33+09:00                                                               
Type          = service                                                                                 
Priority      = 50
Datacenters   = dc1
Namespace     = default
Status        = running
Periodic      = false
Parameterized = false

Summary
Task Group  Queued  Starting  Running  Failed  Complete  Lost
controller  0       0         1        0       0         0

Latest Deployment
ID          = b8269ab5
Status      = successful
Description = Deployment completed successfully

Deployed
Task Group  Desired  Placed  Healthy  Unhealthy  Progress Deadline
controller  1        1       1        0          2021-12-29T14:33:02+09:00

Allocations
ID        Node ID   Task Group  Version  Desired  Status   Created    Modified
a9500c24  84bb93d7  controller  0        run      running  6m44s ago  6m14s ago

CSIの各ノードで動作させるジョブを起動します。ジョブ定義はこんな感じです:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
job "storage-node" {
  datacenters = ["dc1"]
  type        = "system"

  group "node" {
    task "node" {
      driver = "docker"

      env {
        CSI_NODE_ID = "${attr.unique.hostname}"
      }

      config {
        image = "democraticcsi/democratic-csi:latest"

        args = [
          "--csi-version=1.2.0",
          "--csi-name=org.democratic-csi.iscsi",
          "--driver-config-file=${NOMAD_TASK_DIR}/driver-config-file.yaml",
          "--log-level=debug",
          "--csi-mode=node",
          "--server-socket=/csi/csi.sock",
        ]

        privileged = true
        ipc_mode = "host"
        network_mode = "host"

        mount {
          type = "bind"
          target = "/host"
          source = "/"
          readonly = false
        }
      }

      csi_plugin {
        id        = "org.democratic-csi.iscsi"
        type      = "node"
        mount_dir = "/csi"
      }

      template {
        destination = "${NOMAD_TASK_DIR}/driver-config-file.yaml"

        data = <<EOH
driver: synology-iscsi
httpConnection:
  # NASの管理コンソールのプロトコル (http or https)
  protocol: http
  # NASのIPアドレス
  host: 192.168.10.200
  # ポート番号 (通常はhttp 5000, https 5001)
  port: 5000
  # 管理者ユーザーのユーザー名
  username: admin
  # パスワード
  password: Holiday88
  # httpsの場合、証明書の検証結果を無視するかどうか(true: 無視する)
  allowInsecure: true
  # should be uniqe across all installs to the same nas
  session: "democratic-csi"
  serialize: true

synology:
  # choose the proper volume for your system
  # ここはNAS上のボリューム名を指定する
  volume: /volume1

iscsi:
  # NASのIPアドレス
  targetPortal: "192.168.10.200"
  # for multipath
  targetPortals: [] # [ "server[:port]", "server[:port]", ... ]
  # leave empty to omit usage of -I with iscsiadm
  interface: ""
  # NAS側にターゲット作成する際のターゲット名の基準となる名前
  baseiqn: "iqn.2000-01.com.synology:ds418.nomad.target-"

  # MUST ensure uniqueness
  # full iqn limit is 223 bytes, plan accordingly
  namePrefix: ""
  nameSuffix: ""

  # documented below are several blocks
  # pick the option appropriate for you based on what your backing fs is and desired features
  # you do not need to alter dev_attribs under normal circumstances but they may be altered in advanced use-cases
  lunTemplate:
    # btrfs thin provisioning
    type: "BLUN"
    # tpws = Hardware-assisted zeroing
    # caw = Hardware-assisted locking
    # 3pc = Hardware-assisted data transfer
    # tpu = Space reclamation
    # can_snapshot = Snapshot
    #dev_attribs:
    #- dev_attrib: emulate_tpws
    #  enable: 1
    #- dev_attrib: emulate_caw
    #  enable: 1
    #- dev_attrib: emulate_3pc
    #  enable: 0
    #- dev_attrib: can_snapshot
    #  enable: 1

    # btfs thick provisioning
    # only zeroing and locking supported
    #type: "BLUN_THICK"
    # tpws = Hardware-assisted zeroing
    # caw = Hardware-assisted locking
    #dev_attribs:
    #- dev_attrib: emulate_tpws
    #  enable: 1
    #- dev_attrib: emulate_caw
    #  enable: 1

    # ext4 thinn provisioning UI sends everything with enabled=0
    #type: "THIN"

    # ext4 thin with advanced legacy features set
    # can only alter tpu (all others are set as enabled=1)
    #type: "ADV"
    #dev_attribs:
    #- dev_attrib: emulate_tpu
    #  enable: 1

    # ext4 thick
    # can only alter caw
    #type: "FILE"
    #dev_attribs:
    #- dev_attrib: emulate_caw
    #  enable: 1

  lunSnapshotTemplate:
    is_locked: true
    # https://kb.synology.com/en-me/DSM/tutorial/What_is_file_system_consistent_snapshot
    is_app_consistent: true

  targetTemplate:
    auth_type: 0
    max_sessions: 0
EOH
      }

      resources {
        cpu    = 500
        memory = 256
      }
    }
  }
}

それではジョブを実行してみます:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
kazu634@test02% nomad job run storage-node.nomad
==> 2021-12-29T14:24:03+09:00: Monitoring evaluation "ed30d050"                                         
    2021-12-29T14:24:03+09:00: Evaluation triggered by job "storage-node"                               
    2021-12-29T14:24:03+09:00: Allocation "ee10d0e6" created: node "84bb93d7", group "node"             
==> 2021-12-29T14:24:04+09:00: Monitoring evaluation "ed30d050"                                         
    2021-12-29T14:24:04+09:00: Evaluation status changed: "pending" -> "complete"                       
==> 2021-12-29T14:24:04+09:00: Evaluation "ed30d050" finished with status "complete" 

kazu634@test02% nomad job status storage-node
ID            = storage-node
Name          = storage-node
Submit Date   = 2021-12-29T14:24:03+09:00
Type          = system
Priority      = 50
Datacenters   = dc1
Namespace     = default
Status        = running
Periodic      = false
Parameterized = false

Summary
Task Group  Queued  Starting  Running  Failed  Complete  Lost
node        0       0         1        0       0         0

Allocations
ID        Node ID   Task Group  Version  Desired  Status   Created     Modified
ee10d0e6  84bb93d7  node        0        run      running  12m55s ago  12m48s ago

Stateful Workloads with Container Storage Interface | Nomad - HashiCorp Learnを参考にして、動作確認をしていきます。

次のようなストレージ定義を作成します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
id           = "mysql"                                                                                  
name         = "mysql"    
type         = "csi"
plugin_id = "org.democratic-csi.iscsi"
capacity_min = "3GiB"
capacity_max = "5GiB"

capability {
  access_mode     = "single-node-writer"
  attachment_mode = "file-system"
} 

mount_options {
}

これをstorage-mysql.hclとして保存し、ストレージを作成します:

1
2
kazu634@test02% nomad volume create storage-mysql.hcl
Created external volume mysql with ID mysql

作成したストレージを確認してみます:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
kazu634@test02% nomad volume status
Container Storage Interface
ID     Name   Plugin ID                 Schedulable  Access Mode
mysql  mysql  org.democratic-csi.iscsi  true         <none>

kazu634@test02% nomad volume status mysql
ID                   = mysql
Name                 = mysql
External ID          = mysql
Plugin ID            = org.democratic-csi.iscsi
Provider             = org.democratic-csi.iscsi
Version              = 1.4.3
Schedulable          = true
Controllers Healthy  = 1
Controllers Expected = 1
Nodes Healthy        = 1
Nodes Expected       = 1
Access Mode          = <none>
Attachment Mode      = <none>
Mount Options        = <none>
Namespace            = default

Allocations
No allocations placed

次のジョブ定義を作成します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
job "mysql-server" {                                                                                    
  datacenters = ["dc1"]                                                                                 
  type        = "service"                                                                               
                                                                                                        
  group "mysql-server" {                                                                                
    count = 1                                                                                           
                                                                                                        
    volume "mysql" {                                                                                    
      type      = "csi"                                                                                 
      read_only = false                                                                                 
      source    = "mysql"                                                                               
                                                                                                        
      attachment_mode = "file-system"                                                                   
      access_mode     = "single-node-writer"                                                            
      per_alloc       = false                                                                           
    }                                                                                                   

    network {
      port "db" {
        static = 3306
      }
    } 

    restart {
      attempts = 10
      interval = "5m"
      delay    = "25s"
      mode     = "delay"
    }

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

      volume_mount {
        volume      = "mysql"
        destination = "/srv"
        read_only   = false
      }

      env {
        MYSQL_ROOT_PASSWORD = "password"
      }

      config {
        image = "hashicorp/mysql-portworx-demo:latest"
        args  = ["--datadir", "/srv/mysql"]
        ports = ["db"]
      }

      resources {
        cpu    = 500
        memory = 1024
      }

      service {
        name = "mysql-server"
        port = "db"

        check {
          type     = "tcp" 
          interval = "10s" 
          timeout  = "2s"
        }
      }
    }
  }
}

それではジョブを実行します:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
kazu634@test02% nomad job run mysql.nomad                                                               
==> 2021-12-29T14:51:29+09:00: Monitoring evaluation "6278f054"                                         
    2021-12-29T14:51:29+09:00: Evaluation triggered by job "mysql-server"                               
    2021-12-29T14:51:29+09:00: Evaluation within deployment: "ecf0f580"                                 
    2021-12-29T14:51:29+09:00: Evaluation status changed: "pending" -> "complete"                       
==> 2021-12-29T14:51:29+09:00: Evaluation "6278f054" finished with status "complete"                    
==> 2021-12-29T14:51:29+09:00: Monitoring deployment "ecf0f580"                                         
  ✓ Deployment "ecf0f580" successful                                                                    
                                                                                                        
    2021-12-29T14:53:29+09:00                                                                           
    ID          = ecf0f580                                                                              
    Job ID      = mysql-server                                                                          
    Job Version = 0                                                                                     
    Status      = successful                                                                            
    Description = Deployment completed successfully                                                     
                                                                                                        
    Deployed              
    Task Group    Desired  Placed  Healthy          
    Unhealthy  Progress Deadline                    
    mysql-server  1        4       1        3       
    2021-12-29T15:03:28+09:00

kazu634@test02% nomad job status mysql-server       
ID            = mysql-server                        
Name          = mysql-server                        
Submit Date   = 2021-12-29T14:49:15+09:00           
Type          = service   
Priority      = 50        
Datacenters   = dc1       
Namespace     = default   
Status        = running   
Periodic      = false     
Parameterized = false     

Summary                   
Task Group    Queued  Starting  Running  Failed  Complete  Lost
mysql-server  0       0         1        3       0         0

Latest Deployment         
ID          = ecf0f580    
Status      = successful  
Description = Deployment completed successfully     

Deployed                  
Task Group    Desired  Placed  Healthy  Unhealthy  Progress Deadline
mysql-server  1        4       1        3          2021-12-29T15:03:28+09:00

Allocations               
ID        Node ID   Task Group    Version  Desired  Status   Created    Modified
8eec5c5c  84bb93d7  mysql-server  0        run      running  1m56s ago  1m12s ago

kazu634@test02% nomad alloc status 8eec5c5c         
ID                  = 8eec5c5c-6010-a7e4-c766-951d24de372e
Eval ID             = 2f202164                      
Name                = mysql-server.mysql-server[0]  
Node ID             = 84bb93d7                      
Node Name           = test02                        
Job ID              = mysql-server                  
Job Version         = 0   
Client Status       = running                       
Client Description  = Tasks are running             
Desired Status      = run                           
Desired Description = <none>                        
Created             = 2m8s ago                      
Modified            = 1m24s ago                     
Deployment ID       = ecf0f580                      
Deployment Health   = healthy                       

Allocation Addresses      
Label  Dynamic  Address   
*db    yes      192.168.10.82:3306                  

Task "mysql-server" is "running"                    
Task Resources            
CPU        Memory           Disk     Addresses      
4/500 MHz  387 MiB/1.0 GiB  300 MiB                 

CSI Volumes:              
ID     Read Only          
mysql  false

Task Events:              
Started At     = 2021-12-29T05:53:13Z               
Finished At    = N/A      
Total Restarts = 0        
Last Restart   = N/A      

Recent Events:            
Time                       Type        Description  
2021-12-29T14:53:13+09:00  Started     Task started by client
2021-12-29T14:52:49+09:00  Driver      Downloading image
2021-12-29T14:52:49+09:00  Task Setup  Building Task Directory
2021-12-29T14:52:45+09:00  Received    Task received by client

kazu634@test02% nomad volume status mysql
ID                   = mysql                        
Name                 = mysql                        
External ID          = mysql                        
Plugin ID            = org.democratic-csi.iscsi     
Provider             = org.democratic-csi.iscsi     
Version              = 1.4.3                        
Schedulable          = true                         
Controllers Healthy  = 1  
Controllers Expected = 1  
Nodes Healthy        = 1  
Nodes Expected       = 1  
Access Mode          = single-node-writer           
Attachment Mode      = file-system                  
Mount Options        = <none>                       
Namespace            = default                      

Allocations               
ID                                    Node ID                               Task Group    Version  Desir
ed  Status   Created    Modified                    
8eec5c5c-6010-a7e4-c766-951d24de372e  84bb93d7-df8f-7376-3247-88e01498f1a9  mysql-server  0        run  
    running  2m19s ago  1m35s ago

うまく起動しない場合は、/etc/iscsi/nodes/配下を全て削除して、再度ジョブを実行してください。

うまく起動できたら、初期データの確認とデータの書き込みをします:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
kazu634@test02% mysql -h 192.168.10.82 -u web -p -D i
temcollection                                       
Enter password:           
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 50                      
Server version: 8.0.15 MySQL Community Server - GPL 

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.                   

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show tables;       
+--------------------------+                        
| Tables_in_itemcollection |                        
+--------------------------+                        
| items                    |                        
+--------------------------+                        
1 row in set (0.00 sec)

mysql> select * from items;                         
+----+----------+         
| id | name     |         
+----+----------+         
|  1 | bike     |         
|  2 | baseball |         
|  3 | chair    |         
+----+----------+         
3 rows in set (0.00 sec)  

mysql> INSERT INTO items (name) VALUES ('glove');   
Query OK, 1 row affected (0.03 sec)                 

mysql> select * from items;                         
+----+----------+         
| id | name     |         
+----+----------+         
|  1 | bike     |         
|  2 | baseball |         
|  3 | chair    |         
|  4 | glove    |         
+----+----------+         
4 rows in set (0.00 sec)  

mysql> INSERT INTO items (name) VALUES ('hat');     
Query OK, 1 row affected (0.01 sec)                 

mysql> INSERT INTO items (name) VALUES ('keyboard')

Query OK, 1 row affected (0.00 sec)                 

mysql> exit               
Bye

ここでこのジョブを停止してみます:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
kazu634@test02% nomad job stop -purge mysql-server                                                      
==> 2021-12-29T15:04:01+09:00: Monitoring evaluation "c30547e6"                                         
    2021-12-29T15:04:01+09:00: Evaluation triggered by job "mysql-server"                               
==> 2021-12-29T15:04:02+09:00: Monitoring evaluation "c30547e6"                                         
    2021-12-29T15:04:02+09:00: Evaluation within deployment: "ecf0f580"                                 
    2021-12-29T15:04:02+09:00: Evaluation status changed: "pending" -> "complete"                       
==> 2021-12-29T15:04:02+09:00: Evaluation "c30547e6" finished with status "complete"                    
==> 2021-12-29T15:04:02+09:00: Monitoring deployment "ecf0f580"                                         
  ✓ Deployment "ecf0f580" successful                
                          
    2021-12-29T15:04:02+09:00                       
    ID          = ecf0f580                          
    Job ID      = mysql-server                      
    Job Version = 0       
    Status      = successful                        
    Description = Deployment completed successfully 
                          
    Deployed              
    Task Group    Desired  Placed  Healthy          
    Unhealthy  Progress Deadline                    
    mysql-server  1        4       1        3       
    2021-12-29T15:03:28+09:00

kazu634@test02% nomad job status mysql-server       
No job(s) with prefix or id "mysql-server" found

再度このジョブを起動します:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
kazu634@test02% nomad job run mysql.nomad           
==> 2021-12-29T15:04:17+09:00: Monitoring evaluation "76147cde"
    2021-12-29T15:04:17+09:00: Evaluation triggered by job "mysql-server"
    2021-12-29T15:04:17+09:00: Allocation "ba132b91" created: node "84bb93d7", group "mysql-server"
==> 2021-12-29T15:04:18+09:00: Monitoring evaluation "76147cde"
    2021-12-29T15:04:18+09:00: Evaluation within deployment: "2b5617ef"
    2021-12-29T15:04:18+09:00: Evaluation status changed: "pending" -> "complete"
==> 2021-12-29T15:04:18+09:00: Evaluation "76147cde" finished with status "complete"
==> 2021-12-29T15:04:18+09:00: Monitoring deployment "2b5617ef"
  ✓ Deployment "2b5617ef" successful                
                          
    2021-12-29T15:04:45+09:00                       
    ID          = 2b5617ef                          
    Job ID      = mysql-server                      
    Job Version = 0       
    Status      = successful                        
    Description = Deployment completed successfully 
                          
    Deployed              
    Task Group    Desired  Placed  Healthy          
    Unhealthy  Progress Deadline                    
    mysql-server  1        1       1        0       
    2021-12-29T15:14:44+09:00

再度、mysqlに接続すると、データが永続化されていることがわかります (glove, hat, keyboardが存在します):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
kazu634@test02% mysql -h 192.168.10.82 -u web -p -D itemcollection
Enter password:           
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11                      
Server version: 8.0.15 MySQL Community Server - GPL 

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.                   

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select * from items;                         
+----+----------+         
| id | name     |         
+----+----------+         
|  1 | bike     |         
|  2 | baseball |         
|  3 | chair    |         
|  4 | glove    |         
|  5 | hat      |         
|  6 | keyboard |         
+----+----------+         
6 rows in set (0.00 sec)

以下、実行ください:

  • nomad job stop -purge mysql-server
  • nomad volume delete mysql