#chiroito ’s blog

Java を中心とした趣味の技術について

VirtualBox で Container Linux (CoreOS) を動かす

GitHub - coreos/coreos-vagrant: Minimal Vagrantfile for Container Linuxを使用して構築する方が圧倒的に早いですが、Running CoreOS Container Linux on VirtualBoxを参考に、IPアドレスの設定とプロキシの設定をした Container Linux を VirtualBox 上に作成します。 Windows 上で Cygwin を使用して作成しましたが、Mac や Linux 上でも作成できると思います。

手順は以下のとおりです。

環境

  • Windows 8.1
  • Cygwin (wget, mkisofsあたりが必要)
  • VirtualBox 5.1.22

Container Linux のハードディスク・イメージを作成

ハードディスク・イメージを作成

CoreOS は便利なスクリプトを github 上で公開しています。今回はハードディスク・イメージを作成するスクリプトをダウンロードして使用します。

> wget https://raw.github.com/coreos/scripts/master/contrib/create-coreos-vdi
> chmod +x create-*
> ./create-coreos-vdi -V stable -d ./
(略)
Success! CoreOS stable VDI image was created on coreos_production_1409.5.0.vdi

この後、 VM を起動しますが、上記で作成したハードディスクのイメージファイル使うと、VM を作るたびにイメージファイルを作らなくてはなりません。この作成処理は時間が掛かるので VM ごとに作成するのは時間がもったいないです。そのため、一度作ったイメージファイルを VM ごとに複製し、各 VM は複製したそれぞれのイメージファイルを使用することで構築時間を短縮しましょう。

> VBoxManage clonehd coreos_production_*.vdi my_vm01.vdi
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
Clone medium created in format 'VDI'. UUID: 5e11ad7d-40da-4158-9980-612aaa9d0cd9

Container Linux の設定用イメージを作成

接続用鍵を作成

Container Linux へ接続する SSH の認証鍵を作成します。以下のコマンドを実行すると~/.sshディレクトリにid_ed25519id_ed25519.pubというファイルが作成されます。

> ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
(略)
The key's randomart image is:
+--[ED25519 256]--+
(略)
+----[SHA256]-----+

トークンの作成

クラスタ間で設定を共有するためのトークン付きのURLを取得します。このURLは同じクラスタの Container Linux で共有します。

> curl -s https://discovery.etcd.io/new
https://discovery.etcd.io/xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

(細かい設定をしない場合)

今回の例ではIPアドレスの設定とプロキシの設定をした Container Linux を作成しますが、IPアドレスの設定やプロキシの設定などの特別な設定を行わない場合には、以下のスクリプトをダウンロードして実行することで設定用イメージの作成をスキップできます。

このスクリプトは以下の引数を付与して実行します。

  • -H:名前
  • -S:暗号鍵の公開鍵(.pubで終わる方)
  • -t:トークン
> wget https://raw.github.com/coreos/scripts/master/contrib/create-basic-configdrive
> ./create-basic-configdrive -H my_vm01 -S ~/.ssh/id_ed25519.pub -t xxxxx

設定用ファイルを作成

設定ファイルはそれぞれの Container Linux ごとに必要です。2 つの Container Linux を作成する場合は 2 つの設定ファイルが必要となります。設定はopenstack/latestディレクトリ以下にuser_dataというファイルを作成し YAML で記述します。my_vm01my_vm02という名前の Container Linux を構築する場合、my_vm01/openstack/latestmy_vm02/openstack/latestのようにディレクトリを作成すると良いと思います。

設定ファイルの内容は、以下のサイトを使うことで、記述した YAML のフォーマットに誤りが無いかを検証できます。

CoreOS Container Linux Config Validator

このサンプルは、my_vm01という名前の Container Linux に IP アドレスとして192.168.56.90を設定し、プロキシとしてhttp://proxy:80を設定します。

以下の 2 つは作成・取得した物に置き換えてください。

  • discoveryはトークン付きのURL を指定します。
  • ssh_authorized_keys はcat ~/.ssh/id_ed25519.pubの出力結果を指定します
SETTING_DIR=my_vm01
mkdir -p ${SETTING_DIR}/openstack/latest
vim ${SETTING_DIR}/openstack/latest/user_data

${SETTING_DIR}/openstack/latest/user_data

#cloud-config

write_files:
    - path: "/etc/systemd/network/10-hostonly.network"
      owner: "root"
      permissions: "0644"
      content: |
          [Match]
          Name=enp0s8
          [Network]
          Address=192.168.56.90/24
coreos:
  etcd2:
    name: my_vm01
    advertise-client-urls: http://$public_ipv4:2379
    initial-advertise-peer-urls: http://$private_ipv4:2380
    discovery: https://discovery.etcd.io/xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    listen-peer-urls: http://0.0.0.0:2380
    listen-client-urls: http://0.0.0.0:2379,http://0.0.0.0:4001
  units:
    - name: etcd2.service
      command: start
    - name: fleet.service
      command: start
    - name: docker.service
      enable: true
      command: start
      drop-ins:
        - name: 20-http-proxy.conf
          content: |
            [Service]
            Environment="HTTP_PROXY=http://proxy:80"
ssh_authorized_keys:
  - ssh-ed25519 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxx
hostname: my_vm01

設定用イメージを作成

作成した設定ファイルを使用して、設定用イメージを作成します。

> mkisofs -R -V config-2 -o my_vm01.iso ${SETTING_DIR}

VirtualBox

VM の設定

仮想マシン(VM)を作成します。Container Linux は名前のとおり Linux なのでタイプは Linux を選びます。カーネルは 64bit の 4.11.6 なのでバージョンは Linux 2.6 / 3.x / 4.x (64-bit) を選びます。ハードディスクは先ほど複製したハードディスクイメージを使用するため、右側のフォルダのアイコンから先ほど複製した my_vm01.vdi を選択します。

f:id:chiroito:20170630235005p:plain

ストレージに設定用のイメージ(my_vm01.iso)を光学ドライブとして追加します。コントローラは何を選んでも大丈夫だと思います(未確認)。

ネットワークは以下の 2 つを設定します。

  • Container Linux からインターネットへ接続するための NAT
  • ホストである Windows から Container Linux へ接続するための ホストオンリーアダプタ

ここまで完了すると以下のとおりの設定になります。

一般
f:id:chiroito:20170630232953p:plain

ストレージ
f:id:chiroito:20170701005121p:plain

ネットワーク アダプタ1
f:id:chiroito:20170630233215p:plain

ネットワーク アダプタ2
f:id:chiroito:20170630233038p:plain

VM の起動

VM を起動すると、10秒程度で以下のように鍵の情報と IP アドレスが表示されます。これで起動は完了です。 f:id:chiroito:20170630233440p:plain

SSH でホストから Container Linux へ接続してみましょう。

> ssh core@192.168.56.90 -i ~/.ssh/id_ed25519

参考にした情報