Linode(海外VPS)でCoreOSを使用する場合のネットワーク及びEtcdの設定方法

あるウェブサービスを作ろうと思っているのですが、せっかくなのでDockerを使ったスケールの勉強も兼ねてVPSサーバで遊んでいます。
Dockerでマルチホストネットワークを構築してスケールさせる算段なのですが、いろいろ情報を収集しているうちに、CoreOSというDocker専用の軽量Linux OSがあるのを知りました。CoreOSは必要最小限のソフトウエアで構成されていて、使用されるメモリも小さく、コンテナを動作させる際のオーバーヘッドも小さいそうです。また、標準でetcdを使用したクラスタリング機能が搭載されている点にも魅力を感じました。
ウェブサービス構築に向けて、CentOS7のサーバを用意し、カーネルのバージョンアップなどもして準備を進めていましたが、方向転換してCoreOSを採用することにしました。
使い始めて分かったのですが、CoreOSはパッケージマネージャーを持っていません。一般的なOSと異なる点が多く、ネットで情報を収集しながら環境の構築を始めたのですが、どうも僕の手元のCoreOSと状況が一致しません。Linodeという海外VPSを使用していたのですが、そこのCoreOSイメージが特殊なのかなと思いつつ、Linodeのコミュニティを覗いていたところ、どうやらCoreOSは最近になって大きく仕様が変わったようです。CoreOSの公式サイト上にも新旧の情報が混在して掲載されていますので、みなさんかなり混乱してるようでした。
https://www.linode.com/community/questions/427/help-i-am-running-coreos-and-need-to-add-custom-cloud-config
CoreOSは「cloud-config.yml」に仕様を記述してインストールする仕組みだったようですが、現在はIgnitionという仕組みに変更されたようです。しかしながら、Linodeの場合は最初起動時に一度Ignitionが走るのみで、カスタマイズは出来ないようです。
そんなわけで、Linode上のCoreOSに関するネットワークとETCDの設定について、備忘録として記事を残しておきたいと思います。
ネットワークの設定
なにはともあれ、Linode上にCoreOSのマシンを作ります。マルチホストネットワーク用に、プライベートIPを割り振っておきます。
CentOSなどの場合は、自動的にプライベートネットワーク用の設定が行われるのですが、CoreOSは自分で設定する必要があるようです。
https://www.linode.com/docs/networking/linux-static-ip-configuration/
この例に従って、以下のようにネットワークの設定を行いました。
※IPアドレスは環境に応じて変更してください。
/etc/systemd/network/05-eth0.network
[Match]
Name=eth0
[Network]
DHCP=no
Domains=your-domain.com
IPv6PrivacyExtensions=false
# IPv4 gateway and primary address.
Gateway=198.51.100.1
Address=198.51.100.2/24
# Add a private address:
Address=192.168.133.234/17リブートするかネットワークサービスの再読み込みを行えばプライベートIPが使用可能になります。
ETCDの設定
Dockerでマルチホスト・ネットワークを使用するにはキーバリュー・ストアが必要とのことなので、CoreOSに標準でインストールされているETCDを使います。
ETCDの設定ファイルに、ネットワークの情報を記述します。
/etc/systemd/system/etcd-member.service.d/20-cl-etcd-member.conf
[Service]
Environment="ETCD_IMAGE_TAG=v3.3.9"
Environment="ETCD_DATA_DIR=/var/lib/etcd"
Environment="ETCD_OPTS=--name s1 \
--listen-client-urls http://localhost:2379 \
--advertise-client-urls http://localhost:2379 \
--listen-peer-urls http://localhost:2380 \
--initial-advertise-peer-urls http://localhost:2380 \
--initial-cluster s1=http://localhost:2380,s2=http://192.168.133.235:2380 \
--initial-cluster-token mytoken\
--initial-cluster-state new \
--auto-compaction-retention 1"今回はプライベートネットワークでしか使わないため、SSLの設定は省いています。
OS起動時に実行されるように設定します。
systemctl enable etcd-member.service無事に起動しているか確認します。
systemctl status etcd-member.service失敗しているようであれば、以下のコマンドで原因を探りましょう。
journalctl --unit etcd-member.service --lines 10LinodeのCoreOSでは、DockerとEtcdを連携できない!(泣)
無事にCoreOS上でEtcdを起動させることができたので、Dockerと連携させようと思ったら、なんということでしょう! Container Linux Config か Ignition を使う必要があるということがここで判明します。残念ながら、LinodeのCoreOSイメージではどちらも使えないので、ゴールの目前で詰んでしました。ぐぬぬ。
Docker v.18からは、Etcdなどのキーバリューストアなしで、マルチホスト・ネットワークが使えるらしい
困り果ててググりまくっていたら、Docker18からはEtcdなどのクラスタリング機能なしに、swarmが使用できてオーバーレイネットワークが使えるみたいです。現時点では日本語の情報はほぼ見つかりませんが、公式サイトにそう書いてあったのでたぶん大丈夫でしょう。
という訳で、苦労した立てたEtcdを泣く泣く systemctl disable etcd-member.service で落としてDocker swarmのお勉強に進みたいと思います。




Discussion