<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://purl.org/rss/1.0/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
  <channel rdf:about="http://www.fraction.jp/log/category/Linux/">
    <title>Linux -- BONNOH FRACTION 14</title>
    <link>http://www.fraction.jp/log/category/Linux/</link>
    <description>世の中に寝るより楽はなかりけり&lt;br /&gt;浮世の馬鹿は起きて働く</description>
    
    <dc:creator>Yuanying</dc:creator>
	<dc:date>2018-06-18T09:39:56+09:00</dc:date>
	<admin:generatorAgent rdf:resource="http://webby.rubyforge.org/?v=0.9.4"/>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2017/10/25/openstack-jp-study-group" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2017/10/12/self-hosted-kubernetes" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2017/07/31/glusterfs-on-k8s" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2017/03/31/minnowboard-using-ssd" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2017/03/30/etcd3-on-coreos" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2017/03/17/coreos-on-minnowboard" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2013/08/22/util-for-docker" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2013/08/05/my-server-with-nuc" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2013/04/28/1vm-cloudfoundry-by-nise-bosh" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2010/04/08/Ruby__CAS_" />
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="http://www.fraction.jp/log/archives/2017/10/25/openstack-jp-study-group">
    <title>OpenStack ユーザ会 第36回勉強会</title>
    <link>http://www.fraction.jp/log/archives/2017/10/25/openstack-jp-study-group</link>
    <description>OpenStack ユーザ会 第36回勉強会に参加。っつーか発表してきた。タイトルは「Kubernetes on Kunernetes on OpenStack」。内容は Self-Hosted Kubernetes の紹介と、OpenStack 上で Self-Hosted K8s をデプロイする自作ツールの紹介。...</description>
    <content:encoded><![CDATA[
        <p><a href="https://openstack.jp/archives/465">OpenStack ユーザ会 第36回勉強会</a>に参加。っつーか発表してきた。
タイトルは「<a href="https://docs.google.com/presentation/d/1VKk89MaNkGRSlpBsOOHJt8cLD6mpZ5V55GEJqIDu2Sk/edit#slide=id.g28eb8071bc_0_1119">Kubernetes on Kunernetes on OpenStack</a>」。</p>

<p class='image'>
<img  src='/log/2017/10/Image-uploaded-from-iOS-3.jpg'
      width='480'
      height='640'
      alt=''  />
</p>


<p>内容は Self-Hosted Kubernetes の紹介と、
OpenStack 上で Self-Hosted K8s をデプロイする自作ツールの紹介。</p>

    ]]></content:encoded>
    <dc:subject>Linux</dc:subject>
    <dc:subject>Program/技術</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2017-10-25T23:34:30+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2017/10/12/self-hosted-kubernetes">
    <title>Self-Hosted Kubernetes</title>
    <link>http://www.fraction.jp/log/archives/2017/10/12/self-hosted-kubernetes</link>
    <description>自宅の Minnowboard クラスターに Kubernetes をインストールしようとしてそろそろ一年。。。CoreOS on Minnowboardetcd3 on CoreOSMinnowboard using SSDGlusterFS on Kubernetes思ったよりも時間がかかってしまったがようやくクラスターを構成できた。当初思ってたように全て Minnowboard に載せるというのは実際にアプリを乗せた際、(gitlab やら Gluster) メモリが問題になりそうだったので...</description>
    <content:encoded><![CDATA[
        <p>自宅の Minnowboard クラスターに Kubernetes をインストールしようとしてそろそろ一年。。。</p>

<ul>
<li><a href="/log/archives/2017/03/17/coreos-on-minnowboard">CoreOS on Minnowboard</a></li>
<li><a href="/log/archives/2017/03/30/etcd3-on-coreos">etcd3 on CoreOS</a></li>
<li><a href="/log/archives/2017/03/31/minnowboard-using-ssd">Minnowboard using SSD</a></li>
<li><a href="/log/archives/2017/07/31/glusterfs-on-k8s">GlusterFS on Kubernetes</a></li>
</ul>


<p>思ったよりも時間がかかってしまったがようやくクラスターを構成できた。
当初思ってたように全て Minnowboard に載せるというのは実際にアプリを乗せた際、
(gitlab やら Gluster) メモリが問題になりそうだったので、
結局ワーカーノードは ECS LIVA Z の Pentium モデルと相成った。</p>

<p class='image'>
<img  src='/log/2017/10/IMG_6335.JPG'
      width='480'
      height='640'
      alt=''  />
</p>


<p>ワーカーノードには USB でストレージを繋いで <a href="http://www.gluster.org">Gluster</a>
で管理。今流行りのハイパーコンバージド？
結局 Gluster 公式のプロビジョナーである <a href="/log/archives/2017/07/31/glusterfs-on-k8s">Heketi に不満を感じた</a>
ので<a href="https://github.com/kubernetes-incubator/external-storage/tree/master/gluster/glusterfs">自分でプロビジョナーを書いてしまった</a>。
その話を書こう書こうと思っていたのだけどめんどくさくてブログには書いておらず。</p>

<p class='image'>
<img  src='/log/2017/10/k8s-screen.png'
      width='640'
      height='783'
      alt=''  />
</p>


<p>なぜ自宅 Kubernetes クラスターの構築にこんなに時間がかかってしまったかというと、
主に Kubernetes のデプロイに使うスクリプトに意外に時間を食ってしまったから。</p>

<p>Kubespray やら Kops やら kubeadm やら Rancher やらを色々検討はしてみたものの、
自分好みのクラスターを構築しようと思ったら自分で構築するのが一番という身もふたもない結論に。
これも結局<a href="https://github.com/nec-openstack/remora">デプロイツールを自分で書いた</a>。</p>

<ul>
<li><a href="https://github.com/nec-openstack/remora">Remora -- command line tool and library to manage Kubernetes</a></li>
</ul>


<p>最初は <a href="https://github.com/kelseyhightower/kubernetes-the-hard-way">Kubernetes The Hard Way</a>
の内容を スクリプト化して、k8s 各コンポーネントの ClusterRoleBinding をちゃんと設定してあげたもの程度だったのだが、
Self-Hosted Kubernetes 化して keepalived/haproxy で冗長化、
DNS に CoreDNS 採用とかしてたら手間取った。</p>

<p>Self-Hosted は面白かったので次の <a href="https://openstack-jp.connpass.com/event/68475/">日本OpenStackユーザ会 第36回勉強会</a>
で話す予定。もし枠が空いていたら次次回の Kubernetes Meetup の LT でも。</p>

<iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=bonnohfract00-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B01MS4M6NT&amp;linkId=81679af9cdcad9b5f069ac235faacbcf"></iframe>


<iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=bonnohfract00-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B072MK19SR&amp;linkId=9382280ddf2f510a199ecd3e854e305d"></iframe>


    ]]></content:encoded>
    <dc:subject>Linux</dc:subject>
    <dc:subject>Program/技術</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2017-10-12T14:34:30+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2017/07/31/glusterfs-on-k8s">
    <title>GlusterFS on Kubernetes</title>
    <link>http://www.fraction.jp/log/archives/2017/07/31/glusterfs-on-k8s</link>
    <description>自宅の Minnowboard クラスターに Kubernetes をインストールしようとしてはや半年。CoreOS on Minnowboardetcd3 on CoreOSMinnowboard using SSDなぜかずっとコンテナのボリュームどうしようか、、と悩んで止まってましたが、ようやく目処がついてきたので進捗を。GlusterFSとりあえずボリュームには GlusterFS を使うことにした。NFS、という選択肢もあったが可用性を担保しようとするとストレージを RAID で構成しなけ...</description>
    <content:encoded><![CDATA[
        <p>自宅の Minnowboard クラスターに Kubernetes をインストールしようとしてはや半年。</p>

<ul>
<li><a href="/log/archives/2017/03/17/coreos-on-minnowboard">CoreOS on Minnowboard</a></li>
<li><a href="/log/archives/2017/03/30/etcd3-on-coreos">etcd3 on CoreOS</a></li>
<li><a href="/log/archives/2017/03/31/minnowboard-using-ssd">Minnowboard using SSD</a></li>
</ul>


<p>なぜかずっとコンテナのボリュームどうしようか、、と悩んで止まってましたが、
ようやく目処がついてきたので進捗を。</p>

<p class='image'>
<img  src='/log/2017/07/pr-gluster-simple-provisioner.png'
      width='700'
      height='495'
      alt=''  />
</p>


<h2>GlusterFS</h2>

<p>とりあえずボリュームには GlusterFS を使うことにした。
NFS、という選択肢もあったが可用性を担保しようとするとストレージを RAID で構成しなければならなかったり(RAID はなんか好きじゃない。)、
結局 NFS Server が SPOF になるんじゃないかという点が気に食わなかった。
もちろん、NFS Server を Act-Standby にしたり最近は Failover できるらしいが、
とりあえず無視する。なんとなく Gluster が使いたかった。</p>

<p>Gluster を使えば、</p>

<ul>
<li>Replicate を使えば RAID0 っぽいことがソフトウェアレベルでできる。</li>
<li>容量が足りなくなったら単純にサーバ/ディスク追加で対処できる。</li>
<li>ディスク故障による交換が簡単そう。</li>
</ul>


<p>すごい！</p>

<h3>使い方</h3>

<p>動的に Gluster のボリュームをプロビジョニングしてコンテナのボリュームとして使う方法もあるのだけど、
どうも微妙なので、とりあえずはすでに存在する Gluster のボリュームを Kubernetes の
Persistent Volume として登録する方法。</p>

<ol>
<li>Endpoint の作成</li>
<li>Service の作成</li>
<li>Persistent Volume の作成</li>
</ol>


<p>ぶっちゃけ kubernetes/examples の
<a href="https://github.com/kubernetes/examples/blob/master/staging/volumes/glusterfs/README.md">GlusterFS</a>
の内容そのままだが。</p>

<h3>Endpoint の作成</h3>

<p>ボリュームを提供する Gluster Cluster のエンドポイント情報を Kubernetes に教えるために、
<code>Endpoint</code> を作る必要がある。</p>

<pre><code>kind: Endpoints
apiVersion: v1
metadata:
  name: glusterfs-cluster
subsets:
- addresses:
  - ip: "192.168.1.111"
  ports:
  - port: 1
- addresses:
  - ip: "192.168.1.112"
  ports:
  - port: 1</code></pre>


<p><code>subsets</code> の <code>addresses</code> にそれぞれ GlusterFS Cluster のノードのアドレスを書く。
<code>ports</code> 内の <code>port</code> は <code>1-65535</code> 以内の数値ならなんでもいいらしい。</p>

<h3>Service の作成</h3>

<p>作った <code>Endpoint</code> を永続化するために関連する <code>Service</code> を作っておく必要があるらしいが、
具体的にはどういう意味があるのかわかっていない。
とりあえず <code>Service</code> を作らずに <code>Endpoint</code> だけで運用しているが今の所困ったことはないが…。</p>

<pre><code>kind: Service
apiVersion: v1
metadata:
  name: glusterfs-cluster
spec:
  ports:
  - port: 1</code></pre>


<p>普通の <code>Service</code> と違うところは <code>selector</code> が無いところで、
そのおかげでKubernetes はこの <code>Service</code> に関連する <code>Endpoint</code> を勝手にいじったりすることがなくなる。</p>

<h3>Persistent Volume の作成</h3>

<p><code>Endpoint</code> さえ作ってしまえばあとは <code>PV</code> を作れば良いだけ。</p>

<pre><code>kind: PersistentVolume
apiVersion: v1
metadata:
  name: gluster-volume
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 2Gi
  glusterfs:
    endpoints: glusterfs-cluster
    path: test-volume
    readOnly: false</code></pre>


<ul>
<li><strong>endpoints</strong>: 上記で作成した <code>Endpoint</code> の名前。</li>
<li><strong>path</strong>: path とあるが事前に作成した Gluster Volume の名前。</li>
<li><strong>readOnly</strong>: 読み込み専用にしたければどうぞ。</li>
</ul>


<p>とりあえず、これを PV の数だけ一個一個手作業でやって行くのは面倒。</p>

    ]]></content:encoded>
    <dc:subject>Linux</dc:subject>
    <dc:subject>Program/技術</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2017-07-31T21:33:30+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2017/03/31/minnowboard-using-ssd">
    <title>Minnowboard using SSD</title>
    <link>http://www.fraction.jp/log/archives/2017/03/31/minnowboard-using-ssd</link>
    <description>先日、CoreOS を SD カードにインストールして、Minnowboard を起動した。が、ふと、SD カードも 2.5inch SSD もたいして値段が変わらないんじゃ無いのか、性能や容量や安定性、運用を考えると SSD の方が良いんじゃ無いのか？？という疑問が浮かんでしまい。SSD を買ってしまった。SATA コネクタもあるし。が、問題は SATA コネクタはあるが SATA の電源をどこから確保するか。電源のためだけに USB を一個潰すのもなんだかなあと思うし、かと言って別電源を持ち出...</description>
    <content:encoded><![CDATA[
        <p>先日、
<a href="/log/archives/2017/03/17/coreos-on-minnowboard">CoreOS を SD カードにインストールして、Minnowboard を起動した</a>。
が、ふと、SD カードも 2.5inch SSD もたいして値段が変わらないんじゃ無いのか、
性能や容量や安定性、運用を考えると SSD の方が良いんじゃ無いのか？？という疑問が浮かんでしまい。</p>

<p>SSD を買ってしまった。SATA コネクタもあるし。</p>

<iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=bonnohfract00-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B01M8HPL6Q&amp;linkId=d942199993a27d54bc98011e78812b6c"></iframe>


<p>が、問題は SATA コネクタはあるが SATA の電源をどこから確保するか。
電源のためだけに USB を一個潰すのもなんだかなあと思うし、
かと言って別電源を持ち出すのも気持ち悪い。</p>

<p>調べたところ SATA の電源ケーブルは 4 本出てはいるものの、
実際に使っているのは 5V の線だけらしい。
そして 5V なら
<a href="https://www.minnowboard.org/board-viewer">CPU Fan 用のコネクタ (J2) か Low Speed Expansion (JP2) の Pin#2, #3</a>
あたりから供給可能なのでそこらあたりから持ってくるのが
<a href="http://www.opendisplaycase.com/opendisplaycase-for-sbc/minnowboard-turbot-kodi-mediaplayer-box.html">常道の模様</a>。</p>

<p class='image'>
<img  src='/log/2017/03/IMG_5564.JPG'
      width='640'
      height='480'
      alt=''  />
</p>


<p>ただし、そのためには SATA の電源コネクタから 2pin コネクタに変換するケーブルが必要になってくる、
のだが日本にはどうやら売ってない、ので作った。</p>

<p class='image'>
<img  src='/log/2017/03/IMG_5562.JPG'
      width='640'
      height='480'
      alt=''  />
</p>


<p>ケーブルを切ったりつなげたりするのは正直初めてだったので、
そもそも仕様がよくわからなったのだが、
どうやら 2pin のファンコネクタは
<a href="http://store.shopping.yahoo.co.jp/angelhamshopjapan/5051-02molex.html?sc_e=slga_pla">Molex の 5051 の 2pin</a>
というもので、
<a href="http://store.shopping.yahoo.co.jp/angelhamshopjapan/5159pbtl.html">Molex 5159</a>
というピンをケーブルに圧着して繋ぐらしい。</p>

<p>さらにはコネクタピンの対応するケーブルの仕様が AWG サイズ 22 - 28 まで、という、
(そもそも AWG ってなんじゃそりゃ) みたいなところから、
コネクタピンをどうやってケーブルに圧着するのか、
ケーブルの被膜をどうやって剥くのかみたいなところまで調べて非常にめんどくさい。</p>

<p class='image'>
<img  src='/log/2017/03/IMG_5565.JPG'
      width='640'
      height='480'
      alt=''  />
</p>


<p>SSD をマウントするためにケースを別に買ったり、色々したので、
結局 Minnnowboard 買うんだったら Intel NUC とかでも良かったなあと今更ながらに。</p>

    ]]></content:encoded>
    <dc:subject>Linux</dc:subject>
    <dc:subject>Program/技術</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2017-03-31T10:08:27+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2017/03/30/etcd3-on-coreos">
    <title>etcd3 on CoreOS</title>
    <link>http://www.fraction.jp/log/archives/2017/03/30/etcd3-on-coreos</link>
    <description>とりとめもなく、etcd3を CoreOS で使ってハマったことなどを。Kubernetes 1.6 がリリースされた。早速使ってみようと思ったのだが、どうやら 1.6 からストレージのバックエンドが etcd3 になったらしい。それはいいのだが、CoreOS のドキュメントを見るに、etcd をcloud-config で起動する方法は etcd2 のものばかりで、etcd3 をどうやって起動すればいいのやら。そもそも CoreOS に etcd3のバイナリが含まれてなくないかい？いくらかウェブ...</description>
    <content:encoded><![CDATA[
        <p>とりとめもなく、<code>etcd3</code>を CoreOS で使ってハマったことなどを。</p>

<p class='image'>
<img  src='/log/2017/03/kubectl-pod-all.png'
      width='640'
      height='475'
      alt=''  />
</p>


<p><a href="http://blog.kubernetes.io/2017/03/kubernetes-1.6-multi-user-multi-workloads-at-scale.html">Kubernetes 1.6 がリリース</a>
された。
早速使ってみようと思ったのだが、
どうやら 1.6 からストレージのバックエンドが <code>etcd3</code> になったらしい。</p>

<p>それはいいのだが、CoreOS のドキュメントを見るに、
<code>etcd</code> を
<a href="https://coreos.com/os/docs/latest/cloud-config.html">cloud-config で起動する方法</a>
は <code>etcd2</code> のものばかりで、
<code>etcd3</code> をどうやって起動すればいいのやら。
そもそも CoreOS に <code>etcd3</code>
の<a href="https://coreos.com/releases/#1353.1.0">バイナリが含まれてなくないかい</a>？</p>

<p>いくらかウェブを彷徨った末に、<code>etcd3</code> は <code>flannel</code> などと同じように、
コンテナとして起動するようになったということに気づく。
<code>service</code> の名前が <code>etcd-member</code> とやらになってたせいで若干わかりづらい。</p>

<p>なにはともあれ、CoreOS 1298.6.0 における <code>etcd-member</code> の Unit ファイルを確認する。</p>

<pre><code>[Unit]
Description=etcd (System Application Container)
Documentation=https://github.com/coreos/etcd
Wants=network.target
Conflicts=etcd.service
Conflicts=etcd2.service

[Service]
Type=notify
Restart=on-failure
RestartSec=10s
TimeoutStartSec=0
LimitNOFILE=40000

Environment="ETCD_IMAGE_TAG=v3.0.10"
Environment="ETCD_NAME=%m"
Environment="ETCD_USER=etcd"
Environment="ETCD_DATA_DIR=/var/lib/etcd"
Environment="RKT_RUN_ARGS=--uuid-file-save=/var/lib/coreos/etcd-member-wrapper.uuid"

ExecStartPre=/usr/bin/mkdir --parents /var/lib/coreos
ExecStartPre=-/usr/bin/rkt rm --uuid-file=/var/lib/coreos/etcd-member-wrapper.uuid
ExecStart=/usr/lib/coreos/etcd-wrapper $ETCD_OPTS
ExecStop=-/usr/bin/rkt stop --uuid-file=/var/lib/coreos/etcd-member-wrapper.uuid

[Install]
WantedBy=multi-user.target
</code></pre>

<p>これだけ見ると <code>etcd-wrapper</code> に起動オプションとして <code>$ETCD_OPTS</code> を環境変数として渡せばいいだけに見える。</p>

<p>が、自分は TLS クライアント認証を有効化して利用したいので、
どうにかして <code>etcd-wrapper</code>から起動されるコンテナに、
証明書を保存しているディレクトリをマウントさせなければならない。
その場合、<code>$ETCD_OPTS</code> にオプションを渡すだけでは無理だろうと想像できる。</p>

<p>ちらっと、<code>etcd-wrapper</code> のソースをのぞいて見ると、
<a href="https://github.com/coreos/coreos-overlay/blob/build-1298/app-admin/etcd-wrapper/files/etcd-wrapper#L47">$ETCD_SSL_DIR</a>
という環境変数が目に見える。
そこで思考停止して drop-ins などで <code>Environment="ETCD_SSL_DIR=/etc/kubernetes/ssl"</code>
などとしてやると
(ホスト上の <code>/etc/kubernetes/ssl</code> に証明書を置いておいたので。)
当然動かない。</p>

<p>デフォルトで <code>ETCD_SSL_DIR</code> は <code>/etc/ssl/certs</code> を指していて、
<code>etcd</code> が利用するデフォルトの CA の証明書ディレクトリとして利用されているっぽい。
これを変なところに変更してやると、
ディスカバリ URL として使ってる、
<code>https://discovery.etcd.io/</code> の証明書が invalid であると怒られる羽目となる。
そりゃそうだ、CA の証明書が無いんだから。</p>

<p>最終的には <code>https://discovery.etcd.io/</code> を使っている限り、
<code>ETCD_SSL_DIR</code> を変更するのはあまり良い方法では無いということがわかった。</p>

<p>そうすると解決する方法としては、</p>

<ol>
<li>オレオレ証明書を <code>/etc/ssl/certs</code> に保存する。</li>
<li>どうにかして <code>/etc/kubernetes/ssl</code> をマウントする。</li>
</ol>


<p>の二案ということになる。</p>

<p>案1は、元の CA の証明書は <code>/usr/share/ca-certificates</code> にあってシンボリックリンクになっているだけとはいえ、
システムにインストールされた証明書と同じ場所にオレオレ証明書をインストールするのはなんとなく憚られたため、
案2とすることにした。</p>

<p>結論を言ってしまうと、<code>$RKT_RUN_ARGS</code> という環境変数があるのでそれに渡してやればいい、
ということになる。</p>

<p>最終的には以下のような <code>cloud-config</code> になった。</p>

<p>　　...</p>

<pre><code>  units:
    - name: etcd-member.service
      command: start
      drop-ins:
      - name: 00-override.conf
        content: |
          [Service]
          Environment="RKT_RUN_ARGS=--uuid-file-save=/var/lib/coreos/etcd-member-wrapper.uuid \
                                    --volume etc-ssl-k8s-certs,kind=host,source=/etc/kubernetes/ssl,readOnly=true \
                                    --mount volume=etc-ssl-k8s-certs,target=/etc/kubernetes/ssl"
          Environment="ETCD_IMAGE_TAG=v3.1.2"
          Environment="ETCD_NAME=master01"
          Environment="ETCD_DISCOVERY=https://discovery.etcd.io/XXXXXXXXXXXXXXXXXXXXXXXXXXXX"
          Environment="ETCD_ADVERTISE_CLIENT_URLS=https://192.168.1.111:2379"
          Environment="ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.1.111:2380"
          Environment="ETCD_LISTEN_CLIENT_URLS=https://192.168.1.111:2379,http://127.0.0.1:2379"
          Environment="ETCD_LISTEN_PEER_URLS=https://192.168.1.111:2380"
          Environment="ETCD_CLIENT_CERT_AUTH=true"
          Environment="ETCD_CERT_FILE=/etc/kubernetes/ssl/apiserver.pem"
          Environment="ETCD_KEY_FILE=/etc/kubernetes/ssl/apiserver-key.pem"
          Environment="ETCD_TRUSTED_CA_FILE=/etc/kubernetes/ssl/ca.pem"
          Environment="ETCD_PEER_CLIENT_CERT_AUTH=true"
          Environment="ETCD_PEER_CERT_FILE=/etc/kubernetes/ssl/apiserver.pem"
          Environment="ETCD_PEER_KEY_FILE=/etc/kubernetes/ssl/apiserver-key.pem"
          Environment="ETCD_PEER_TRUSTED_CA_FILE=/etc/kubernetes/ssl/ca.pem"
          Environment="ETCD_PEER_CA_FILE=/etc/kubernetes/ssl/ca.pem"
...
</code></pre>

<p><code>drop-ins</code> で <code>RKT_RUN_ARGS</code> を上書きするのは良いんだけど、
デフォルトの <code>RKT_RUN_ARGS</code> もあるのでちょっと気持ち悪い。</p>

<pre><code>Environment="RKT_RUN_ARGS=${RKT_RUN_ARGS} --volume etc-ssl-k8s-certs,kind=host,source=/etc/kubernetes/ssl,readOnly=true --mount volume=etc-ssl-k8s-certs,target=/etc/kubernetes/ssl"
</code></pre>

<p>みたいにできれば良いのだが…。</p>

    ]]></content:encoded>
    <dc:subject>Linux</dc:subject>
    <dc:subject>Program/技術</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2017-03-30T18:45:52+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2017/03/17/coreos-on-minnowboard">
    <title>CoreOS on Minnowboard</title>
    <link>http://www.fraction.jp/log/archives/2017/03/17/coreos-on-minnowboard</link>
    <description>It&amp;#39;s alive! My home Kubernetes cluster is alive! pic.twitter.com/BH4P6ysbJJ&amp;mdash; Ian Lewis (@IanMLewis) 2016年12月23日 始まりは去年の12月に見たこのツイート。一瞬で心奪われて思いました、「俺もやる！」次の日には Minnowboard Turbot を発注してました。6台。海外からの購入の割に届くのは早く、次の週には実機を手にしていたのですが、それからが長かった。最終的には...</description>
    <content:encoded><![CDATA[
        

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">It&#39;s alive! My home Kubernetes cluster is alive! <a href="https://t.co/BH4P6ysbJJ">pic.twitter.com/BH4P6ysbJJ</a></p>&mdash; Ian Lewis (@IanMLewis) <a href="https://twitter.com/IanMLewis/status/812255557096599552">2016年12月23日</a></blockquote>


<p> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>

<p>始まりは去年の12月に見たこのツイート。一瞬で心奪われて思いました、「俺もやる！」
次の日には <a href="https://store.netgate.com/Turbot2.aspx">Minnowboard Turbot を発注</a>してました。6台。</p>

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

<h2>ベアメタルへの CoreOS インストール</h2>

<p>CoreOS のドキュメントを見る限りディスクに CoreOS をインストールする手順は、
Live CD などで (<a href="https://coreos.com/os/docs/latest/booting-with-pxe.html">PXE とかでもいい</a>) テンポラリに OS を起動しておいて、
そこから <code>coreos-install</code> と言うスクリプトで<a href="https://coreos.com/os/docs/latest/installing-to-disk.html">ターゲットとするディスクに CoreOS をインストールする</a>
と言うものでした。</p>

<ol>
<li>ノードを起動、方法としては以下の三つ

<ol>
<li><a href="https://coreos.com/os/docs/latest/booting-with-ipxe.html">iPXE でテンポラリに CoreOS を起動</a></li>
<li><a href="https://coreos.com/os/docs/latest/booting-with-pxe.html">PXE でテンポラリに CoreOS を起動</a></li>
<li>USB　もしくは Live CD で何らかの OS を起動</li>
</ol>
</li>
<li>上記で起動したのちに <a href="https://coreos.com/os/docs/latest/installing-to-disk.html">CoreOS をディスクにインストール</a></li>
</ol>


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

<h3><code>coreos-install</code> を読む</h3>

<p>とりあえず <code>coreos-install</code> を <a href="https://github.com/coreos/init/blob/master/bin/coreos-install">読んで見ました</a>。</p>

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

<ol>
<li><a href="https://github.com/coreos/init/blob/master/bin/coreos-install#L409">イメージをダウンロードして解凍し、ターゲットとするディスクに dd</a></li>
<li><a href="https://github.com/coreos/init/blob/master/bin/coreos-install#L409">ルートディスクをマウント</a></li>
<li><a href="https://github.com/coreos/init/blob/master/bin/coreos-install#L446">user-data を所定の場所にコピー</a></li>
</ol>


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

<h3>イメージの作成</h3>

<p>最終的に Kubernetes をクラスターにインストールすることを念頭にしてるので、
ちょびっとごちゃごちゃしてるけど、
イメージを作成するスクリプトを<a href="https://github.com/nec-openstack/remora/blob/51bbdd2d0b7693c8f632c9969b0c8f9f2ee76d50/tools/generate-images-coreos.sh">書いた</a>。</p>

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

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

<pre><code>#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
</code></pre>

<h3>イメージの書き込み</h3>

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

<p>手順は、</p>

<ol>
<li><code>diskutils</code> で SD カードの場所を調べる。</li>
<li>ボリューム? をアンマウント。</li>
<li><code>dd</code> で書き込み。</li>
<li>SD カードをイジェクト。</li>
</ol>


<h3>Minnowboard 起動</h3>

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

<p>が、起動しない。</p>

<p><a href="https://www.minnowboard.org/tutorials/powering-on-minnowboardturbot">Power up the MinnowBoard Turbot を読んだ</a>ところ、
<code>UEFI shell</code> とやらがデフォルトで起動してしまう模様。
とりあえずドキュメント通りに HW の時刻を合わせ、<code>boot order</code> を変更したのちに、
再度電源オン…。</p>

<p class='image'>
<img  src='/log/2017/03/IMG_5504.JPG'
      width='640'
      height='480'
      alt=''  />
</p>


<p>起動した。</p>

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

    ]]></content:encoded>
    <dc:subject>Linux</dc:subject>
    <dc:subject>Program/技術</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2017-03-17T09:13:49+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2013/08/22/util-for-docker">
    <title>docker 便利</title>
    <link>http://www.fraction.jp/log/archives/2013/08/22/util-for-docker</link>
    <description>自鯖にオレオレ Cloud Foundry は色々なウェブアプリを色々な環境で突っ込めて便利だなあと思う反面、一台のサーバにあんなに重厚な仕組みはいらないよなーと思ってたところに docker ですよ。概要 とか 使い方 とかはすでに他のえらい人たちが紹介してるので、使ってて気づいた便利な使い方を紹介ですよ。Remote API を使ういままで Remote API を http で公開してたので、簡単にリモートから docker の API を叩けたのですが最新の Docker ですとデフォルト...</description>
    <content:encoded><![CDATA[
        

<p>
<img  src='/log/2013/08/docker.jpg'
      width='650' 
      height='327' 
      alt=''  />
</p>


<p>自鯖にオレオレ <a href="http://www.cloudfoundry.com/">Cloud Foundry</a> は色々なウェブアプリを色々な環境で突っ込めて便利だなあと思う反面、
一台のサーバにあんなに重厚な仕組みはいらないよなーと思ってたところに <a href="http://www.docker.io/">docker</a> ですよ。</p>

<p><a href="http://d.hatena.ne.jp/naoya/20130620/1371729625">概要</a> とか <a href="http://apatheia.info/blog/2013/06/17/docker/">使い方</a> とかはすでに他のえらい人たちが紹介してるので、
使ってて気づいた便利な使い方を紹介ですよ。</p>

<h2>Remote API を使う</h2>

<p>いままで Remote API を http で公開してたので、
簡単にリモートから docker の API を叩けたのですが最新の Docker ですとデフォルトが Unix ソケットを利用するように変更されてしまっているので起動時にわざわざ http でも API を公開するよと指定しなくちゃならない。</p>

<p>bind するホストやポートやソケットは複数設定することができるので、
デフォルトのソケットも bind しつつ、http でも API を公開したい場合は以下のようになる。</p>

<pre><code># docker -d -H="tcp://0.0.0.0:4243" -api-enable-cors -H unix:///var/run/docker.sock
</code></pre>

<h2>コンテナを再起同時にも自動で起動</h2>

<p>ホスト(docker)を再起動した時にコンテナも自動で再起動してほしいなあ、
と思っていたら、<code>-r</code> オプションで解決だった。</p>

<pre><code># docker -d -r
</code></pre>

<h2>docker の GUI が欲しい</h2>

<p>そのものがあった。<a href="https://github.com/crosbymichael/dockerui">crosbymichael/dockerui -- A web interface for docker.</a></p>

<p>docker のイメージも公開されているので <code>pull</code> して <code>run</code> してやればすぐ使える。</p>

<pre><code># docker pull crosbymichael/dockerui
# docker run -d crosbymichael/dockerui /dockerui -e="http://192.168.1.9:4243" -p 9000:9000
</code></pre>

<p><code>-e</code> のオプションで docker を起動しているホストのアドレスを指定してやる。</p>

<h2>Port が起動するたびに変わってウザい</h2>

<p><code>-p</code> のオプションでホスト側とコンテナ側のポートを同時に指定できるようになってた。</p>

<pre><code># docker run -d yuanying/mysql -p 3306:3306
</code></pre>

<p>これで毎回サーバを再起動するたびに mysql のポートが変更してしまうとかいうアホな事態を避けられる。</p>

<h2>Ruby on docker</h2>

<p>Dockerfile はこんな感じになった。</p>

<pre><code># Ruby
#
# VERSION               0.0.1

FROM      ubuntu:precise

# make sure the package repository is up to date
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" &gt; /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison nodejs subversion
RUN curl ftp://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p247.tar.gz | tar zxvf -
RUN cd ruby-2.0.0-p247 &amp;&amp; ./configure &amp;&amp; make &amp;&amp; make install &amp;&amp; gem install --no-ri --no-rdoc bundler
</code></pre>

<h2>docker on Upstart</h2>

<p>以下のような設定ファイルになった。</p>

<pre><code>root@precise64:/home/vagrant# more /etc/init/docker.conf
description     "Run dockerd"

start on runlevel [2345]
stop on runlevel [!2345]

respawn

script
    /usr/local/bin/docker -d -H="tcp://0.0.0.0:4243" -api-enable-cors -H="unix:///var/run/docker.sock" -r
end script
</code></pre>

    ]]></content:encoded>
    <dc:subject>Linux</dc:subject>
    <dc:subject>Program/技術</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2013-08-22T17:59:43+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2013/08/05/my-server-with-nuc">
    <title>Intel NUC で自宅サーバ</title>
    <link>http://www.fraction.jp/log/archives/2013/08/05/my-server-with-nuc</link>
    <description>HW久しぶりにサーバを Mac から Linux にしたくなってきたと思ったら、買ってた。Intel Next Unit Computing とやらを。CPU がオンボードなベアボーンであるため、メモリと SSD を購入。あと必要なのは、テレビにつなげるための HDMI ケーブル、電源をつなぐためのミッキータイプなるアダプターケーブル。16GB メモリを装着したところ。ノート用のメモリの大きさと、マザーボードの大きさのスケール感がどうしてもおかしい。SSD なんかもこの大きさで 256GB。Air...</description>
    <content:encoded><![CDATA[
        <h2>HW</h2>

<p>
<img  src='/log/2013/08/1065574_563321897052400_905074532_o.jpg'
      width='600' 
      height='450' 
      alt=''  />
</p>


<p>久しぶりにサーバを Mac から Linux にしたくなってきたと思ったら、
買ってた。Intel Next Unit Computing とやらを。</p>

<iframe src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=bonnohfract00-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B0093LINVK" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>


<iframe src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=bonnohfract00-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B008AM2K44" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>


<iframe src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=bonnohfract00-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B009URHVPQ" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>


<iframe src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=bonnohfract00-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B003EIK4LK" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>


<iframe src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=bonnohfract00-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=ss_til&amp;asins=B003L1ZYYM" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>




<p>
<img  src='/log/2013/08/1057095_563321863719070_1264486402_o.jpg'
      width='600' 
      height='450' 
      alt=''  />
</p>


<p>CPU がオンボードなベアボーンであるため、メモリと SSD を購入。
あと必要なのは、テレビにつなげるための HDMI ケーブル、
電源をつなぐためのミッキータイプなるアダプターケーブル。</p>

<p>
<img  src='/log/2013/08/1058053_563321860385737_706825992_o.jpg'
      width='600' 
      height='450' 
      alt=''  />
</p>


<p>16GB メモリを装着したところ。
ノート用のメモリの大きさと、マザーボードの大きさのスケール感がどうしてもおかしい。</p>

<p>
<img  src='/log/2013/08/1062769_563321830385740_1795810243_o.jpg'
      width='600' 
      height='450' 
      alt=''  />
</p>


<p>SSD なんかもこの大きさで 256GB。</p>

<p>
<img  src='/log/2013/08/1062990_563321817052408_915359437_o.jpg'
      width='600' 
      height='450' 
      alt=''  />
</p>


<p>AirMac よりも遥かに小さい自宅サーバが完成。
家で一番小さいマシンのくせに一番スペックが高い。頭おかしい。</p>

<h2>SW</h2>

<p>インストールしたのは Ubuntu Linux 12.04。
これに <a href="http://www.docker.io">docker</a> とリバースプロキシ入れてアプリケーションを運用予定。</p>

    ]]></content:encoded>
    <dc:subject>Linux</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2013-08-05T13:06:05+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2013/04/28/1vm-cloudfoundry-by-nise-bosh">
    <title>Nise-BOSH で 1VM Cloud Foundry の構築</title>
    <link>http://www.fraction.jp/log/archives/2013/04/28/1vm-cloudfoundry-by-nise-bosh</link>
    <description>CloudFoundry という PaaS 環境を自分で作れるオープンソースがあるのだが、いかんせんそれを構築しようとすると、IaaS が必要だったり、古いバージョンしかインストールできなかったりと気軽に最新バージョンを試すための環境を作るのがめんどくさい。ところがつい最近、Nise-BOSH という、気軽に Cloud Foundry のコンポーネントのインストールを試すことができるツールが出てきたので、それを使って 1VM 上に Cloud Foundry の必須コンポーネントを全部インストー...</description>
    <content:encoded><![CDATA[
        

<p>
<img  src='/log/2013/04/1vm-cf.png'
      width='522' 
      height='440' 
      alt=''  />
</p>


<p><a href="http://cloudfoundry.com">CloudFoundry</a> という PaaS 環境を自分で作れるオープンソースがあるのだが、
いかんせんそれを構築しようとすると、IaaS が必要だったり、
古いバージョンしかインストールできなかったりと気軽に最新バージョンを試すための環境を作るのがめんどくさい。</p>

<p>ところがつい最近、<a href="https://github.com/nttlabs/nise_bosh">Nise-BOSH</a> という、
気軽に Cloud Foundry のコンポーネントのインストールを試すことができるツールが出てきたので、
それを使って 1VM 上に Cloud Foundry の必須コンポーネントを全部インストールしてやって、
実際に動作する Cloud Foundry を 1VM で構築してみた。</p>

<h2>環境</h2>

<p>試した環境は、MacBook Air 11-inch, Late 2010 @ 4GB 上に Vagrant で構築した、
こんな構成。</p>

<ul>
<li>OS: Ubuntu 10.04 LTS (Lucid Lynx) 64 bit

<ul>
<li>http://files.vagrantup.com/lucid64.box</li>
</ul>
</li>
<li>Memory: 2048 MB</li>
<li>IP Address: 192.168.33.10</li>
<li>HDD: 10GB</li>
<li>Ruby: ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-linux]</li>
</ul>


<h2>インストールするコンポーネント</h2>

<p>本当は、以下を説明する前に BOSH とはなんぞやとかそのような説明をするのが筋と言うものだと思うが、
面倒なので割愛する。slideshare に <a href="http://www.slideshare.net/i_yudai/bosh-13404516">すごいBOSHたのしく学ぼう</a>
という資料があがってるのでそれですべてを理解してもらいたい。</p>

<p>理解したなら、Cloud Foundry には <a href="https://github.com/cloudfoundry/cf-release">cf-release</a> という BOSH 用のレシピが公開されていて、
そのレシピ中の以下の <code>Job Template</code> をインストールすれば、
Cloud Foundry が構築されるということを把握できているはずであろう。</p>

<ul>
<li>potgres</li>
<li>vcap_redis</li>
<li>nats</li>
<li>uaa</li>
<li>cloud_controller_ng</li>
<li>serialization_data_server</li>
<li>dea_next</li>
<li>gorouter</li>
<li>health_manager_next</li>
</ul>


<p>以降の操作はすべて Vagrant で起動した VM 上で root でおこなう。
だって頻繁に root 権限が必要になって面倒なのですもの。</p>

<h2>Nise-BOSH のインストール</h2>

<p>本来ならば、本物の <code>BOSH</code> を利用して <code>cf-release</code> をインストールするのが手順なのだが、
そのためには aws やら OpenStack などが必要になってくるので、
自分の PC 上に Cloud Foundry をインストールするために OpenStack をインストールするだとかよくわからない行動をとることになってしまいがち。</p>

<p>そこで <code>Nise-BOSH</code> ですよ。</p>

<pre><code>apt-get install debootstrap runit
cd /vcap
git clone https://github.com/nttlabs/nise_bosh.git
cd ./nise_bosh
git remote add yuanying https://github.com/yuanying/nise_bosh.git
git fetch yuanying
git checkout -b multi-monitrc-spike yuanying/multi-monitrc-spike
bundle install
./bin/init
reboot
</code></pre>

<p>以上で <code>Nise-BOSH</code> のインストールが完了。vap ユーザの作成や必須パッケージがインストールされて、
Cloud Foundry がインストールされる準備が整う。</p>

<p>ちなみに、本家の <code>Nise-BOSH</code> を利用しても良いのだが、
今のところ本家では複数の <code>Job Template</code> を 1VM にインストールすることを想定していないので、
複数 <code>Job Template</code> のインストールに対応しているブランチを利用することにした。</p>

<h2>Cloud Foundry のインストール</h2>

<h3>リリースの作成</h3>

<p>Cloud Foundry のインストールの前に、<code>cf-release</code> というリリースのソースから、
リリースを作成する必要がある。</p>

<p><code>cf-release</code> は本家のものを使いたいところだが、1VM で動くことを考えていないのかわからないが、
そのまま使うとうまくインストールできないため、
これまたワタクシ作成のパッチを適用してあげたものを利用する。</p>

<pre><code>cd /vcap
git clone https://github.com/cloudfoundry/cf-release.git
cd ./cf-release
git remote add yuanying https://github.com/yuanying/cf-release.git
git pull yuanying master
./update
gem install bosh_cli
bosh create release --force
</code></pre>

<p>リリースをダウンロードした後に、<code>bosh create release</code> でリリースを作成した。</p>

<h3>インストール</h3>

<p><code>BOSH</code> はシステムの構築のために、リリースと、<code>Deployment Manifest</code> という、
そのシステムをどういう構成で構築するのかの情報を記述したファイルを必要とする。</p>

<p>今回はとりあえず 1VM で動くための <code>Deployment Manifest</code> を用意したのでそれを利用する。
ドメインは自分の利用したいドメインに修正すること。<a href="http://xip.io">xip.io</a> を使うと便利かもしれない。</p>

<ul>
<li><a href="https://gist.github.com/yuanying/2b41f8bd3819de0bd520">Deployment manifest for 1VM Cloud Foundry.</a></li>
</ul>


<p>ダウンロードした <code>Deployment Manifest</code> を、
micro-ng.yml という名前で保存した後に、nise_bosh コマンドで
Cloud Foundry の各コンポーネントをインストールする。</p>

<pre><code>cd /vcap/nise_bosh
yes | bundle exec ./bin/nise-bosh /vcap/cf-release /vcap/micro_ng.yml -n 127.0.0.1 postgres
yes | bundle exec ./bin/nise-bosh /vcap/cf-release /vcap/micro_ng.yml -n 127.0.0.1 nats
yes | bundle exec ./bin/nise-bosh /vcap/cf-release /vcap/micro_ng.yml -n 127.0.0.1 gorouter
yes | bundle exec ./bin/nise-bosh /vcap/cf-release /vcap/micro_ng.yml -n 127.0.0.1 dea_next
yes | bundle exec ./bin/nise-bosh /vcap/cf-release /vcap/micro_ng.yml -n 127.0.0.1 health_manager_next
yes | bundle exec ./bin/nise-bosh /vcap/cf-release /vcap/micro_ng.yml -n 127.0.0.1 cloud_controller_ng
yes | bundle exec ./bin/nise-bosh /vcap/cf-release /vcap/micro_ng.yml -n 127.0.0.1 serialization_data_server
yes | bundle exec ./bin/nise-bosh /vcap/cf-release /vcap/micro_ng.yml -n 127.0.0.1 uaa
yes | bundle exec ./bin/nise-bosh /vcap/cf-release /vcap/micro_ng.yml -n 127.0.0.1 vcap_redis
</code></pre>

<h2>使ってみる</h2>

<p>インストールした Cloud Foundry を、以下のコマンドで実行する。</p>

<pre><code>cd /vcap/nise_bosh

mkdir -p /var/vcap/shared
chown vcap:vcap /var/vcap/shared
mkdir -p /var/vcap/store

./bin/run-job start postgres
./bin/run-job start nats
./bin/run-job start gorouter
./bin/run-job start dea_next
./bin/run-job start health_manager_next
./bin/run-job start cloud_controller_ng
./bin/run-job start serialization_data_server
./bin/run-job start uaa
./bin/run-job start vcap_redis
</code></pre>

<p>メールアドレス micro@vcamp.me、パスワード micro というアカウントができているので、
適当なクライアントで試せます。起動して安定するまで時間がかかるので、コーヒーを一杯飲んでから試すのが良いかもしれない。</p>

<pre><code>cf target http://api.192.168.33.10.xip.io
cf login micro@vcap.me
</code></pre>

    ]]></content:encoded>
    <dc:subject>Linux</dc:subject>
    <dc:subject>Program/技術</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2013-04-28T10:40:54+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2010/04/08/Ruby__CAS_">
    <title>Ruby で CAS サーバを試す</title>
    <link>http://www.fraction.jp/log/archives/2010/04/08/Ruby__CAS_</link>
    <description>仕組みはよくわからないのだけれども、適当に作った自鯖上ウェブアプリケーション間でシングルサインオンをしたくなったので、調べてみたら Ruby でサーバが建てられるみたいなので CAS とかいう仕組みを使うことにした。んで、利用したのが、rubycas-serverソースコードは github で公開されている。特徴オープンソース。Ruby で実装されている。クライアントは何でも良い。Rails のプラグインとして利用可能。Rack インタフェースを持つ。Passenger で運用可能。とりあえず試...</description>
    <content:encoded><![CDATA[
        <p>仕組みはよくわからないのだけれども、
適当に作った自鯖上ウェブアプリケーション間でシングルサインオンをしたくなったので、
調べてみたら Ruby でサーバが建てられるみたいなので <a href="http://www.emit-japan.com/doku.php/cas">CAS</a> とかいう仕組みを使うことにした。</p>

<p>んで、利用したのが、</p>

<ul>
<li><a href="http://code.google.com/p/rubycas-server/">rubycas-server</a></li>
</ul>


<p>ソースコードは <a href="http://github.com/gunark/rubycas-server">github で公開されている</a>。</p>

<h2>特徴</h2>

<ul>
<li>オープンソース。</li>
<li>Ruby で実装されている。</li>
<li>クライアントは何でも良い。

<ul>
<li>Rails のプラグインとして利用可能。</li>
</ul>
</li>
<li>Rack インタフェースを持つ。

<ul>
<li>Passenger で運用可能。</li>
</ul>
</li>
</ul>


<p>とりあえず試す。</p>

<h2>インストール</h2>

<p>gem からインストールする。</p>

<pre><code>$ sudo gem install gunark-rubycas-server      
Password:

For more information on RubyCAS-Server, see http://code.google.com/p/rubycas-server

If you plan on using RubyCAS-Server with languages other than English, please cd into the
RubyCAS-Server installation directory (where the gem is installed) and type `rake mo` to
build the LOCALE_LC files.

Successfully installed builder-2.1.2
Successfully installed markaby-0.5
Successfully installed picnic-0.8.1.20100201
Successfully installed gunark-rubycas-server-0.8.0.20090812
4 gems installed
</code></pre>

<h2>設定</h2>

<p>とりあえず一回起動すると <code>/etc/rubycas-server/config.yml</code>
というファイルが生成されるので、それをいじる。</p>

<pre><code>$ sudo rubycas-server
$ sudo vim /etc/rubycas-server/config.yml
</code></pre>

<p>とりあえず動かすだけなので、行う設定は、</p>

<ol>
<li>ssl_cert の作成。</li>
<li>データベースの設定。</li>
<li>認証方法の設定。</li>
</ol>


<h3>ssl_cert の作成</h3>

<p>rake のタスクに、</p>

<ul>
<li>generate_key</li>
<li>generate_ssl_certificate</li>
</ul>


<p>というのがあるので、それを使っても良かったのだけれども、
テストに使うだけなら rubycas-server のプロジェクトページから、
<a href="http://rubycas-server.googlecode.com/files/rubycas-server-demo.pem">テスト用の pem</a> ファイルをダウンロードしてそれを使っても良いようだ。</p>

<p>ダウンロードしてきた pem ファイルを適当な場所に保存。今回は /etc/rubycas-server/ssl.pem として保存した。</p>

<p>設定ファイルをいじって保存した pem ファイルを使うように変更する。</p>

<pre><code>$ sudo vim /etc/rubycas-server/config.yml
$ diff -u config.old.yml config.yml 
--- config.example.yml  2010-04-07 17:10:24.000000000 +0900
+++ config.yml  2010-04-08 10:45:12.000000000 +0900
@@ -30,7 +30,7 @@

 server: webrick
 port: 443
-ssl_cert: /path/to/your/ssl.pem
+ssl_cert: /etc/rubycas-server/ssl.pem

 # If your private key is in a separate file from the cert
</code></pre>

<h3>データベースの設定。</h3>

<p>設定ファイルを見ると、mysql の casserver というデータベースを利用してるようなので、
作ってやる。</p>

<pre><code>$ mysql5 -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 32
Server version: 5.1.45 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql&gt; create database casserver default character set utf8;
Query OK, 1 row affected (0.65 sec)
</code></pre>

<h3>認証方法の設定</h3>

<p>rubycas-server がどうやって username/password を使って認証を行うのか設定をしてやる。</p>

<p>いくつか認証方法があって、</p>

<ol>
<li>データベースを作って、そこに username/password を保存する方法。</li>
<li>ActiveDirectory を使う方法。</li>
<li>LDAP を使う方法。</li>
<li>Google のアカウントを使う方法。</li>
<li>カスタムな認証方法。</li>
</ol>


<p>Google のアカウントを使う方法が設定も簡単で面白そうなので、試してみることにした。</p>

<pre><code>$ sudo vim /etc/rubycas-server/config.yml
$ diff -u config.old.yml config.yml 
--- config.example.yml  2010-04-07 17:10:24.000000000 +0900
+++ config.yml  2010-04-08 10:45:12.000000000 +0900
@@ -262,8 +262,8 @@
 # would use to log in to Google services like Gmail). This authenticator
 # requires no special configuration -- just specify its class name:
 #
-#authenticator:
-#  class: CASServer::Authenticators::Google
+authenticator:
+ class: CASServer::Authenticators::Google
 #
 # Note that as with all authenticators, it is possible to use the Google 
 # authenticator alongside other authenticators. For example, CAS can first
</code></pre>

<h2>起動</h2>

<p>これらの設定が終わったら、再度 rubycas-server を起動してみる。</p>

<pre><code>$ sudo rubycas-server
</code></pre>

<p>認証サーバに<a href="https://localhost/">ブラウザで接続</a>してみる。</p>

<p><img src="/log/2010/04/rubycas-login.jpg" width="366" height="309" alt="rubycas-login.jpg" /></p>

<p>できたできた。</p>

<p>つぎは passenger で動かしてみたい。</p>

    ]]></content:encoded>
    <dc:subject>Apple</dc:subject>
    <dc:subject>Linux</dc:subject>
    <dc:subject>Program/Ruby</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2010-04-08T07:36:48+09:00</dc:date>
  </item>
</rdf:RDF>
