: O. Yuanying

CoreOS on Minnowboard

始まりは去年の12月に見たこのツイート。一瞬で心奪われて思いました、「俺もやる!」 次の日には Minnowboard Turbot を発注してました。6台。

海外からの購入の割に届くのは早く、次の週には実機を手にしていたのですが、それからが長かった。 最終的にはこの6台に Kubernetes をインストールして自鯖の環境を全部これに引っ越したかったのですが、 そもそもベアメタル上に Kubernetes をどうインストールしよう、と言うことに時間がかかり。 仮想環境上で試行錯誤を繰り返して目処が見えたのでようやく実機に OS をインストールすることにしました。

ベアメタルへの CoreOS インストール

CoreOS のドキュメントを見る限りディスクに CoreOS をインストールする手順は、 Live CD などで (PXE とかでもいい) テンポラリに OS を起動しておいて、 そこから coreos-install と言うスクリプトでターゲットとするディスクに CoreOS をインストールする と言うものでした。

  1. ノードを起動、方法としては以下の三つ
    1. iPXE でテンポラリに CoreOS を起動
    2. PXE でテンポラリに CoreOS を起動
    3. USB もしくは Live CD で何らかの OS を起動
  2. 上記で起動したのちに CoreOS をディスクにインストール

が、家の環境に PXE のセットアップとかしたくないし、 かといっていちいち Minnowboard にディスプレイとキーボード繋いで coreos-install ってするの面倒だなあと。 RaspberryPI みたいに SD カードに OS を dd して電源ボタン押すだけで良いとかないのかいなと思ったわけですよ。

coreos-install を読む

とりあえず coreos-install読んで見ました

色々ごちゃごちゃやっているようだけど、 自分の興味あるところだけ要約すると、

  1. イメージをダウンロードして解凍し、ターゲットとするディスクに dd
  2. ルートディスクをマウント
  3. user-data を所定の場所にコピー

してるだけでした。何だ、SDカードにあらかじめインストールしておけるじゃん。

イメージの作成

最終的に Kubernetes をクラスターにインストールすることを念頭にしてるので、 ちょびっとごちゃごちゃしてるけど、 イメージを作成するスクリプトを書いた

etcd と Kubernetes を https で起動したかったので、 あらかじめ TLS サーバ/クライアント証明書をイメージに埋め込んでおくことにした。

利用した user-data はこんな感じ。ネットワークデバイス名は enp2s0 らしい。

#cloud-config
hostname: master01
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC0ol7jQ4umQMrE1qtXnyeYk/23g6zVJyVPh0+rljElu/7zj6iJZtixxs+LebPH6mZP13RIGPP0GlrSXRVBj9F2pjb/Y/PMyHBq3+BMeiYhn6XmNMwtTK2O69vvFZQi0M3wTVSezP9OxxrPay+eCXkGVi8lnh6ZDMrvSKI2c5SQ7wFJfT/4XTxzcP2gsotRV0rzADie1EF4MYke+ZJuiwnrFbZpeogrNtSvivR4f/g0/fD8NOjCKgbk4uY//6YhEqNaGhm0wABKt0MtimmxLLe2kosoFS539t88y5tD4ispcxlOAtVKZEL1ogf0VRrcBWSTfIiJty5vw6aRTfoFwuzZ ootsuka@mxs.nes.nec.co.jp

coreos:
  etcd2:
    name: master01
    discovery: https://discovery.etcd.io/XXXXXXXXXXXXXXXXXXXXXXXXXXX
    advertise-client-urls: https://192.168.3.111:2379
    initial-advertise-peer-urls: https://192.168.3.111:2380
    listen-client-urls: https://192.168.3.111:2379,http://127.0.0.1:2379
    listen-peer-urls: https://192.168.3.111:2380
    client-cert-auth: true
    cert-file: /etc/kubernetes/ssl/apiserver.pem
    key-file: /etc/kubernetes/ssl/apiserver-key.pem
    trusted-ca-file: /etc/kubernetes/ssl/ca.pem
    ca-file: /etc/kubernetes/ssl/ca.pem
    peer-client-cert-auth: true
    peer-cert-file: /etc/kubernetes/ssl/apiserver.pem
    peer-key-file: /etc/kubernetes/ssl/apiserver-key.pem
    peer-trusted-ca-file: /etc/kubernetes/ssl/ca.pem
    peer-ca-file: /etc/kubernetes/ssl/ca.pem
  units:
    - name: etcd2.service
      command: start
    - name: 00-enp2s0.network
      runtime: true
      content: |
        [Match]
        Name=enp2s0

        [Network]
        DNS=8.8.8.8
        Address=192.168.3.111/16
        Gateway=192.168.11.1

イメージの書き込み

さて、適当な Linux マシンでイメージを作成したら、 今度はそれを Mac に持ってきて、SD カードに書き込む。 (何で Linux マシンから SD カードに直接書き込まないのかと言うと、 VM だから SD カードマウントするのめんどかったからです。)

手順は、

  1. diskutils で SD カードの場所を調べる。
  2. ボリューム? をアンマウント。
  3. dd で書き込み。
  4. SD カードをイジェクト。

Minnowboard 起動

書き込みが終わったら、とうとう Minnowboard の起動です。 SD カードを刺して電源繋げば起動するはず…。

が、起動しない。

Power up the MinnowBoard Turbot を読んだところ、 UEFI shell とやらがデフォルトで起動してしまう模様。 とりあえずドキュメント通りに HW の時刻を合わせ、boot order を変更したのちに、 再度電源オン…。

起動した。

次のエントリで Kubernetes が動いてると良いな…。