CoreOS >

目次

etcdとは

  • etcdは、Go言語で記述されたオープンソースの高信頼分散KVSです。同様のミドルウェアでは、Apache ZooKeeperが有名です。
  • etcdクラスタは、CoreOS上のコンテナ環境等に配備されるアプリケーション間でサービス設定情報などを交換、共有することを可能にしてくれます。

インストール

by DockerCompose

手動でDockerCompose設定ファイルを作成

  1. docker-compose.yml: 設定ファイルを用意します。データ永続化のためのディレクトリ(/opt/docker-compose/app/etcd/data)はあらかじめ作成しておいてください。client サービスはテストの便宜のためですので必須ではありません。
    1. ---
    2. version: '2'
    3. services:
    4.   etcd1:
    5.     image: quay.io/coreos/etcd:v3.1
    6.     restart: always
    7.     ports:
    8.     - 23791:2379
    9.     - 23801:2380
    10.     environment:
    11.       ETCD_NAME: node1
    12.       ETCD_DATA_DIR: node1.etcd
    13.       ETCD_LISTEN_CLIENT_URLS: http://etcd1:2379,http://localhost:2379
    14.       ETCD_ADVERTISE_CLIENT_URLS: http://etcd1:2379
    15.       ETCD_LISTEN_PEER_URLS: http://etcd1:2380
    16.       ETCD_INITIAL_ADVERTISE_PEER_URLS: http://etcd1:2380
    17.       ETCD_INITIAL_CLUSTER: node1=http://etcd1:2380,node2=http://etcd2:2380,node3=http://etcd3:2380
    18.       ETCD_INITIAL_CLUSTER_TOKEN: etcd-test-token
    19.       ETCD_INITIAL_CLUSTER_STATE: new
    20.       ETCDCTL_API: '3'
    21.     volumes:
    22.     - "/opt/docker-compose/app/etcd/data/node1.etcd:/node1.etcd:rw"
    23.   etcd2:
    24.     image: quay.io/coreos/etcd:v3.1
    25.     restart: always
    26.     ports:
    27.     - 23792:2379
    28.     - 23802:2380
    29.     environment:
    30.       ETCD_NAME: node2
    31.       ETCD_DATA_DIR: node2.etcd
    32.       ETCD_LISTEN_CLIENT_URLS: http://etcd2:2379,http://localhost:2379
    33.       ETCD_ADVERTISE_CLIENT_URLS: http://etcd2:2379
    34.       ETCD_LISTEN_PEER_URLS: http://etcd2:2380
    35.       ETCD_INITIAL_ADVERTISE_PEER_URLS: http://etcd2:2380
    36.       ETCD_INITIAL_CLUSTER: node1=http://etcd1:2380,node2=http://etcd2:2380,node3=http://etcd3:2380
    37.       ETCD_INITIAL_CLUSTER_TOKEN: etcd-test-token
    38.       ETCD_INITIAL_CLUSTER_STATE: new
    39.       ETCDCTL_API: '3'
    40.     volumes:
    41.     - "/opt/docker-compose/app/etcd/data/node2.etcd:/node2.etcd:rw"
    42.   etcd3:
    43.     image: quay.io/coreos/etcd:v3.1
    44.     restart: always
    45.     ports:
    46.     - 23793:2379
    47.     - 23803:2380
    48.     environment:
    49.       ETCD_NAME: node3
    50.       ETCD_DATA_DIR: node3.etcd
    51.       ETCD_LISTEN_CLIENT_URLS: http://etcd3:2379,http://localhost:2379
    52.       ETCD_ADVERTISE_CLIENT_URLS: http://etcd3:2379
    53.       ETCD_LISTEN_PEER_URLS: http://etcd3:2380
    54.       ETCD_INITIAL_ADVERTISE_PEER_URLS: http://etcd3:2380
    55.       ETCD_INITIAL_CLUSTER: node1=http://etcd1:2380,node2=http://etcd2:2380,node3=http://etcd3:2380
    56.       ETCD_INITIAL_CLUSTER_TOKEN: etcd-test-token
    57.       ETCD_INITIAL_CLUSTER_STATE: new
    58.       ETCDCTL_API: '3'
    59.     volumes:
    60.     - "/opt/docker-compose/app/etcd/data/node3.etcd:/node3.etcd:rw"
    61.   client:
    62.     image: quay.io/coreos/etcd:v3.1
    63.     restart: none
    64.     entrypoint: /bin/sh -c "while true; echo dummy; do sleep 600; done"
    65.     environment:
    66.       ETCDCTL_API: '3'
    67.       ETCDCTL_ENDPOINTS: http://etcd1:2379,http://etcd2:2379,http://etcd3:2379
  2. クラスタを起動させます。
    $ docker-compose up -d
    Creating network "etcd_default" with the default driver
    Creating etcd_etcd3_1
    Creating etcd_client_1
    Creating etcd_etcd2_1
    Creating etcd_etcd1_1
  3. ポートマップしていますのでクラスタ外からもアクセス可能ですが、テストには各ノードまたは client サービスのコンテナに入ってアクセスするのが簡単です。
    alice@local:/opt/docker-compose/app/etcd$ docker exec -it etcd_etcd1_1 sh
    / # etcdctl member list
    8c90fe955583aa0, started, node1, http://etcd1:2380, http://etcd1:2379
    cc1931d2929693c4, started, node2, http://etcd2:2380, http://etcd2:2379
    fbe8c0a0fcd8e1b1, started, node3, http://etcd3:2380, http://etcd3:2379
    / # etcdctl put foo 'Hello World!'
    OK
    / # exit
    
    alice@local:/opt/docker-compose/app/etcd$ docker exec -it etcd_client_1 sh
    / # etcdctl get foo
    foo
    Hello World!
  4. クラスタを停止させます。
    $ docker-compose down
    ...

lightbulb.pngChefでDockerCompose設定ファイルを生成

  • 以下のセットアップでは、筆者の作成したcake.pngetcd-gridクックブックを使用しています。
  1. 最も簡単なセットアップは、以下のように chef-client コマンドのローカルモードを利用した方法です。Dockerエンジンがセットアップされた後、Docker Composeがインストールされ、etcdクラスタ用の docker-compose.yml ファイルが生成されます。
    1. chef-clientをインストールし、クックブックのソースを取得します。
      Ubuntu:$ sudo apt-get install ca-certificates curl git
      CentOS:$ sudo yum     install ca-certificates curl git
      $ curl -L https://omnitruck.chef.io/install.sh | sudo bash -s -- -v 12
      $ git clone git://git.osdn.net/gitroot/metasearch/grid-chef-repo.git
      $ cd grid-chef-repo/
    2. lightbulb.pngもし、DockerエンジンやDocker Composeがすでにインストール済みで、このクックブックでセットアップされたくない場合には、以下の skip_setup 属性を true にすることによりスキップすることができます。
      1. # ...
      2. override_attributes(
      3.   'docker-grid' => {
      4.     'engine' => {
      5.       #'skip_setup' => true,  # default: false
      6.     },
      7.     'compose' => {
      8.       #'skip_setup' => true,  # default: false
      9.     },
      10.   },
      11.   'etcd-grid' => {
      12.     # ...
      13.   },
      14. )
  2. etcdクラスタ用の docker-compose.yml ファイルを生成させます。
    $ sudo chef-client -z -c solo.rb -j nodes/local-etcd-on-docker.json -W
    $ sudo chef-client -z -c solo.rb -j nodes/local-etcd-on-docker.json
  3. メッセージに従い、docker-composeコマンドでサービスを起動させます。

by Vagrant

note.pngこの節の内容は古くなっている可能性があります。

  • 以下では、Vagrantを利用してCoreOSクラスタを構築し、etcdの動作を見てみることにします。
  • note.pngこのVagrantのマルチVM設定ファイルでは、動的にそれぞれのホスト名とIPアドレスを設定しているため、CoreOSの自動更新で個別にノードが再起動された場合には、それらの設定が正しく行われなくなります。ご注意ください。
  1. CoreOS.comが提供するVagrant設定ファイルをcloneし、VMを起動させます。クラスタの最小構成である3ノードが起動されます。
    $ cd ~/vagrant
    $ git clone https://github.com/coreos/coreos-vagrant/
    Cloning into 'coreos-vagrant'...
    ...
    $ cd coreos-vagrant/cluster
    $ vagrant up
    Bringing machine 'core-01' up with 'virtualbox' provider...
    Bringing machine 'core-02' up with 'virtualbox' provider...
    Bringing machine 'core-03' up with 'virtualbox' provider...
    [core-01] Importing base box 'coreos'...
    ...
    [core-01] Forwarding ports...
    [core-01] -- 22 => 2222 (adapter 1)
    [core-01] Booting VM...
    ...
    [core-01] Setting hostname...
    [core-01] Configuring and enabling network interfaces...
    [core-01] Mounting shared folders...
    [core-02] Importing base box 'coreos'...
    ...
    [core-02] Clearing any previously set forwarded ports...
    [core-02] Fixed port collision for 22 => 2222. Now on port 2200.
    [core-02] Creating shared folders metadata...
    [core-02] Clearing any previously set network interfaces...
    [core-02] Preparing network interfaces based on configuration...
    [core-02] Forwarding ports...
    [core-02] -- 22 => 2200 (adapter 1)
    [core-02] Booting VM...
    ...
    [core-02] Setting hostname...
    [core-02] Configuring and enabling network interfaces...
    [core-02] Mounting shared folders...
    [core-03] Importing base box 'coreos'...
    ...
    [core-03] Clearing any previously set forwarded ports...
    [core-03] Fixed port collision for 22 => 2200. Now on port 2201.
    [core-03] Creating shared folders metadata...
    [core-03] Clearing any previously set network interfaces...
    [core-03] Preparing network interfaces based on configuration...
    [core-03] Forwarding ports...
    [core-03] -- 22 => 2201 (adapter 1)
    [core-03] Booting VM...
    ...
    [core-03] Setting hostname...
    [core-03] Configuring and enabling network interfaces...
    [core-03] Mounting shared folders...
  2. etcd-clusterサービスが自動起動される設定のようですが、そのままでは起動パラメータの設定方法に誤りがあり、起動に失敗しています。READEME.mdファイルに、etcdクラスタの起動設定はまもなく追加、とありますので、まだ整備中なのでしょう*1
    $ vagrant ssh core-01
    ...
    core@core-01 ~ $ etcd -version true
    v0.1.2
    core@core-01 ~ $ systemctl | grep etcd
    etcd-cluster.service        loaded failed failed    Clustered etcd
    etcd.service                loaded failed failed    etcd
    core@core-01 ~ $ systemctl status etcd-cluster.service
    etcd-cluster.service - Clustered etcd
       Loaded: loaded (/media/state/units/etcd-cluster.service; enabled-runtime)
       Active: failed (Result: start-limit) since Fri 2013-12-06 12:25:10 UTC; 2min 19s ago
      Process: 655 ExecStart=/usr/bin/etcd -c 4001 -s 7001 -h 192.168.65.2 -d /home/core/etcd (code=exited, status=2)
     Main PID: 655 (code=exited, status=2)
       CGroup: /system.slice/etcd-cluster.service
    
    Dec 06 12:25:10 core-01 systemd[1]: etcd-cluster.service: main process exited, code=...ENT
    Dec 06 12:25:10 core-01 systemd[1]: Unit etcd-cluster.service entered failed state.
    Dec 06 12:25:10 core-01 systemd[1]: etcd-cluster.service holdoff time over, scheduli...rt.
    Dec 06 12:25:10 core-01 systemd[1]: Stopping Clustered etcd...
    Dec 06 12:25:10 core-01 systemd[1]: Starting Clustered etcd...
    Dec 06 12:25:10 core-01 systemd[1]: etcd-cluster.service start request repeated too ...rt.
    Dec 06 12:25:10 core-01 systemd[1]: Failed to start Clustered etcd.
    Dec 06 12:25:10 core-01 systemd[1]: Unit etcd-cluster.service entered failed state.
    Hint: Some lines were ellipsized, use -l to show in full.
    core@core-01 ~ $ systemctl status etcd.service
    etcd.service - etcd
       Loaded: loaded (/usr/lib64/systemd/system/etcd.service; disabled)
       Active: failed (Result: exit-code) since Fri 2013-12-06 12:25:08 UTC; 2min 32s ago
     Main PID: 357 (code=exited, status=2)
       CGroup: /system.slice/etcd.service
    
    Dec 06 12:24:43 localhost etcd-bootstrap[357]: [etcd] Dec  6 12:24:43.594 INFO      |...o'
    Dec 06 12:24:43 localhost etcd[357]: Wrote node configuration to '/var/lib/etcd/info'
    Dec 06 12:24:43 localhost etcd-bootstrap[357]: [etcd] Dec  6 12:24:43.596 INFO      |...1]
    Dec 06 12:24:43 localhost etcd[357]: etcd server [name default-name, listen on 0.0.0...01]
    Dec 06 12:24:43 localhost etcd-bootstrap[357]: [etcd] Dec  6 12:24:43.596 INFO      |...1]
    Dec 06 12:24:43 localhost etcd[357]: raft server [name default-name, listen on 127.0...01]
    Dec 06 12:25:08 core-01 systemd[1]: Stopping etcd...
    Dec 06 12:25:08 core-01 systemd[1]: etcd.service: main process exited, code=exited, ...ENT
    Dec 06 12:25:08 core-01 systemd[1]: Stopped etcd.
    Dec 06 12:25:08 core-01 systemd[1]: Unit etcd.service entered failed state.
    Hint: Some lines were ellipsized, use -l to show in full.
    • info.png参考までに、以下のユニット設定ファイルを修正すると、デーモンとして起動できます。
      1. /media/state/units/etcd-cluster.service: 起動ユーザ(etcd)を追加し、起動コマンドを修正しています。
        1. [Unit]
        2. Description=Clustered etcd
        3. #After=docker.service
        4.  
        5. [Service]
        6. Restart=always
        7. User=etcd
        8. #ExecStart=/usr/bin/etcd -c 4001 -s 7001 -h 192.168.65.2 -C 192.168.65.4:7001 -d /home/core/etcd
        9. ExecStart=/usr/bin/etcd -n core-01 -d /home/core/etcd -c 192.168.65.2:4001 -cl 0.0.0.0 -s 192.168.65.2:7001
        10.  
        11. [Install]
        12. WantedBy=local.target
      2. ユニット設定をリロードしてから起動させます。
        core@core-01 ~ $ sudo systemctl start etcd-cluster.service
        Warning: Unit file of etcd-cluster.service changed on disk, 'systemctl daemon-reload' recommended.
        core@core-01 ~ $ sudo systemctl daemon-reload                     
        core@core-01 ~ $ sudo systemctl start etcd-cluster.service
  3. 動作検証が目的ですので、今回は以下の要領でフォアグランドでetcdを起動させ、クラスタを構築してみます。この例では、各ノードでVirtualBoxのホストオンリーアダプタがセットアップされていますので、192.168.65.0/24 ネットワークセグメントのIPアドレスが割り当てられています。
    1. core-01: 明示的に -cl(クライアント待受アドレス)に 0.0.0.0 を設定しているのは、コンテナのための docker0 インタフェイスでもetcdをサービスするためです。
      $ vagrant ssh core-01
      ...
      core@core-01 ~ $ sudo mkdir /home/core/etcd
      core@core-01 ~ $ sudo chown etcd:etcd /home/core/etcd
      core@core-01 ~ $ sudo chmod 750 /home/core/etcd
      core@core-01 ~ $ sudo -u etcd /usr/bin/etcd -n core-01 -d /home/core/etcd -c 192.168.65.2:4001 -cl 0.0.0.0 -s 192.168.65.2:7001
      [etcd] Dec  8 10:25:07.922 INFO      | Wrote node configuration to '/home/core/etcd/info'
      [etcd] Dec  8 10:25:07.923 INFO      | etcd server [name core-01, listen on 0.0.0.0:4001, advertised url http://192.168.65.2:4001]
      [etcd] Dec  8 10:25:07.924 INFO      | raft server [name core-01, listen on 192.168.65.2:7001, advertised url http://192.168.65.2:7001]
    2. core-02: 2つ目以降のノードでは既存の1ノードを -C(クラスタ)オプションに指定して起動させます。
      $ vagrant ssh core-02
      ...
      core@core-02 ~ $ sudo mkdir /home/core/etcd
      core@core-02 ~ $ sudo chown etcd:etcd /home/core/etcd
      core@core-02 ~ $ sudo chmod 750 /home/core/etcd
      core@core-02 ~ $ sudo -u etcd /usr/bin/etcd -n core-02 -d /home/core/etcd -c 192.168.65.3:4001 -cl 0.0.0.0 -s 192.168.65.3:7001 -C 192.168.65.2:7001
      [etcd] Dec  8 10:27:40.407 INFO      | Wrote node configuration to '/home/core/etcd/info'
      [etcd] Dec  8 10:27:40.411 INFO      | etcd server [name core-02, listen on 0.0.0.0:4001, advertised url http://192.168.65.3:4001]
      [etcd] Dec  8 10:27:40.412 INFO      | raft server [name core-02, listen on 192.168.65.3:7001, advertised url http://192.168.65.3:7001]
    3. core-03
      $ vagrant ssh core-03
      ... 
      core@core-03 ~ $ sudo mkdir /home/core/etcd
      core@core-03 ~ $ sudo chown etcd /home/core/etcd
      core@core-03 ~ $ sudo chmod 750 /home/core/etcd
      core@core-03 ~ $ sudo -u etcd /usr/bin/etcd -n core-03 -d /home/core/etcd -c 192.168.65.4:4001 -cl 0.0.0.0 -s 192.168.65.4:7001 -C 192.168.65.2:7001
      [etcd] Dec  8 10:29:55.985 INFO      | Wrote node configuration to '/home/core/etcd/info'
      [etcd] Dec  8 10:29:55.989 INFO      | etcd server [name core-03, listen on 0.0.0.0:4001, advertised url http://192.168.65.4:4001]
      [etcd] Dec  8 10:29:55.989 INFO      | raft server [name core-03, listen on 192.168.65.4:7001, advertised url http://192.168.65.4:7001
  4. etcdクラスタの状態を確認します。以下の例では、3ノードがクラスタに参加しており、core-01ノードがリーダーであることが分かります。
    core@core-01 ~ $ curl -L http://127.0.0.1:4001/v1/keys/_etcd/machines
    [{"action":"GET","key":"/_etcd/machines/core-01","value":"raft=http://192.168.65.2:7001&etcd=http://192.168.65.2:4001&raftVersion=v0.1.2","index":4},
    {"action":"GET","key":"/_etcd/machines/core-02","value":"raft=http://192.168.65.3:7001&etcd=http://192.168.65.3:4001&raftVersion=v0.1.2","index":4},
    {"action":"GET","key":"/_etcd/machines/core-03","value":"raft=http://192.168.65.4:7001&etcd=http://192.168.65.4:4001&raftVersion=v0.1.2","index":4}]
    core@core-01 ~ $ curl -L http://127.0.0.1:4001/v1/leader
    http://192.168.65.2:7001
  5. core-01ノードから値を書き込んでみます。
    core@core-01 ~ $ curl -L http://127.0.0.1:4001/v1/keys/message -d value="Hello"
    {"action":"SET","key":"/message","value":"Hello","newKey":true,"index":5}
  6. それをcore-02ノードから読み込んでみます。
    core@core-02 ~ $ curl -L http://127.0.0.1:4001/v1/keys/message
    {"action":"GET","key":"/message","value":"Hello","index":5}
  7. 次に、core-03ノードにてdockerを使用してコンテナを起動させ、コンテナ上のアプリケーション(この例では、bash)から先ほどのキーにアクセスしてみます。コンテナ上からのアクセスには、ホストのdocker0インタフェイスを使用します。
    core@core-03 ~ $ ip addr show dev docker0
    4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN
        link/ether 56:f6:39:60:ed:85 brd ff:ff:ff:ff:ff:ff
        inet 172.17.42.1/16 scope global docker0
           valid_lft forever preferred_lft forever
        inet6 fe80::54f6:39ff:fe60:ed85/64 scope link
           valid_lft forever preferred_lft forever
    core@core-03 ~ $ docker run -i -t base /bin/bash
    Unable to find image 'base' (tag: latest) locally
    Pulling repository base
    b750fe79269d: Download complete
    27cf78414709: Download complete
    root@e8ddbe202e31:/# apt-get update
    ...
    root@e8ddbe202e31:/# apt-get install curl
    ...
    root@e8ddbe202e31:/# curl -L http://172.17.42.1:4001/v1/keys/message
    {"action":"GET","key":"/message","value":"Hello","index":5}
  8. 同じくアプリケーションからこのキーを削除します。
    root@e8ddbe202e31:/# curl -L http://172.17.42.1:4001/v1/keys/message -X DELETE
    {"action":"DELETE","key":"/message","prevValue":"Hello","index":6}
  9. 再びcore-02ノードからキーが削除されていることを確認します。
    core@core-02 ~ $ curl -L http://127.0.0.1:4001/v1/keys/message
    {"errorCode":100,"message":"Key Not Found","cause":"get: /message"}

リソース


*1 https://github.com/coreos/coreos-vagrant/pull/16

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-11-04 (土) 18:43:11 (1445d)