0%

GCEにCoreOSクラスタを構築する

CoreOSでcloud-configの使い方を勉強しています。coreos-vagrantにあるサンプルを動かしたいのですが、手元にVagrant+VirtualBoxの環境がないため、GCE上に構築しました。

Tokenの取得

discovery.etcd.ioからTokenを取得します。

$ curl https://discovery.etcd.io/new
https://discovery.etcd.io/xxxxxxec30bcd32828da204f4a8c5e67

cloud-config.yaml

最初にプロジェクトの作成をします。

$ mkdir -p ~/gce_apps/fleet_apps
$ cd !$

discovery.etcd.io取得したTokenをdiscoveryに使用します。

~/gce_apps/fleet_apps/cloud-config.yaml
#cloud-config

coreos:
etcd:
discovery: https://discovery.etcd.io/xxxxxxec30bcd32828da204f4a8c5e67
addr: $public_ipv4:4001
peer-addr: $public_ipv4:7001
units:
- name: etcd.service
command: start
- name: fleet.service
command: start
runtime: no
content: |
[Unit]
Description=fleet

[Service]
Environment=FLEET_PUBLIC_IP=$public_ipv4
ExecStart=/usr/bin/fleet

CoreOS 310.1.0イメージの追加

Running CoreOS on Google Compute Engineに記載している、beta channelのイメージを、Google Cloud Storageから自分のアカウントに追加します。

$ gcutil addimage --description="CoreOS 310.1.0" coreos-v310-1-0 gs://storage.core-os.net/coreos/amd64-usr/beta/coreos_production_gce.tar.gz

CoreOSクラスタの作成

複数のインスタンスを同時に作成すると、discoveryにタイムアウトしてしまうので、1インスタンスずつ作成します。

$ gcutil addinstance --image=coreos-v310-1-0 --persistent_boot_disk --zone=us-central1-a --machine_type=n1-standard-1 --metadata_from_file=user-data:cloud-config.yaml core1
INFO: Resolved coreos-v310-1-0 to coreos-v310-1-0
+-------+----------------+---------------+---------------+---------+
| name | network-ip | external-ip | zone | status |
+-------+----------------+---------------+---------------+---------+
| core1 | xx.240.118.255 | xxx.59.81.232 | us-central1-a | RUNNING |
+-------+----------------+---------------+---------------+---------+

クラスタに追加されるまで、まってから、etcdを確認します。1台追加されました。

$ curl https://discovery.etcd.io/xxxxxxec30bcd32828da204f4a8c5e67
{"action":"get","node":{"key":"/_etcd/registry/xxxxxxec30bcd32828da204f4a8c5e67","dir":true,"nodes":[{"key":"/_etcd/registry/xxxxxxec30bcd32828da204f4a8c5e67/179b2d980b774f42a58c7b9692215cbe","value":"http://xxx.59.81.232:7001","expiration":"2014-05-19T14:22:25.280367915Z","ttl":604752,"modifiedIndex":16671994,"createdIndex":16671994}],"modifiedIndex":16671508,"createdIndex":16671508}}

core1にSSH接続して、fleetctlコマンドでインスタンスを一覧します。

$ gcutil  ssh --ssh_user=core core1
$ fleetctl list-machines -l
MACHINE IP METADATA
128b69cc-8736-47c5-b0dc-caa07cff8a5b xxx.59.81.232 -

クラスタに追加されたのを確認してから2台目、3台目を作成します。

$ gcutil addinstance --image=coreos-v310-1-0 --persistent_boot_disk --zone=us-central1-a --machine_type=n1-standard-1 --metadata_from_file=user-data:cloud-config.yaml core2
$ gcutil addinstance --image=coreos-v310-1-0 --persistent_boot_disk --zone=us-central1-a --machine_type=n1-standard-1 --metadata_from_file=user-data:cloud-config.yaml core3

2台目、3台目も、クラスタに追加されるまで、それぞれ30秒くらい待ちました。

$ curl https://discovery.etcd.io/xxxxxxec30bcd32828da204f4a8c5e67
{"action":"get","node":{"key":"/_etcd/registry/xxxxxxec30bcd32828da204f4a8c5e67","dir":true,"nodes":[{"key":"/_etcd/registry/xxxxxxec30bcd32828da204f4a8c5e67/179b2d980b774f42a58c7b9692215cbe","value":"http://xxx.59.81.232:7001","expiration":"2014-05-19T14:22:25.280367915Z","ttl":604271,"modifiedIndex":16671994,"createdIndex":16671994},{"key":"/_etcd/registry/xxxxxxec30bcd32828da204f4a8c5e67/43e2ad871a5c4bab95acfecda888627e","value":"http://xx.236.53.190:7001","expiration":"2014-05-19T14:28:22.683998037Z","ttl":604628,"modifiedIndex":16673607,"createdIndex":16673607},{"key":"/_etcd/registry/xxxxxxec30bcd32828da204f4a8c5e67/5f8680b47fa548d09a7403fa7f47567a","value":"http://xxx.223.233.121:7001","expiration":"2014-05-19T14:31:03.329011319Z","ttl":604789,"modifiedIndex":16674330,"createdIndex":16674330}],"modifiedIndex":16671508,"createdIndex":16671508}}

core1にSSH接続して、fleetctlコマンドでインスタンスを一覧します。

$ gcutil  ssh --ssh_user=core core3
$ fleetctl list-machines -l
MACHINE IP METADATA
128b69cc-8736-47c5-b0dc-caa07cff8a5b xxx.59.81.232 -
d92e436b-8dc8-441c-8842-fa5b7b4a2840 xx.236.53.190 -
dfe3051c-b2c1-4ce6-aeb0-aef016d4423b xxx.223.233.121 -

CoreOSクラスタ外からfleetctlで接続する

作業用のUbuntuにfleet をセットアップします。

$ git clone https://github.com/coreos/fleet.git
$ cd fleet
$ ./build
Building fleet...
Building fleetctl...

endpointに、core1のexternal-ipを指定します。

$ bin/fleetctl --endpoint 'http://xxx.59.81.232:4001'  list-machines -l
MACHINE IP METADATA
xxx.59.81.232 -
xx.236.53.190 -
xxx.223.233.121 -

まとめ

gcutilコマンドが便利なので、coreos-vagrantと同じくらい簡単にクラスタができました。
GCEとCoreOSなので、インスタンスの起動も速いです。
CoreOSやMesosを触っていると、Datacenter-as-a-Computerというのが、今後のクラウドの使い方のベースになる気がして、
OSやコンピューターの概念の規模感がだいぶ変わってきました。