Centos7でetcdを試す

参考

http://qiita.com/hana_shin/items/602f98bd9b153d22e50c

etcdとは

etcdとは、Kubernetesに使用されていることで有名な 分散型のKVSです。 クラスタに所属しているノード間でデータを同期させることが できる特性を活かし、Kubernetesでは 各サーバの保持するIPアドレスの相互伝達に使用されています。

概要

VirtualBox上のCentos7×2台に etcdを導入し、動作の確認を行ってみました。

環境

  • VirtualBox5.1.22r115126 on WIndows10
  • CentOS Linux release 7.3.1611 (Core)
  • etcd Version: 3.1.7

各ノードの情報

VirtuallBox上にCentOSVMを2台作成しました。

  • node1(CentOS Linux release 7.3.1611 (Core))

    • enp0s3(NAT IF) :10.0.2.101/24
    • enp0s8(HostOnlf IF):192.168.56.101/24
  • node2(CentOS Linux release 7.3.1611 (Core))

    • enp0s3(NAT IF) :10.0.2.107/24
    • enp0s8(HostOnlf IF):192.168.56.107/24

手順

etcdのインストール(node1)(node2)

#yum install etcd

設定ファイルの作成

各サーバが他のクラスタに属するサーバをディスカバリする方法として、

  • etcd.confの'ETCD_INITIAL_CLUSTER'にあらかじめ全てのサーバのIPを記載する
  • ディスカバリサーバを別に作成し、専用のURL/Tokenを発行し、それを使って ディスカバリする

の2つが存在しますが、ここでは前者の方法を使ってクラスタを構築します。

(node1)

[root@node1 ~]# cat /etc/etcd/etcd.conf |grep -v ^# |grep -v ^$
ETCD_NAME=node1
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.56.101:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.56.101:2380"
ETCD_INITIAL_CLUSTER="node1=http://192.168.56.101:2380,node2=http://192.168.56.107:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.56.101:2379"

(node)

[root@node2 ~]# cat /etc/etcd/etcd.conf |grep -v ^# |grep -v ^$
ETCD_NAME=node2
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="192.168.56.107:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.56.107:2380"
ETCD_INITIAL_CLUSTER="node1=http://192.168.56.101:2380,node2=http://192.168.56.107:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.56.107:2379"

etcdの起動(node1)(node2)

# systemctl enable etcd
# systemctl start etcd
# systemctl status etcd

etcdのバージョンの確認(node1)(node2)

# etcdctl --version
etcdctl version: 3.1.7
API version: 2

起動後の正常性確認

今回採用のディスカバリ方法の場合は相手ノードの2380番Portに接続できればディスカバリできるため、その接続性を確認します。

(node1)

自サーバにて、Port2380でlistenできているか確認

[root@node1 ~]# ss -natu | grep LISTEN | grep 2380
tcp    LISTEN     0      128    192.168.56.101:2380                  *:*

[root@node1 ~]# curl http://192.168.56.101:2380/version
{"etcdserver":"3.1.7","etcdcluster":"3.1.0"}[root@node1 ~]#

相手サーバへの接続性を確認

[root@node1 ~]# curl http://192.168.56.107:2380/version
{"etcdserver":"3.1.7","etcdcluster":"3.1.0"}[root@node1 ~]#

クラスタに相手サーバが組み込まれていることを確認

[root@node1 ~]# etcdctl member list
275f7358be9c56b9: name=node2 peerURLs=http://192.168.56.107:2380 clientURLs=http://192.168.56.107:2379 isLeader=false
ca933ab8cfffe553: name=node1 peerURLs=http://192.168.56.101:2380 clientURLs=http://192.168.56.101:2379 isLeader=true

(node2)

自サーバにて、Port2380でlistenできているか確認

[root@node2 ~]# ss -natu | grep LISTEN | grep 2380
tcp    LISTEN     0      128    192.168.56.107:2380       

[root@node2 ~]# curl http://192.168.56.107:2380/version
{"etcdserver":"3.1.7","etcdcluster":"3.1.0"}[root@node2 ~]#

相手サーバへの接続性を確認

[root@node2 ~]# curl http://192.168.56.101:2380/version
{"etcdserver":"3.1.7","etcdcluster":"3.1.0"}[root@node2 ~]#

クラスタに相手サーバが組み込まれていることを確認

[root@node2 ~]# etcdctl member list
275f7358be9c56b9: name=node2 peerURLs=http://192.168.56.107:2380 clientURLs=http://192.168.56.107:2379 isLeader=false
ca933ab8cfffe553: name=node1 peerURLs=http://192.168.56.101:2380 clientURLs=http://192.168.56.101:2379 isLeader=true

KVSに格納される値が同期されることを確認

(node1)

[root@node1 ~]# etcdctl --debug set os linux
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.56.101:2379,http://192.168.56.107:2379) after sync
Cluster-Endpoints: http://192.168.56.101:2379, http://192.168.56.107:2379
cURL Command: curl -X PUT http://192.168.56.101:2379/v2/keys/os -d "value=linux"
linux
[root@node1 ~]# etcdctl --debug get os
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.56.107:2379,http://192.168.56.101:2379) after sync
Cluster-Endpoints: http://192.168.56.107:2379, http://192.168.56.101:2379
cURL Command: curl -X GET http://192.168.56.107:2379/v2/keys/os?quorum=false&recursive=false&sorted=false
linux

(node2)

[root@node2 ~]# etcdctl --debug get os
start to sync cluster using endpoints(http://127.0.0.1:4001,http://127.0.0.1:2379)
cURL Command: curl -X GET http://127.0.0.1:4001/v2/members
cURL Command: curl -X GET http://127.0.0.1:2379/v2/members
got endpoints(http://192.168.56.101:2379,http://192.168.56.107:2379) after sync
Cluster-Endpoints: http://192.168.56.101:2379, http://192.168.56.107:2379
cURL Command: curl -X GET http://192.168.56.101:2379/v2/keys/os?quorum=false&recursive=false&sorted=false
linux

walログ

etcdはKVSに書き込まれた情報を随時、/var/lib/etcd配下のwalログ(write ahead log)に書き込んでいるようです。

[root@node2 ~]# ps aux | grep etcd
etcd      2614  2.5  3.2 10771728 33060 ?      Ssl  11:02   2:53 /usr/bin/etcd --name=node2 --data-dir=/var/lib/etcd/default.etcd --listen-client-urls=http://0.0.0.0:2379
root     10469  0.0  0.0 112664   960 pts/0    R+   12:56   0:00 grep --color=auto etcd

[root@node2 ~]# lsof -p 2614 | grep var
etcd    2614 etcd  cwd       DIR              253,0       26  8409202 /var/lib/etcd
etcd    2614 etcd  mem-W     REG              253,0 16805888  8409204 /var/lib/etcd/default.etcd/member/snap/db
etcd    2614 etcd    7uW     REG              253,0 16805888  8409204 /var/lib/etcd/default.etcd/member/snap/db
etcd    2614 etcd    8uW     REG              253,0 64000000 12920852 /var/lib/etcd/default.etcd/member/wal/0000000000000000-0000000000000000.wal
etcd    2614 etcd    9r      DIR              253,0       64 12920837 /var/lib/etcd/default.etcd/member/wal
etcd    2614 etcd   10wW     REG              253,0 64000000 12920851 /var/lib/etcd/default.etcd/member/wal/0.tmp

動作メモ

  • 2380番Portがサービスディスカバリ/ヘルスチェックに使用される
  • 2379番PortがClientコマンド(etcdctl)向けのAPI Endpointとして使用される
  • etcctlに' -debug'オプションをつけると実際に実行している、curlコマンドが見えるので実態が把握しやすい
  • DBデータは/var/lib/etcd配下に格納される。Clusterが壊れたときは、最悪ここを消して、etcdを上げなおせば起動可能