このエントリはKubernetesアドベントカレンダー2014の7日目です。
昨日のエントリでわかったとおり、 ホストをまたいでコンテナ間接続するためには
1. 各ホストが重複しないアドレス帯をdocker0に割り当てる
2. 起動したコンテナのIPアドレスを知る
3. 各ホスト(もしくは上位ルータ)で、他ホストがどのネットワークアドレス帯をdocker0に割り当てているかを把握しルーティングする
という3つの面倒事があります。
このうち1.と3.を解決するのが flannel です。2.はKubernetesがします。
今日はflannelと、flannelを(だけでなくKubernetesも)動かすために必要なetcdについて見ていきます。
etcd
READMEを適当に訳すと、設定情報共有とサービス検出のための高可用KVSで、Apache Zookeeper、doozerにインスパイアされたもの、ということです。
特徴は以下の4点。
- Simple: curl'able user facing API (HTTP+JSON)
- Secure: optional SSL client cert authentication
- Fast: benchmarked 1000s of writes/s per instance
- Reliable: properly distributed using Raft
HTTP+JSONは嬉しいですね。curlとかの代わりに etcdctl というプログラムを使うこともできます。
Raftというアルゴリズムを使っていい感じに分散してくれます。 詳しく知りたい方はこちらのリンクがオススメ。
goで書かれたプログラムなので、バイナリ1つで起動できます。
起動するとクライアント受け付け用のポート( -addr
, default: 4001)、etcd同士のコミュニケーション用のポート( -peer-addr
, default: 7001)の2種類を待ち受けます。
他のサーバに起動したetcdのコミュニケーション用のポートを指定( -peers
)して、そこと通信することでデータの分散などを実現します。
flannel
flannel (originally rudder) is an overlay network that gives a subnet to each machine for use with Kubernetes.
というわけで、まさにKubernetesのために作られた(?)、ネットワークアドレス帯をいい感じに付与してくれるプロダクトです。
- etcd経由で他ホストと協調して、自ホストのdocker0に割り当てるべきネットワークアドレス帯を決めてくれる
- docker本体を起動するときにその結果を
-bip
で指定します
- docker本体を起動するときにその結果を
- TUN/TAPデバイスになって、各ホストのdocker0同士の通信を仲介してくれる
というありがたい存在です。ありがたい。ありがたい。
flannelはetcdを使うので、まず先にetcdが起動している必要があります。
- etcdを起動
- etcdにflannel用の設定=flannelが配布していいネットワークアドレス帯の指定を投入
- flannelを起動
という段取りです。
flannelは2.で指定されたネットワークアドレス帯の中から/24ずつ切り出して各ホストで利用します。(/24は変更可)
そのホストで利用するネットワークアドレス帯が決まったら /run/flannel/subnet.env
に書きだされるのでそれをdockerの起動オプションに指定します。
source /run/flannel/subnet.env
docker -d --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU}
これだけで、面倒だった調整のほとんどが済んでしまいます。すばらしい!
flannelも(etcdも)CoreOSが開発しています。そしてgoでできています。なのでバイナリひとつおいて起動すればokです。すばらしい!
etcdとflannelとKubernetesがあれば、分散環境が作れそうな気持ちになってきましたか?
とはいえまだ焦らず、明日はまずKubernetesなしで、昨日の環境をetcd+flannelでいい感じにしてみましょう。