最近、Hypervisor型とは異なる仮想化技術であるコンテナ化技術をベースとした「Docker」が話題となっています。そして、Dockerを動かすことに特化したLinux Distributionとして「CoreOS」が注目されています。このたび、IDCFクラウドに対応したCoreOSテンプレートをリリースいたしました。
CoreOSテンプレートは、通常のテンプレートと使用方法が異なる部分がいくつかあるため、IDCFクラウド対応の機能説明と合わせて、基本的な使い方を紹介いたします。
1. IDCFクラウド対応CoreOSテンプレートの機能
このたびリリースしたCoreOSテンプレートには、CoreOSをISOイメージからインストールした場合と比べて、以下の機能が追加されています。
- VMware Tools (open-vm-tools)がインストールされており、IDCFクラウドのポータル画面からの再起動などに対応
- IDCFクラウドの仮想マシン作成時に指定するSSHキーの設定に対応(ただしrootではなく「core」ユーザーのSSHキーとして設定)
- CloudStack APIにある「User Data」機能を用いてcloud-config.ymlを投入することで、仮想マシン起動時のCoreOS自動構築に対応
- NTPの時刻同期先としてIDCFクラウドで提供しているNTPサーバーを指定
- TimezoneをAsia/Tokyoに設定
なお、通常の仮想マシンテンプレートと異なり、パスワードの自動設定および初期化機能には対応していないのでご注意ください。
2. CoreOSテンプレートを使った仮想マシン作成
では、早速CoreOSテンプレートから仮想マシンを作成してみましょう。ここでは、IDCFクラウドのアカウント登録と支払情報の登録が既に完了している前提で説明いたします。
2-1. ポータル画面からのCoreOS仮想マシン作成
- IDCFクラウドのポータルにログインします。
- 次に画面上部の「仮想マシン作成」をクリックします。
- 「イメージ」の項目で「その他」をクリックするとイメージ一覧にCoreOS (stable) 494.4.0 64-bitが表示されるので選択します。
- 「SSH Key」でSSHログインに使う公開鍵を指定もしくは生成します。生成した場合は表示された秘密鍵を保存します。
- 仮想マシン名などを適宜指定したあと「確認画面へ」をクリックし、内容に間違いがなければ仮想マシンの作成を実行します。
2-2. 作成した仮想マシンへのSSHログイン
- ポータル画面左側の「IPアドレス」をクリックし、次にSSH接続に利用するIPアドレスを選択します。
- 「ファイアウォール」をクリックします。ソースCIDRの欄にある選択肢で「My IP」を指定すると、現在操作をしている端末のパブリックIPが自動的に指定されるので非常に便利です。タイプとして「SSH」を選択して右端のボタンをクリックします。
- 次に「ポートフォーワード」をクリックします。「プライベートポート」を「SSH」と指定し、パブリックポートを「22」と入力、「仮想マシン」では先ほど作成した仮想マシン名を選択します。その後右端のボタンをクリックします。
- SSHクライアントソフトを使い、ここまでの手順で設定したIPアドレスにSSH接続を開始します。この際、ユーザー名は「core」、SSH Keyには仮想マシン作成時に登録した鍵ペアを指定します。
以上でCoreOSにログインできます。なお、管理者権限で操作するにはsudo
コマンドを利用します。
3. CloudStack User Data機能を使ったCoreOSの自動構築
CoreOSには以下の特徴があります。
- Dockerを動かすことに特化しており、非常にイメージサイズ、メモリ消費等が少ない
- CoreOS自体にアプリケーションを追加することは原則行わず、RPMなどのパッケージマネージャも存在しない
- クラウド(IaaS)上で大量にサーバーを立てることを前提として、OS設定自動化の仕組み(cloud-init)がある
IDCFクラウド対応のCoreOSテンプレートも上記のcloud-initに対応しています。ここでは、cloud-initによる設定自動化の手順を解説します。
3-1. cloud-initとは
CoreOSに搭載されているcloud-init機能とは、OSの起動時に初期設定(ネットワーク設定、ユーザーの作成、サービスの起動など)を自動的に行うための機能です。初期設定したい項目を所定の書式で記述し、cloud-config.yml
として保存し、OS起動時に読み込ませるようにします。 cloud-config.yml
の読み込み方法(Datasourceといいます)には色々なものがあります。Amazon EC2や当社IDCFクラウドのUser Data機能や、cloud-config.ymlを保存したDiskから読み込ませる等があります。User Data機能を使うと、APIとの組み合わせで大量のCoreOSを自動的に構築できるようになります。
詳細な使い方についてはCoreOSドキュメントサイトの「Using Cloud-Config」や「CloudInit Documentation」に詳細な解説があります。
3-2. CloudStackのUser Data機能を使ったcloud-init
それでは実際にIDCFクラウド(CloudStack)のUser Data機能を使ってCoreOS起動時に初期設定を行うようにしてみましょう。 まず、IDCFクラウドへAPIを実行する環境については、弊社サポートサイトのAPI利用手順や以前のBlog記事「APIを利用した簡単オートスケール」にて解説済みの手順で準備済みである前提とします。
次に、CoreOSに実行させたい初期設定ファイルcloud-config.yml
を作成します。今回の例ではidcfというユーザーの作成、SSH公開鍵の設定、およびDockerサービスを起動するという内容でテストをします。
#cloud-config
users:
- name: idcf
groups:
- sudo
ssh-authorized-keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBXkUaxwRYPHjcciI00uO8AB1tgIK7h0KARYY5JS6JlaHaHR/3yx02HbBv5lEPDsz6xDVb7vHOTJpiMXIUUvJ4Z480A6EF0wIwTB0xVvElIR/Az6ys4FkO1A+jo6udevoLob1PO4VwwZjqFY+YTLtkGBbtvrrbfQNJTMagZTf4Z2NNmQ4sHI6b4ge5wE+CD+fCE1wSh9IU+HjWp6wkKaKQXSdvzxFFf5lf0N0UiZHzRyE99vK3tWw9a+jyNMZb067WYPV/aXGB1Doko3v9x0zklKFUx4nJG3iIQ09fQIXQQUMNV8f5FypJubzYu+uvx8/zXQk98Jx4vI9jPVJS6S7d
coreos:
units:
- name: docker.service
command: start
CloudStackのUser Dataについて、いくつか注意点があります。
- APIに引数として渡すデータはBase64エンコードし、改行を削除した文字列である必要がある
- cloudstack-apiコマンド等HTTP GETリクエストで送信できるUser DataはBase64エンコード後で2KBまで対応
- HTTP POSTリクエスト(User Data自体はPOSTのBody部分に記載)を使うと32KBまで対応
- Base64エンコード前のデータのバイト数が3の倍数ではない場合、正常に認識できない
最後の点があるため、上記の例では改行などを削除して合計546バイトにしています。
APIを実行する端末上で上記の内容のcloud-config.yml
を作成した後、Base64エンコードした文字列を取得します。
$ base64 cloud-config.yml | tr -d "\n" ;echo ""
I2Nsb3VkLWNvbmZpZwp1c2VyczoKICAtIG5hbWU6IGlkY2YKICAgIGdyb3VwczoKICAgICAgLSBzdWRvCiAgICBzc2gtYXV0aG9yaXplZC1rZXlzOgogICAgICAtIHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQURBUUFCQUFBQkFRREJYa1VheHdSWVBIamNjaUkwMHVPOEFCMXRnSUs3aDBLQVJZWTVKUzZKbGFIYUhSLzN5eDAySGJCdjVsRVBEc3o2eERWYjd2SE9USnBpTVhJVVV2SjRaNDgwQTZFRjB3SXdUQjB4VnZFbElSL0F6NnlzNEZrTzFBK2pvNnVkZXZvTG9iMVBPNFZ3d1pqcUZZK1lUTHRrR0JidHZycmJmUU5KVE1hZ1pUZjRaMk5ObVE0c0hJNmI0Z2U1d0UrQ0QrZkNFMXdTaDlJVStIaldwNndrS2FLUVhTZHZ6eEZGZjVsZjBOMFVpWkh6UnlFOTl2SzN0V3c5YStqeU5NWmIwNjdXWVBWL2FYR0IxRG9rbzN2OXgwemtsS0ZVeDRuSkczaUlRMDlmUUlYUVFVTU5WOGY1RnlwSnViell1K3V2eDgvelhRazk4Sng0dkk5alBWSlM2UzdkCmNvcmVvczoKICAgIHVuaXRzOgogICAgICAtIG5hbWU6IGRvY2tlci5zZXJ2aWNlCiAgICAgICAgY29tbWFuZDogc3RhcnQK
上記文字列を使って、先ほど作成した仮想マシンにUser Dataを設定します。
$ cloudstack-api listVirtualMachines -t id,name,group,state
+--------------------------------------+--------+-------+---------+
| id | name | group | state |
+--------------------------------------+--------+-------+---------+
| 3583dc29-5860-47aa-bc13-9fbb7ce50d46 | coreos | test | Running |
+--------------------------------------+--------+-------+---------+
$ cloudstack-api updateVirtualMachine --id 3583dc29-5860-47aa-bc13-9fbb7ce50d46 \
--userdata I2Nsb3VkLWNvbmZpZwp1c2VyczoKICAtIG5hbWU6IGlkY2YKICAgIGdyb3VwczoKICAgICAgLSBzdWRvCiAgICBzc2gtYXV0aG9yaXplZC1rZXlzOgogICAgICAtIHNzaC1yc2EgQUFBQUIzTnphQzF5YzJFQUFBQURBUUFCQUFBQkFRREJYa1VheHdSWVBIamNjaUkwMHVPOEFCMXRnSUs3aDBLQVJZWTVKUzZKbGFIYUhSLzN5eDAySGJCdjVsRVBEc3o2eERWYjd2SE9USnBpTVhJVVV2SjRaNDgwQTZFRjB3SXdUQjB4VnZFbElSL0F6NnlzNEZrTzFBK2pvNnVkZXZvTG9iMVBPNFZ3d1pqcUZZK1lUTHRrR0JidHZycmJmUU5KVE1hZ1pUZjRaMk5ObVE0c0hJNmI0Z2U1d0UrQ0QrZkNFMXdTaDlJVStIaldwNndrS2FLUVhTZHZ6eEZGZjVsZjBOMFVpWkh6UnlFOTl2SzN0V3c5YStqeU5NWmIwNjdXWVBWL2FYR0IxRG9rbzN2OXgwemtsS0ZVeDRuSkczaUlRMDlmUUlYUVFVTU5WOGY1RnlwSnViell1K3V2eDgvelhRazk4Sng0dkk5alBWSlM2UzdkCmNvcmVvczoKICAgIHVuaXRzOgogICAgICAtIG5hbWU6IGRvY2tlci5zZXJ2aWNlCiAgICAgICAgY29tbWFuZDogc3RhcnQK
(エラーが表示されないことを確認)
仮想マシンを再起動することで設定を反映させます。
$ sudo cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
core:x:500:500:CoreOS Admin:/home/core:/bin/bash
$ sudo systemctl -al | grep docker
docker.service loaded inactive dead Docker Application Container Engine
docker.socket loaded active listening Docker Socket for the API
early-docker.target loaded inactive dead Run Docker containers before main Docker starts up
$ sudo reboot
(CoreOS再起動を実施後、再びSSHログイン)
$ sudo cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
core:x:500:500:CoreOS Admin:/home/core:/bin/bash
idcf:x:1000:1000::/home/idcf:/bin/bash
$ sudo cat /home/idcf/.ssh/authorized_keys
# auto-generated by /usr/bin/update-ssh-keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBXkUaxwRYPHjcciI00uO8AB1tgIK7h0KARYY5JS6JlaHaHR/3yx02HbBv5lEPDsz6xDVb7vHOTJpiMXIUUvJ4Z480A6EF0wIwTB0xVvElIR/Az6ys4FkO1A+jo6udevoLob1PO4VwwZjqFY+YTLtkGBbtvrrbfQNJTMagZTf4Z2NNmQ4sHI6b4ge5wE+CD+fCE1wSh9IU+HjWp6wkKaKQXSdvzxFFf5lf0N0UiZHzRyE99vK3tWw9a+jyNMZb067WYPV/aXGB1Doko3v9x0zklKFUx4nJG3iIQ09fQIXQQUMNV8f5FypJubzYu+uvx8/zXQk98Jx4vI9jPVJS6S7d
$ sudo systemctl -al | grep docker
sys-devices-virtual-net-docker0.device loaded active plugged /sys/devices/virtual/net/docker0
sys-subsystem-net-devices-docker0.device loaded active plugged /sys/subsystem/net/devices/docker0
var-lib-docker-btrfs.mount loaded active mounted /var/lib/docker/btrfs
docker.service loaded active running Docker Application Container Engine
docker.socket loaded active running Docker Socket for the API
上記で、idcfというユーザーが追加され、SSH公開鍵の設定が実施されている事と、Dockerサービスが自動起動するよう設定が変わっていることがわかります。 ここまでCoreOSテンプレートの使い方の基礎について解説いたしました。ただ、CoreOS自体が頻繁にバージョンアップしていることから、本記事の内容が正常に当てはまらなくなる場合がございます。その場合はCoreOSのコミュニティなどから最新情報を取得していただきますよう、お願いいたします。
次回、CoreOSのテンプレートの作成手順、カスタマイズ手順についてご紹介する予定です。お楽しみに。
参考リンク:CoreOS Documentation