Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(完)


CoreOSクラスタ構築 3台 + Worker 3台構成

前提

coreosクラスタ構築 3台構成
が出来ていること

目指す構成

アドレッッシング

環境 hostname IPアドレス meta
MacbookAir 4GB hostserver xxx.xxx.xxx.xxx role=services,cabinet=one
virtualbox1 coreos-01 192.168.0.10 role=services,cabinet=one
virtualbox2 coreos-02 192.168.0.20 role=services,cabinet=one
virtualbox3 coreos-03 192.168.0.30 role=services,cabinet=one
virtualbox4 coreos-04 192.168.0.11 role=workers,cabinet=two
virtualbox5 coreos-05 192.168.0.21 role=workers,cabinet=two
virtualbox6 coreos-06 192.168.0.31 role=workers,cabinet=two

workの3台を新規に構築する

Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(1)で作成したcoreosのイメージを3台分クローンを実施していきます。
※クローンの方法については、前回記事を参照ください

workerにcloud-config.ymlの設定を行っていきます。

cloud-config.yml
vim cloud-config.yml

#cloud-config

hostname: coreos-04

write_files:
- path: /etc/environment
  content: |
    COREOS_PUBLIC_IPV4=192.168.0.11
    COREOS_PRIVATE_IPV4=192.168.0.11

coreos:
  update:
    reboot-strategy: 'off'
  etcd2:
    proxy: on 
    name: coreos-04
    heartbeat-interval: 1000
    election-timeout: 5000
    listen-client-urls: http://0.0.0.0:2379
    initial-cluster: coreos-01=http://192.168.0.10:2380,coreos-02=http://192.168.0.20:2380,coreos-03=http://192.168.0.30:2380

  fleet:
    etcd_servers: http://127.0.0.1:2379
    public-ip: 192.168.0.11
    metadata: "role=workers,cabinet=two"
  flannel:
    interface: 192.168.0.11
  units:
  - name: etcd2.service
    command: start
  - name: fleet.service
    command: start
  - name: docker.service
    command: start
  - name: timezone.service
    command: start
    content: |
      [Unit]
      Description=timezone
      [Service]
      Type=oneshot
      RemainAfterExit=yes
      ExecStart=/usr/bin/ln -sf ../usr/share/zoneinfo/Japan /etc/localtime
  - name: 10-static.network
    runtime: false
    content: |
      [Match]
      Name=enp0s3

      [Network]
      Address=192.168.0.11/24
      DNS=8.8.8.8
      DNS=8.8.4.4

ssh_authorized_keys:
- ssh-rsa ※ご自身の公開鍵

users:
- name: coreuser
  passwd: $1$VIyj3wZe$HVVOEAc/H6a6YZGKCBWSD/
  groups:
  - sudo
  - docker
  ssh-authorized-keys:
  - ssh-rsa ※ご自身の公開鍵

上記を「アドレッシング」にあるhostnameとIPアドレスを合わせます。

cloud-config.ymlの読み込み実施

cloud-init

sudo coreos-cloudinit -from-file=./cloud-config.yml
sudo cp -a cloud-config.yml /var/lib/coreos-install/user_data
sudo reboot

※cloud-initコマンドで反映されない部分があるので、直接user_dataも書き換えておきます。

etcdctl cluster-healthの確認

cluster-health
etcdctl cluster-health
member 59d0611e956db7d1 is healthy: got healthy result from http://192.168.0.20:2379
member 6fb0d145a155e8ee is healthy: got healthy result from http://192.168.0.30:2379
member 7a0fb1a3031d4c79 is healthy: got healthy result from http://192.168.0.10:2379

上記の通り、クラスタ化されているIPが表示されていれば問題ありません。

fleetctlの確認

fleetctl
ssh [email protected]

fleetctl list-machines --full
5b1639bd3cc347cf8fac0b9f597369e3    192.168.0.10    cabinet=one,role=services
6d28316711484f039eca4408627fdb0c    192.168.0.11    cabinet=two,role=workers

・・・本来であればクラスタ及びworkerも全部出てくるはずなのですが。。。

調べてみると以下の記事が出てきました。

CoreOS 入門

また etcd の name 属性はユニークである必要があるので注意すること。
略するとマシンIDが使われる。マシンIDは /etc/machine_id で確認できる。マシンIDは環境を作成すると固定化されてしまうのでqemuのimgやvmを使いまわすとマシンIDが変わらず正しくクラスタが構築できないので注意すること。
rootをマウントして /etc/machine_id を削除し、再生成させるという方法もある。

なるほど。。。

というところで全てのサーバーにアクセスし、以下のコマンドを実行しました。

machinid_rename
ssh 192.168.0.10
sudo mv /etc/machine-id /etc/machine-id.bk
sudo reboot
#この動作を全てのサーバーに

再度fleetctl の表示確認

fleetctl
fleetctl list-machines --full
MACHINE                 IP      METADATA
4fb30e282c004f1794df9e91e56b14fb    192.168.0.31    cabinet=two,role=workers
5b1639bd3cc347cf8fac0b9f597369e3    192.168.0.10    cabinet=one,role=services
6d28316711484f039eca4408627fdb0c    192.168.0.11    cabinet=two,role=workers
703c849bcb924af5891ca5aae95e4e89    192.168.0.21    cabinet=two,role=workers
a6776a02935e4f01857364587836e338    192.168.0.20    cabinet=one,role=services
fffe34c5dcfa4aabbb1ba684101e521e    192.168.0.30    cabinet=one,role=services

6台分のサーバーが表示されるようになりました!

これでCoreOS+etcd2+fleetを使用したクラスタ化の構成が完了しました。

今回vagarantを利用しなかったことについて

にて既にvagrantのbox及びプロビジョニングファイルが配布されているのですが、当方にて以下の事象を確認しました。

1.$num_instanceを3で実行し、coreosをvagrant upで起動した場合問題なくクラスタの構成でUPされる
2.クラスタが正常になっているかの検証をするために、vagrant halt **で特定の端末を落とし、vagrant up | vagrant resumeで起動しても、IPアドレスが変わってしまう。※user_dataが保持されない
3.user_dataを作成するためにcloud-init/coreos-installしてもやはり揮発性があり検証が出来なかった。

私のvagrantの使い方がまずかったと思いますが、上記の事象がおきてしまったため断念しております。
※ただし、vagrantで利用できればcloud-config.ymlに記載されているIPアドレスなどを$public_ipv4など変数に置き換えることもできますので大変便利です。

This was intended but we should probably revise it if folks are depending on the old contents of /etc/environment. For EC2/OpenStack instances we moved the detection of $public_ipv4 and $private_ipv4 directly into coreos-cloudinit so that it would work gracefully with both EC2-style metadata services and config drive. The old /usr/share/oem/bin/coreos-setup-environment shipped with those images hung if no metadata service was available, breaking config drive based OpenStack systems.

次回

本構成を基礎構成として、fleetctlを使ったUnit、dockerの配置方法やfailoverの内容に触れていきたいと思います。

参考

CoreOS入門