概要
Kubernetesのリソースの永続化に使われる高信頼分散KVSのetcd。k8sを学習していくに当たって重要コンポーネントなはずだけど特に単体で情報が乗ってることってあんまなかったので興味本位で調べてみた。
k8sを使った機能自体の拡張とかそのレベルで使いこなしてる人たちがはこの辺の知識は必須なんだろうけど入門したてなので正直理解甘いかもです。
1. etcdのデータベース
etcdのデータベースは、/var/lib/etcd(デフォルト)配下に格納される。 下記2つのサブディレクトリから構成される。walとsnapは別の場所に置くことが可能。
ディレクトリの名前 | 用途 |
---|---|
wal(write ahead log) | write ahead log とは??? |
snap | snapshotsが保存される。snapshotsとは何? |
[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
サブコマンドのヘルプの使い方
[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
ディレクトリの作成
[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
キー&バリューの設定
# 作成したディレクトリ(/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
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