0%

IDCFクラウドにCoreOSクラスタを構築する - Part4: 367.1.0のissue

IDCFクラウドにCoreOSクラスタを構築する - Part3: セットアップで成功したときのCoreOSのバージョンを記録していないのですが、またインストールに失敗するようになりました。

今回はバージョンを確認して記録します。
CoreOSの367.1.0をbeta channelでIDCFクラウドでディスクにインストールすると、discoveryに失敗してしまいます。

CoreOS Stable Release

  • Updated 2014-08-18: CoreOS Stable Release
    367.1.0は、Stable Channelとしてリリースされました。

CoreOSのバージョン確認

インスタンスはCoreOSの367.1.0をbeta channelでインストールしています。

$ cat /etc/os-release
NAME=CoreOS
ID=coreos
VERSION=367.1.0
VERSION_ID=367.1.0
BUILD_ID=
PRETTY_NAME="CoreOS 367.1.0"
ANSI_COLOR="1;32"
HOME_URL="https://coreos.com/"
BUG_REPORT_URL="https://github.com/coreos/bugs/issues"

journalctlでログの確認

$ journalctl -u etcd.service
...
CRITICAL | failed sanitizing configuration: Advertised URL: parse :4001: missing protocol scheme

systemctlでunitファイルの確認

systemctlでunitファイルを読むと、ETCD_ADDRETCD_PEER_ADDRがポートだけでURLが書かれていません。
367.1.0では、COREOS_PRIVATE_IPが入らないようです。

systemdのunitファイルは以下のディレクトリにあります。

/usr/lib64/systemd/system/

$ systemctl cat etcd.service
# /usr/lib64/systemd/system/etcd.service
[Unit]
Description=etcd

[Service]
User=etcd
PermissionsStartOnly=true
Environment=ETCD_DATA_DIR=/var/lib/etcd ETCD_NAME=default
ExecStart=/usr/bin/etcd
Restart=always
RestartSec=10s

[Install]
WantedBy=multi-user.target

# /run/systemd/system/etcd.service.d/20-cloudinit.conf
[Service]
Environment="ETCD_ADDR=:4001"
Environment="ETCD_DISCOVERY=https://discovery.etcd.io/ed724cf0abd2d02abf985f57b5
Environment="ETCD_NAME=75aa20edd64b40488cccd0b5f3d419d4"
Environment="ETCD_PEER_ADDR=:7001"

missing /etc/environment fileのissueを読むと、確かに/etc/environmentファイルが見つかりません。

$ cat /usr/share/oem/bin/coreos-setup-environment
cat: /usr/share/oem/bin/coreos-setup-environment: No such file or directory
$ cat /etc/environment
cat: /etc/environment: No such file or directory

No IP data in cloudinit on OpenStackでOpenStackでも同様のissueがあります。

Same problem here, COREOS_PRIVATE_IP is empty using 367.1.0 on openstack with cloud-init.

/etc/environmentは明示的に作成する必要があるようです。

#cloud-config

write_files:
- name: /etc/environment
content: |
COREOS_PUBLIC_IPV4=$public_ipv4
COREOS_PRIVATE_IPV4=$private_ipv4

そういえば、Installing CoreOS to Diskに以下のような記述がありました。
なんのことかわからなかったのですが、どうもこのことらしいです。

Note: The $private_ipv4 and $public_ipv4 substitution variables referenced in other documents are not supported when installing via the coreos-install script.

cloud-config.yamlの再実行

また、CoreOSをディスクにインストールするときに使ったcloud-config.yamlは、/var/lib/coreos-install/user_dataにインストールされます。この設定はboot毎に再読み込みされるそうです。

The installation script will process your cloud-config.yaml file specified with the -c flag and place it onto disk. It will be installed to /var/lib/coreos-install/user_data and evaluated on every boot. Cloud-config is not the only supported format for this file — running a script is also available.

ディスクにインストールした後でも、discoveryのTOKENを変更したい場合は、
/var/lib/coreos-install/user_dataを編集してrebootすれば反映してくれそうなのですが。。。

rebootで失敗

/var/lib/coreos-install/user_dataを編集してCOREOS_PRIVATE_IPV4を記入後にrebootします。

残念ながら、reboot後にUnitの起動が失敗してしまいました。
このUnitファイルはみつからないので、まだ意味がわかりません。

CoreOS (beta)
Failed Units: 1
user-cloudinit@var-lib-coreos\x2dinstall-user_data.service

/run/systemd/system/etcd.service.d/20-cloudinit.confがなくなっています。

$ cat /run/systemd/system/etcd.service.d/20-cloudinit.conf
cat: /run/systemd/system/etcd.service.d/20-cloudinit.conf: No such file or directory

/etc/environmentファイルも生成されていません。
その代わり、/cloudinit-tempxxxxのファイルが作成されるようになりました。でもempty。

/cloudinit-temp850627980
COREOS_PUBLIC_IPV4=
COREOS_PRIVATE_IPV4=

write_filesの書式が違っていた

Using Cloud-Configのページで書式を確認すると、write_filesの書き方を間違えていました。正しくは-name:でなく-path:です。

#cloud-config
write_files:
- path: /etc/fleet/fleet.conf
permissions: 0644
content: |
verbosity=1
metadata="region=us-west,type=ssd"

/var/lib/coreos-install/user_dataを編集してrebootします。

/var/lib/coreos-install/user_data
write_files:
- path: /etc/environment
content: |
COREOS_PUBLIC_IPV4=$public_ipv4
COREOS_PRIVATE_IPV4=$private_ipv4

reboot後確認すると、/etc/environmentファイルはできましたが、まだ値が入りません。

/etc/environment
COREOS_PUBLIC_IPV4=
COREOS_PRIVATE_IPV4=

手動でプライベートIPアドレスを指定

  • Update 2014-07-23

ifconfigでIPアドレスを確認します。

$ ifconfig ens32 | awk '/inet /{print $2}'
10.1.0.174

確認したIPアドレスを記述します。

/etc/environment
COREOS_PUBLIC_IPV4=
COREOS_PRIVATE_IPV4=10.1.0.174

rebootすると、fleetctlが使えるようになりました。

fleetctl list-machines
MACHINE IP METADATA
0ba88b13... 10.1.0.174 -

discovery.etcd.ioにもノードが追加されるようになりました。

$ curl https://discovery.etcd.io/ed724cf0abd2d02abf985f57b53d6cf4
{"action":"get","node":{"key":"/_etcd/registry/ed724cf0abd2d02abf985f57b53d6cf4","dir":true,"nodes":[{"key":"/_etcd/registry/ed724cf0abd2d02abf985f57b53d6cf4/0ba88b13eef245cc89d1dd880fd8f7fa","value":"http://10.1.0.174:7001","expiration":"2014-07-30T04:43:25.881316985Z","ttl":604662,"modifiedIndex":57181290,"createdIndex":57181290}],"modifiedIndex":56074323,"createdIndex":56074323}}

$public_ipv4 と $private_ipv4は、coreos-cloudinitが直接EC2のmetadataやOpenStackのconfig-driveから取得するように変わったようです。

IDCFクラウドではuser_dataが取得できないので、$public_ipv4 と $private_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.

教訓

ドキュメントは普通に全部読むこと。特にCoreOSのドキュメントは頻繁に更新されます。
issuesを読むこと。きっとだれか同じ状況で困ってます。
CoreOSの変更はアグレッシブ。ばさっと大きな変更をしてきます。