etcdctlコマンドの使い方

#1. etcdのデータベース
etcdのデータベースは、/var/lib/etcd（デフォルト)配下に格納される。
下記2つのサブディレクトリから構成される。walとsnapは別の場所に置くことが可能。

| ディレクトリの名前 | 用途 |
|:----------------------|:-------------------------|
| wal(write ahead log)  | write ahead log とは???  |
| snap  | snapshotsが保存される。snapshotsとは何?  |

#2. 環境
- 2台構成(ホスト名はmaster1,master2)



#3. 確認に使用したetcdcltコマンド版数

```
[root@master1 ~]# etcdctl --version
etcdctl version 2.3.7
```


#4. etcdctlコマンドの使い方


##4.1 ヘルプの使い方
```

etcdctlコマンドの後に-hオプションを付ける。
[root@master1 ~]# etcdctl -h
NAME:
   etcdctl - A simple command line client for etcd.

USAGE:
   etcdctl [global options] command [command options] [arguments...]

VERSION:
   2.3.7

COMMANDS:
   backup               backup an etcd directory
   cluster-health       check the health of the etcd cluster
   mk                   make a new key with a given value
   mkdir                make a new directory
   rm                   remove a key or a directory
   rmdir                removes the key if it is an empty directory or a key-value pair
   get                  retrieve the value of a key
   ls                   retrieve a directory
   set                  set the value of a key
   setdir               create a new directory or update an existing directory TTL
   update               update an existing key with a given value
   updatedir            update an existing directory
   watch                watch a key for changes
   exec-watch           watch a key for changes and exec an executable
   member               member add, remove and list subcommands
   import               import a snapshot to a cluster
   user                 user add, grant and revoke subcommands
   role                 role add, grant and revoke subcommands
   auth                 overall auth controls
   help, h              Shows a list of commands or help for one command

以下、略
```

##4.2 サブコマンドのヘルプの使い方

```
サブコマンドの後に-hオプションを付ける。
[root@master1 ~]# etcdctl ls -h
NAME:
   etcdctl ls - retrieve a directory

USAGE:
   etcdctl ls [command options] [key]

OPTIONS:
   --sort       returns result in sorted order
   --recursive  returns all key names recursively for the given path
   -p           append slash (/) to directories
   --quorum     require quorum for get request

[root@master1 ~]# etcdctl backup -h
NAME:
   etcdctl backup - backup an etcd directory

USAGE:
   etcdctl backup [command options]

OPTIONS:
   --data-dir           Path to the etcd data dir
   --wal-dir            Path to the etcd wal dir
   --backup-dir         Path to the backup dir
   --backup-wal-dir     Path to the backup wal dir
   --keep-cluster-id    Do not rewrite the cluster id
   --node-id            Use custom node id instead of a random value

```


##4.3 ディレクトリの作成
```
ディレクトリを表示する(ls)
[root@master1 ~]# etcdctl ls
/scheduler
/registry
/controller

/a/bというディレクトリを作る(mkdir)
[root@master1 ~]# etcdctl mkdir /a/b

/a配下にbというディレクトリができたことがわかる。
[root@master1 ~]# etcdctl ls /a
/a/b

```

##4.4 キー＆バリューの設定

```
作成したディレクトリ(/a/b)にos=centos6を設定する。
[root@master1 ~]# etcdctl set /a/b/os centos6
centos6
[root@master1 ~]# etcdctl get /a/b/os
centos6

作成したディレクトリ(/a/b)にcar=GT-Rを設定する。
[root@master1 ~]# etcdctl set /a/b/car GT-R
GT-R
[root@master1 ~]# etcdctl get /a/b/car
GT-R

ディレクトリ(/a/b)配下を表示する。
[root@master1 ~]# etcdctl ls /a/b
/a/b/os
/a/b/car

/a配下を再帰的に表示する。
[root@master1 ~]# etcdctl ls /a --recursive
/a/b
/a/b/os
/a/b/car

master2でもディレクトリ(/a/b)配下を確認する。master1と同じ結果が表示された。
[root@master2 ~]# etcdctl ls /a/b
/a/b/os
/a/b/car

```


##4.5 ディレクトリ、キー&バリューの削除

```
master2でos=centos6を削除する。
[root@master2 ~]# etcdctl rm /a/b/os
PrevNode.Value: centos6

削除できたかどうか確認する。os=centos6が削除できた。
[root@master2 ~]# etcdctl get /a/b/os
Error:  100: Key not found (/a/b/os) [888]

car=GT-Rを削除する。
[root@master2 ~]# etcdctl rm /a/b/car
PrevNode.Value: GT-R

削除できたかどうか確認する。car=GT-Rが削除できた。
[root@master2 ~]# etcdctl get /a/b/car
Error:  100: Key not found (/a/b/car) [902]

os=centos6,car=GT-Rが両方とも削除できた。
[root@master2 ~]# etcdctl ls /a/b
[root@master2 ~]#

bディレクトリを削除する。
[root@master2 ~]# etcdctl rmdir /a/b

a配下のbディレクトリが削除できた。
[root@master2 ~]# etcdctl ls /a
[root@master2 ~]#

aディレクトリも削除する。
[root@master2 ~]# etcdctl rmdir /a

aディレクトリが削除できた。
[root@master2 ~]# etcdctl ls
/scheduler
/registry
/controller
```

##4.6 指定した値(value)にアップデート(updateオプション)する。

```
"os"というキーに"centos6"という値を設定する。
[root@master1 ~]# etcdctl set /a/b/os centos6
centos6

設定した値を確認する。
[root@master1 ~]# etcdctl get /a/b/os
centos6

osをcentos7にアップデートする。
[root@master1 ~]# etcdctl update /a/b/os centos7
centos7

設定した値を確認する。指定した値にアップデートできたことがわかる。
[root@master1 ~]# etcdctl get /a/b/os
centos7

```


##4.7 ディレクトリを再帰的(recursiveオプション)に削除する。

```
[root@master1 ~]# etcdctl mkdir /a/b/c
[root@master1 ~]# etcdctl ls /a --recursive
/a/b
/a/b/c
[root@master1 ~]# etcdctl rm /a --recursive
[root@master1 ~]# etcdctl ls /a --recursive
Error:  100: Key not found (/a) [1367]
[root@master1 ~]#

```


##4.8 ディレクトリに寿命(ttlオプション)を設定する。

```
10秒間だけ存在するディレクトリを作成する。
[root@master1 ~]# etcdctl mkdir /a --ttl 10;date
2016年 11月 15日 火曜日 21:00:57 JST

[root@master1 ~]# etcdctl ls;date
/registry
/controller
/a
/scheduler
2016年 11月 15日 火曜日 21:00:59 JST

-中略-

[root@master1 ~]# etcdctl ls;date
/scheduler
/registry
/controller
/a
2016年 11月 15日 火曜日 21:01:07 JST

12秒経過したときには、/aディレクトリは消えている。
[root@master1 ~]# etcdctl ls;date
/scheduler
/registry
/controller
2016年 11月 15日 火曜日 21:01:09 JST

```


##4.9 キーに設定された値の変化(watchオプション)を監視する。

```
osにcentos6を設定する。
[root@master1 ~]# etcdctl mkdir /a/b
[root@master1 ~]# etcdctl set /a/b/os centos6
centos6

watchオプションで値の変化を監視する。
[root@master1 ~]# etcdctl watch /a/b/os

master2でosにcentos7を設定する。
[root@master2 ~]# etcdctl set /a/b/os centos7
centos7

osの値が変化したことで、etcdctlコマンドのブロックが解除された。
[root@master1 ~]# etcdctl watch /a/b/os
centos7

```

##4.10 データベースをバックアップする。

```
データベースのディレクトリ(--data-dir)を確認する。
[root@master1 ~]# ps aux|grep etcd
etcd       1024  7.8  2.2  40112 22232 ?        Ssl  19:36   9:17 /usr/bin/etcd --name=master1 --data-dir=/var/lib/etcd/default.etcd --listen-client-urls=http://0.0.0.0:2379

バックアップ用のディレクトリを作成する。
[root@master1 ~]# mkdir /backup

データベースを/backup配下にバックアップする。
[root@master1 ~]# etcdctl backup --data-dir=/var/lib/etcd/default.etcd --backup-dir=/backup

バックアップしたデータベースを確認する。
[root@master1 ~]# ls -R /backup/
/backup/:
member

/backup/member:
snap  wal

/backup/member/snap:

/backup/member/wal:
0000000000000000-0000000000000000.wal

```


##4.11 データベース(walのみ)をバックアップする。

```
バックアップ用のディレクトリを作成する。
[root@master1 ~]# mkdir /backup

データベースを/backup配下にバックアップする。
[root@master1 ~]# etcdctl backup --wal-dir=/var/lib/etcd/default.etcd/member/wal --backup-wal-dir=/backup

バックアップしたデータベースを確認する。
[root@master1 ~]# ls -R /backup/
/backup/:
0000000000000000-0000000000000000.wal

```

##4.12 コマンド実行時の詳細情報(--debug)を出力する。
```
[root@master1 ~]# etcdctl --debug ls
start to sync cluster using endpoints(http://127.0.0.1:2379,http://127.0.0.1:4001)
cURL Command: curl -X GET http://127.0.0.1:2379/v2/members
got endpoints(http://192.168.0.20:2379,http://192.168.0.10:2379) after sync
Cluster-Endpoints: http://192.168.0.20:2379, http://192.168.0.10:2379
cURL Command: curl -X GET http://192.168.0.20:2379/v2/keys/?quorum=false&recursive=false&sorted=false
/registry
[root@master1 ~]#
```

##4.13 ディレクトリに"/"を付けてわかりやすく表示する(-p)。

```
オプション(-p)を付けずに実行する。ディレクトリがどれだかわからない。
[root@master1 ~]# etcdctl ls --recursive
/registry
-中略-
/registry/minions
/registry/minions/master2
/registry/minions/master1

オプション(-p)を使うと、minionsはディレクトリだとわかる。master1,master2はディレクトリ内のキーだとわかる。
[root@master1 ~]# etcdctl ls -p --recursive
/registry/
-中略-
/registry/minions/
/registry/minions/master2
/registry/minions/master1

```

##4.14 HTTPでアクセスする。

```

ディレクトリを表示する。現在は、/registryのみ存在する。
[root@master1 ~]# etcdctl ls
/registry

/直下にOS=linuxを設定する。
[root@master1 ~]# curl http://localhost:2379/v2/keys/os -XPUT -d "value=linux"
{"action":"set","node":{"key":"/os","value":"linux","modifiedIndex":8815,"createdIndex":8815}}

etcdctlコマンドでキーの値を表示する。
[root@master1 ~]# etcdctl ls
/os
/registry

etcdctlコマンドでバリューの値を表示する。osにlinuxが設定されていることが確認できる。
[root@master1 ~]# etcdctl get /os
linux

HTTPでosに設定されているバリューを読みだす。etcdctlコマンドと同じ結果が得られた。
[root@master1 ~]# curl http://localhost:2379/v2/keys/os -XGET
{"action":"get","node":{"key":"/os","value":"linux","modifiedIndex":8893,"createdIndex":8893}}

キーを削除する。
[root@master1 ~]# curl http://localhost:2379/v2/keys/os -XDELETE
{"action":"delete","node":{"key":"/os","modifiedIndex":8962,"createdIndex":8893},"prevNode":{"key":"/os","value":"linux","modifiedIndex":8893,"createdIndex":8893}}

[root@master1 ~]# etcdctl ls
/registry

```


#5. 参考情報
[Deployment Considerations for ETCD in Production Kubernetes Clusters](http://cloudgeekz.com/1176/deployment-considerations-for-etcd-in-production-kubernetes-clusters.html)