Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

【第11回 クラウドごった煮(コンテナ勉強会)】Docker networking tools

6,057 views

Published on

第11回 クラウドごった煮(コンテナ勉強会)でプレゼンした資料です

Published in: Technology

【第11回 クラウドごった煮(コンテナ勉強会)】Docker networking tools

  1. 1. Docker Networking tools 2015年3月28日 TIS株式会社 松井 暢之 第11回 クラウドごった煮(コンテナ勉強会)
  2. 2. 2 松井 暢之(まつい のぶゆき) TIS株式会社 戦略技術センター ~2003 2003~2008 2009 2010~2012 2013~ 現場PJでアーキテクト兼モデラー兼プログラマ兼…を歴任 基盤技術センター(現戦略技術センター)で不芳PJの火消しに奔走 全社生産性向上の企画策定に従事 オープンでエッジな技術を活用した事業企画に従事 Cloud Orchestrator “CloudConductor®” の企画開発とOSS化開始 http://cloudconductor.org nbyk.matsui nmatsui nbyk.matsui@n_matsui
  3. 3. Agenda 1. Dockerのネットワークは困りもの 2. 様々なDockerネットワーキングツール 3. coreos/flannel と zettio/weave をもう少し 4. OpenVNetを用いてDockerネットワーキングツールを作ろう 3
  4. 4. eth0 docker0 (現時点の)Dockerネットワーク 1. Dockerを起動 i. docker0という仮想ブリッジを作成 ii. docker0から外部に接続できるように、iptablesにルールを追加 2. Dockerコンテナ立ち上げ i. vethペアをコンテナのNW namespaceとdocker0に接続 ii. 指定されていれば、ポート変換ルールをiptablesに追加 4 veth コンテナ1 veth veth コンテナ2 veth veth ペア iptablesでIPマスカレード(とポート変換)
  5. 5. (現時点の)Dockerネットワークの面倒なところ  コンテナに与えられるIPアドレスを制御できない  docker0に与えるIPアドレスは指定できるが、コンテナのIPアド レスはdocker0が所属するアドレス空間から昇順で自動採番  コンテナを再作成した際に、以前のIPアドレスを再利用すること はできない  ホストOSの外部からコンテナにアクセスするのが面倒  コンテナに与えられたIPアドレスは、ホストOSの外部からは アクセスできない  コンテナ内のデーモンにアクセスするためには、ホストOSへ ポートフォワードしておく必要がある 5
  6. 6. (現時点の)Dockerネットワークはマルチホストでは不十分  Dockerが提供するネットワークは、単一ホストに閉じた状況で 利用するものと考えるべき  複数ホストで稼働するDockerコンテナを接続するためにAmbassador Patternという方法が提案されているが、コンテナ間の接続はできても ホストOS外部からの接続は楽にならない  http://docs.docker.com/articles/ambassador_pattern_linking/ 6 eth0 docker0 veth コンテナ1 veth veth Ambassador veth eth0 docker0 veth Ambassador veth veth コンテナ2 veth docker linkdocker link unicast
  7. 7. Agenda 1. Dockerのネットワークは困りもの 2. 様々なDockerネットワーキングツール 3. coreos/flannel と zettio/weave をもう少し 4. OpenVNetを用いてDockerネットワーキングツールを作ろう 7
  8. 8. Dockerのネットワークをもっと楽にするために  Dockerネットワーキングツールに求められるコト ① L2もしくはL3で接続された複数ホストを接続できる ② 任意のアドレス空間を指定した仮想ネットワークを作成できる ③ 仮想NW内の任意のアドレスでコンテナを立ち上げられる ④ コンテナに与えられた仮想IPアドレスで、コンテナ間だけでは なくコンテナ外部からの接続もできる ⑤ DNSやDHCP、あるいはセキュリティグループ等の高度なネット ワーク機能を実現できる 等々 8
  9. 9. 様々なDockerネットワーキングツール  coreos/flannel https://github.com/coreos/flannel  Kubernetesと共に利用される(ことが多い)  etcdに依存しており、インストールと設定は少し面倒  dockerコマンドはそのまま利用可能  zettio/weave https://github.com/zettio/weave  Dockerネットワーキング専用のツール  インストールが簡単  dockerコマンドをラップするweaveコマンドを用いることで コンテナに仮想ネットワークを滑り込ませる 9
  10. 10. 様々なDockerネットワーキングツール  socketplane https://github.com/socketplane/socketplane  Docker社に買収された(ので、そのうちdockerに取りこまれるかも?)  Open vSwitchとconsulを活用しており、インストールも簡単  consulのmulticastDNSを用いて、L2内ならばクラスタを自動構築  multicastが通らない場合自力でクラスタにjoinすることも可能  なのだが、試したところ仮想ネットワークが上手く動作しない…  Docker swarm https://github.com/docker/swarm  Docker社謹製のDockerホストのクラスタリングツール  Manager Nodeにdockerコマンドで指示をだせば、イイカンジに クラスタ内でコンテナを分散してくれる 10
  11. 11. 様々なDockerネットワーキングツール  jpetazzo/pipework https://github.com/jpetazzo/pipework  仮想ブリッジを作成し、任意のIPアドレスをコンテナに割当 (単一ホストでの利用を想定)  etcdを用いて複数ホストでpipeworkを協調動作させるツール (helander/docknet)もあったが、メンテナンスされていない  rancherio/rancher https://github.com/rancherio/rancher  ネットワーキングだけでなく、ストレージなども含めDocker全体 を管理するプラットフォームを目指している(らしい)  RancherOSというDockerコンテナ用のDistributionも出している  等々 11
  12. 12. Agenda 1. Dockerのネットワークは困りもの 2. 様々なDockerネットワーキングツール 3. coreos/flannel と zettio/weave をもう少し 4. OpenVNetを用いてDockerネットワーキングツールを作ろう 12
  13. 13. coreos/flannel  仮想ネットワークとして192.168.0.0/16を指定した場合の例  CentOS 7 / docker 1.3.2 / etcd 2.0.4 / flannel 0.3.0 13 eth0 docker0 veth コンテナ11 veth veth eth0 docker0 veth veth コンテナ22 veth コンテナ12 veth コンテナ21 veth flannel0 flannel0 flanneld flanneld コンテナからの パケットをカプセル化 10.0.0.0/24 10.1.0.0/24 .10 .10 192.168.95.0/16 192.168.82.0/16 192.168.95.1/24 192.168.82.1/24 .95.2 .95.3 .82.2 .82.3 仮想ネットワーク 192.168.0.0/16 etcd etcd仮想ネットワークの 設定情報を共有 UDP unicast
  14. 14. coreos/flannel 1. 各ホストにetcdとflannelをインストールする 2. dockerコンテナを起動するホスト全てでetcdを起動する 3. 仮想ネットワークの設定をetcdに投入する 4. flannelのデーモンを起動すると仮想ブリッジのflannel0が作成され、 静的routeが設定される 5. flannelが生成した仮想ネットワーク定義(/run/flannel/subnet.env) を読み込んでdockerを再起動し、docker0のIPアドレスを再設定 6. dockerコマンドを用いてdockerコンテナを起動する 14 # /usr/local/bin/etcd -name flannel1 -initial-advertise-peer-urls http://10.0.0.10:2380 -listen-peer-urls http://10.0.0.10:2380 -initial-cluster-token flannel-cluster01 -initial-cluster flannel1=http://10.0.0.10:2380,flannel2=http://10.1.0.10:2380 -initial-cluster-state new > /tmp/etcd.log 2>&1 & # /usr/local/bin/etcdctl set /coreos.com/network/config '{"Network":"192.168.0.0/16"}' # /usr/local/bin/flanneld -iface=eth0 > /tmp/flanneld.log 2>&1 &
  15. 15. coreos/flannel 15 ポイント coreos/flannelでは ① L2 and/or L3で接続された 複数ホストの接続 ○ L2で接続されたホスト間、L3で接続さ れたホスト間を接続し、通信可能 (flanneldが外部NWにトンネル作成) ② 任意のアドレス空間を指定して 仮想ネットワークの作成 ○ etcdに仮想ネットワーク全体のアドレス 空間を設定できる ③ 任意のアドレスを指定して コンテナを起動 × 各ホストには指定したアドレス空間内の サブネットが作成されるが、アドレス帯 を指定することはできない ④ コンテナ間だけでなくコンテナ 外部からも接続可能 ○ 各ホストに静的routeが追加され、他の ホスト上で動作しているコンテナへも 接続できる ⑤ DNSやDHCP、セキュリティグ ループ等の高度なネットワーク 機能の実現 × 高度なネットワーク機能は無い
  16. 16. zettio/weave  仮想ネットワークとして192.168.99.0/24を指定した場合の例  CentOS 7 / docker 1.3.2 / weave 0.9.0 16 10.0.0.0/24 10.1.0.0/24 .10 .10 仮想ネットワーク eth0 docker0 コンテナ12 vethveth コンテナ11 vethveth Weaveコンテナ vethvethveth vethveth weaver weave vethvethveth .2192.168.99.0/24 .1 .0.9.0.8 eth0 docker0 コンテナ21 veth veth コンテナ22 veth veth Weaveコンテナ veth veth veth veth veth weaver weave veth veth veth .4.3 .0.9.0.8 172.17.42.1/16 172.17.42.1/16 コンテナからの パケットをカプセル化 UDP unicast
  17. 17. zettio/weave 1. 各ホストにweaveをインストールする 2. 最初のホストでweaveを起動する 3. 残りのホストでは、最初のホストを指定してweaveを起動する (weaveクラスタが生成されれば、最初のノードが落ちてもweaveは動作し続ける) 4. weave runコマンドを用いてdockerコンテナを起動する 5. weave exposeコマンドを用いてコンテナへの静的routeを設定する 17 # wget -O /usr/local/bin/weave https://github.com/zettio/weave/releases/download/latest_release/weave # chmod a+x /usr/local/bin/weave # weave launch # weave launch 10.0.0.10 # weave run 192.168.99.1/24 --expose 80 –p 80 -d -i –t testimage:apache # weave expose 192.168.99.1/24
  18. 18. zettio/weave 18 ポイント coreos/flannelでは ① L2 and/or L3で接続された 複数ホストの接続 ○ L2で接続されたホスト間、L3で接続さ れたホスト間を接続し、通信可能 (weaverが外部NWにトンネル作成) ② 任意のアドレス空間を指定して 仮想ネットワークの作成 ○ コンテナ起動時に指定したCIDRで仮想 ネットワークが生成される ③ 任意のアドレスを指定して コンテナを起動 ○ コンテナ起動時にCIDRを指定する ④ コンテナ間だけでなくコンテナ 外部からも接続可能 ○ 各ホストでweave exposeすれば静的 routeが追加される ⑤ DNSやDHCP、セキュリティグ ループ等の高度なネットワーク 機能の実現 △ weaveクラスタ内での内部DNS機能が 提供されている
  19. 19. Agenda 1. Dockerのネットワークは困りもの 2. 様々なDockerネットワーキングツール 3. coreos/flannel と zettio/weave をもう少し 4. OpenVNetを用いてDockerネットワーキングツールを作ろう 19
  20. 20. Dockerネットワーキングツールを作ろう  DockerコンテナのネットワークはNetwork Namespaceで分離され ているだけ  ホストOSからコンテナへvethの片割れを簡単に追加できる  ホストOSからコンテナの静的routeも制御できる  仮想ネットワークオーバーレイツールとNetwork Namespaceを 組み合わせて、Dockerネットワーキングツールを作ってみよう  OSSの仮想ネットワークオーバーレイツール  ミドクラ: MidoNet https://github.com/midonet/midonet  あくしゅ: OpenVNet https://github.com/axsh/openvnet  OpenContrail http://www.opencontrail.org/  等 20
  21. 21. OpenVNetとは  あくしゅ社が開発しているOSSの仮想ネットワークツール  L2/L3のネットワーク上に任意の仮想L2/L3ネットワークを オンデマンドにオーバーレイ  既存の物理ネットワークを仮想ネットワークへ延伸  DHCPやセキュリティグループ等の高度なNFVも提供 21 今回の検証では 2.3.0を使っています
  22. 22. OpenVNetとは  あくしゅ社が開発しているOSSの仮想ネットワークツール 22  vna (Virtual Network Agent) – Open vSwitchの設定を変更 – OpenFlow 1.3 コントローラ(Trema-edge)を内蔵  vnmgr (Virtual Network Manager) – 全体のネットワーク構成を把握しvnaへ指令 – フロー制御ルールの永続化サービスを提供  vnapi (Virtual Network API) – Web APIのエンドポイントを提供 – 外部からvnmgrへ指示を引き渡す連携窓口  vnctl (Virtual Network Controller) – コマンドラインインターフェイスを提供 – vnapiと対話 エージェント その他 コンポーネント
  23. 23. デモの環境  SoftLayerのあるDCに2台の仮想サーバ + 別のDCに1台の仮想サーバ  最小構成(1Core 1GB RAM)のPublic Cloud Instance  OSはCentOS 6.6  OpenVNetが公式サポートするOSがRHEL 6.4のため  VLAN Spanningを設定し、別DCのVLANとの通信を許可 23 Public Primary Subnet Private Primary Subnet DC A DC B
  24. 24. OpenVNetによるDockerネットワーキング  Dockerコンテナ間にOpenVNetで仮想ネットワークをオーバーレイ 24 eth0 br0 eth1 vna OVS eth0 br0 eth1 vna OVS eth0 br0 eth1 vna OVS vnmgr vnapi vnctl A.B.C.D/29 .X .Y E.F.G.H/29 .Z 10.b.c.d/26 10.f.g.h/26 .x .y .z mysql redis manager agent01 agent02 veth11b コンテナ11 veth11c veth12b コンテナ12 veth12c veth13b コンテナ13 veth13c veth21b コンテナ21 veth21c veth22b コンテナ22 veth22c veth23b コンテナ23 veth23c veth31b コンテナ31 veth31c veth32b コンテナ32 veth32c veth33b コンテナ33 veth33c GREトンネル GREトンネル フローテーブル フローテーブル フローテーブル DC A DC B
  25. 25. OpenVNetによるDockerネットワーキング  仮想ネットワークの論理的な状態 25 コンテナ11 veth11c コンテナ12 veth12c コンテナ13 veth13c コンテナ21 veth21c コンテナ22 veth22c コンテナ23 veth23c コンテナ31 veth31c コンテナ32 veth32c コンテナ33 veth33c 10.b.c.d/26 10.f.g.h/26 仮想ルータ .x .y OpenVNetの現在の仕様上、 物理・仮想間のルーティングは 自ホスト上のコンテナのみ許可 DC A .z manager agent01 agent02 DC B 192.168.99.0/24 .α .β .1 .11 .12 .13 .21 .22 .23 .31 .32 .33 Security Group 1 ・ICMPを許可 ・SSHを許可 ・SG内は全て許可 ・それ以外は拒否 Security Group 2 ・ICMPを許可 ・SG1からのSSHは許 可 ・SG内は全て許可 ・それ以外は拒否 Security Group 3 ・ICMPを許可 ・SG内は全て許可 ・それ以外は拒否 オーバーレイされた仮想ネットワーク
  26. 26. デモ 1. managerから自身上にあるコンテナへの疎通確認  OpenVNetの現在の仕様上、他サーバ上のコンテナへの経路は 仮想ルータでDROPされてしまいます 2. 仮想ネットワーク上の疎通とセキュリティグループの確認 1. managerからコンテナ11へはSSHできるが、コンテナ12や コンテナ13へはSSHできない 2. コンテナ11からコンテナ21やコンテナ31へはSSHできる 3. コンテナ11からコンテナ12へはSSHできるが、コンテナ13へは SSHできない 4. 全てのコンテナにpingは通る 26
  27. 27. Docker + OpenVNet 27 ポイント Docker + OpenVNetでは ① L2 and/or L3で接続された 複数ホストの接続 ○ L2で接続されたホスト間、L3で接続さ れたホスト間を接続し、通信可能 (vnetはL3間だけGREトンネル生成) ② 任意のアドレス空間を指定して 仮想ネットワークの作成 ○ vnetの設定で、仮想ネットワークの アドレス空間を設定できる ③ 任意のアドレスを指定して コンテナを起動 ○ 固定IPを指定してコンテナを起動できる (vnetにDHCPを行わせることも可能) ④ コンテナ間だけでなくコンテナ 外部からも接続可能 △ 現在のvnetの仕様上、自ホスト上のコ ンテナのみ接続可能(他ホスト上のコン テナには接続できない) ⑤ DNSやDHCP、セキュリティグ ループ等の高度なネットワーク 機能の実現 ○ 仮想ネットワーク間のルーティングや DHCP、セキュリティグループが 利用可能 vnet: OpenVNetの略
  28. 28. 最後に  今回のデモ環境を構築するansible playbookを公開しています  tech-sketch/walfisch https://github.com/tech-sketch/walfisch  よろしければ一度試してみてください  Dockerのネットワーキングは面白い技術です。皆さんも遊んでみましょう! 28

×