Kubernetesの分散環境を支えるetcdとflannel

このエントリはKubernetesアドベントカレンダー2014の7日目です。

昨日のエントリでわかったとおり、 ホストをまたいでコンテナ間接続するためには

1. 各ホストが重複しないアドレス帯をdocker0に割り当てる
2. 起動したコンテナのIPアドレスを知る
3. 各ホスト(もしくは上位ルータ)で、他ホストがどのネットワークアドレス帯をdocker0に割り当てているかを把握しルーティングする

という3つの面倒事があります。

このうち1.と3.を解決するのが flannel です。2.はKubernetesがします。

今日はflannelと、flannelを(だけでなくKubernetesも)動かすために必要なetcdについて見ていきます。

etcd

coreos/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

coreos/flannel

flannel (originally rudder) is an overlay network that gives a subnet to each machine for use with Kubernetes.

というわけで、まさにKubernetesのために作られた(?)、ネットワークアドレス帯をいい感じに付与してくれるプロダクトです。

  • etcd経由で他ホストと協調して、自ホストのdocker0に割り当てるべきネットワークアドレス帯を決めてくれる
    • docker本体を起動するときにその結果を -bip で指定します
  • TUN/TAPデバイスになって、各ホストのdocker0同士の通信を仲介してくれる

というありがたい存在です。ありがたい。ありがたい。

flannelはetcdを使うので、まず先にetcdが起動している必要があります。

  1. etcdを起動
  2. etcdにflannel用の設定=flannelが配布していいネットワークアドレス帯の指定を投入
  3. 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でいい感じにしてみましょう。


See also