【Okinawa Open Days 2016】OpenStack 環境におけるContainer as a Service の提供と課題
by
Masaya Aoyama (@amsy810)
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
OpenStack 環境における Container as a Service の提供と課題 株式会社サイバーエージェント アドテク本部 技術戦略室 Central Infrastructure Agency 青山 真也
Slide 2
Slide 2 text
自己紹介 • 青山 真也 (あおやま まさや) – 2016 年 4 月 サイバーエージェントに新卒入社 – 同 6 月 アドテク本部 技術戦略室 CIA へ配属 • 最近の業務内容 – Container 周り – OpenStack 周り • OpenStack Summit Barcelona 2016 16/12/09 2
Slide 3
Slide 3 text
OpenStack Summit Barcelona 2016 について 参加レポートをまとめています • [OpenStack Summit Barcelona 2016] 新卒がミタ! コンテナ技術編 • [OpenStack Summit Barcelona 2016] 新卒がミタ! 運用改善編 • [OpenStack Summit Barcelona 2016] 新卒がミタ!先輩 OpenStackerと OpenStack コミュニティ編 16/12/09 3 hBp://adtech.cyberagent.io/techblog/
Slide 4
Slide 4 text
目次 • 弊社の現状の環境 • 様々なコンテナ技術と問題点 – Docker, LXC (LXD) – Kubernetes, COE – Magnum, Kuryr, Midonet, Calico, ConPv • 弊社の要件と CaaS の構想 • まとめ 16/12/09 4
Slide 5
Slide 5 text
弊社の現状の環境 OpenStack によるプライベートクラウド(弊社アドテク本部単体) – Over 25000 vCPUs • シビアな性能を求められるのでオーバコミットはしていません – Over 3500 VMs (with KVM) – Over 500 Hosts コンテナ環境は 各テナントが VM 上に Kubernetes などのクラスタを構築 ↓ CaaS 環境の提供が必要 16/12/09 5
Slide 6
Slide 6 text
様々なコンテナ技術 • Docker • LXC (LXD) • FreeBSD Jail • etc. 現状では アプリケーションコンテナ = Docker システムコンテナ = LXC (LXD) 今回対象とするのは Docker – 一部 LXC(LXD) の話を含みます。 16/12/09 6
Slide 7
Slide 7 text
Docker って? • Docker Image をもとにしたアプリケーションコンテナ – アプリケーション + 実行環境 • ポータビリティ性が高い – 手元の開発環境のイメージをリモートのサーバにデプロイ – Docker Hub(イメージ保管 + バージョン管理) • 高速なデプロイ – 数秒で起動 基本的にはスケールさせられるものでの利用が多い …どうやってスケールさせるか? 16/12/09 7
Slide 8
Slide 8 text
Container OrchestraPon Engine (COE) Docker コンテナのオーケストレーションを行う – スケールアウト、スケールイン、リソース管理 – ロードバランシング、ヘルスチェック – 再デプロイ、ローリングアップデート 様々な Container OrchestraPon Engine – Kubernetes – Swarm – Mesos – etc. 今回お話するのは Kubernetes ベース(基本的な出来ることは同じ) 16/12/09 8
Slide 9
Slide 9 text
ちなみに… GCP GKE と AWS ECS • Google Container Engine (GKE) – Google Compute Engine 上に Kubernetes クラスタを構築 • Amazon EC2 Container Service (ECS) – EC2 上に ECS クラスタを構築(独自のオーケストレーションツール) Google も Amazon も同様に COE を使った環境を提供している スケールさせない 1 コンテナの場合も COE に任せればいい 16/12/09 9
Slide 10
Slide 10 text
Kubernetes 仮想ネットワーク 16/12/09 10 External network Container-B Container-A Kubernetes のコンテナクラスタへのアクセス方法は主に2パターン (ReplicaPonController で作成される Pod への Service は主に 2 パターン) Container-B Container-B Container-A Container-A Service Kubernetes cluster Service flannel internal network VXLAN overlay
Slide 11
Slide 11 text
Kubernetes 仮想ネットワーク 16/12/09 11 flannel internal network VXLAN overlay NIC NIC flannel.1 flannel.1 External network docker0 docker0 minion minion Container-B Container-B Container-A Container-A 192.168.1.1 192.168.1.2 Kubernetes のコンテナクラスタへのアクセス方法は主に2パターン (ReplicaPonController で作成される Pod への Service は主に 2 パターン)
Slide 12
Slide 12 text
コンテナクラスタへのアクセス (1) 16/12/09 12 flannel internal network VXLAN overlay NIC NIC flannel.1 flannel.1 External network docker0 docker0 minion minion Container-B Container-B Container-A Container-A flannel Internal network の VIP を利用(ClusterIP) ただし疎通する範囲は Kubenetes のクラスタ内からのみ = 外部公開はできない 10.254.0.y:80 > Container-A:80 への LB 10.254.0.z:80 > Container-B:80 への LB 192.168.1.1 192.168.1.2
Slide 13
Slide 13 text
コンテナクラスタへのアクセス (2) 16/12/09 13 flannel internal network VXLAN overlay NIC NIC flannel.1 flannel.1 External network docker0 docker0 minion minion Container-B Container-B Container-A Container-A External network を利用(ExternalIP, NodePort) ポートフォワーディングする形 = 同じポート番号を使用できない 192.168.1.1 192.168.1.2 192.168.1.1:80 192.168.1.2:80 > Container-A:80 への LB 192.168.1.1:8080 192.168.1.2:8080 > Container-B:80 への LB
Slide 14
Slide 14 text
素の Kubernetes で満たせない要件 ただ Kubernetes 使ったら? じゃ解決しない問題が多い • ネットワーク的な機能要件 1. 外部疎通性がない 2. 任意のポートが利用できない – 但し、コンテナごとに外部疎通性のある IP は必要ない? • 但し、コンテナごとにログイン or シェルが起動できることが望ましい • その他必要そうな機能要件 – 認証 – Quota – セキュリティグループ – Block Device 16/12/09 14 両方解決するには 外部疎通性のある VIP が必要
Slide 15
Slide 15 text
弊社の要件 • 外部疎通性のある VIP が欲しい – ポートは任意のものが使えるように • 積極的に L3 agent を使う理由はまだない • 各コンテナに入りたい – SSH じゃなくても COE のノードにログインできればいい • NW 分離、Security Group、認証、Quota、BlockDevice • COE は自由に選びたい – Kubernetes – Swarm • COE on VM は出来れば避けたい 16/12/09 15
Slide 16
Slide 16 text
有名どころな技術 CaaS の提供方法はいくつか存在 • OpenStack 環境用 – Magnum (Zun) + (Heat + Midonet) • Internal Network の VIP に外部疎通性を持たせる方法 – Kuryr + Midonet – Calico • その他検討した方式 – ConPv – Large Kubernetes Cluster 16/12/09 16
Slide 17
Slide 17 text
OpenStack 環境用コンポーネント 16/12/09 17
Slide 18
Slide 18 text
Magnum (+ Heat + Midonet) Heat と L3 Network を使って COE クラスタを構築 – インスタンスを作って Ansible/Chef で自動構築に近い ※ Heat: AWS CloudFormaPon に近いコンポーネント ※ 以前までコンテナの作成なども Magnum で行っていましたが、 Newton 以降方針が変わり、kubectl や docker swarm などの CLI で操作するか、 Zun を使って操作するようになりました。 16/12/09 18 nova-VM nova-VM nova-VM ・・・ COE クラスタ(k8s, swarm, etc)
Slide 19
Slide 19 text
Internal Network の VIP に 外部疎通性を持たせる方法 16/12/09 19
Slide 20
Slide 20 text
Kubenetes クラスタの変更を検知して Midonet に通達 Midonet + Kuryr 16/12/09 20 NIC NIC Midonet Gateway flannel internal network VXLAN overlay External network BGP Peer (RouPng for FloaPng IP) flannel.1 docker0 Container-B Container-A flannel.1 docker0 Container-B Container-A FloaPngIP を利用可能 BGP Router Kuryr
Slide 21
Slide 21 text
Internal Network の VIP を BGP 伝搬して外部から疎通性を持たせる Calico 16/12/09 21 NIC NIC Kube-proxy flannel internal network VXLAN overlay External network BGP Peer flannel.1 docker0 Container-B Container-A flannel.1 docker0 Container-B Container-A VIP を External NW の BGP Routerに広報 BGP Router
Slide 22
Slide 22 text
その他検討した方式 16/12/09 22
Slide 23
Slide 23 text
ConPv (L2 mode) コンテナの内部 NW を L2 透過で見せる OpenStack 環境では難しい可能性も(未検証) 16/12/09 23 Bridge Container Container Container Bridge Container Container Container AggrigaPon SW
Slide 24
Slide 24 text
Large Kubernetes Cluster Kubernetes で巨大な1つの物理クラスタを構築 – NG: コンテナが集約しすぎた場合に懸念点がある テナント分離は kubernetes の機能を利用する – OK: Quota, 認証 (Keystone 連携) • kubernetes の namespace 機能 – NG: Security Group, Block Storage, NW の分離 • ポートの奪い合いは前段に LB を配置して解決 16/12/09 24 Overlay (flannel + iptables + VXLAN) Container-B Container-A Container-B Container-C Container-C Container-A 192.168.1.1/24 192.168.1.2/24 192.168.1.3/24
Slide 25
Slide 25 text
再掲:コンテナクラスタへのアクセス (2) 16/12/09 25 flannel internal network VXLAN overlay NIC NIC flannel.1 flannel.1 External network docker0 docker0 minion minion Container-B Container-B Container-A Container-A External network を利用(ExternalIP, NodePort) ポートフォワーディングする形 = 同じポート番号を使用できない 192.168.1.1 192.168.1.2 192.168.1.1:80 192.168.1.2:80 > Container-A:80 への LB 192.168.1.1:8080 192.168.1.2:8080 > Container-B:80 への LB
Slide 26
Slide 26 text
ポート衝突の解決 外部疎通性のある VIP を払い出す – 内部のポート 10001 などは CaaS 提供側が管理 16/12/09 26 Overlay (flannel + iptables + VXLAN) Container-B Container-A Container-B Container-C Container-C Container-A 192.168.1.1/24 192.168.1.2/24 192.168.1.3/24 :10001 > Container-A:80 10.0.0.1:80 (VIP) > 192.168.0.1:10001 > 192.168.0.2:10001 > 192.168.0.3:10001
Slide 27
Slide 27 text
ポート衝突の解決 外部疎通性のある VIP を払い出す – 内部のポート 10001 などは CaaS 提供側が管理 – VIP を使っているためポートの衝突は起きない 16/12/09 27 Overlay (flannel + iptables + VXLAN) Container-B Container-A Container-B Container-C Container-C Container-A 192.168.1.1/24 192.168.1.2/24 192.168.1.3/24 :10001 > Container-A:80 :10002 > Container-B:80 10.0.0.1:80 (VIP) > 192.168.0.1:10001 > 192.168.0.2:10001 > 192.168.0.3:10001 10.0.0.2:80 (VIP) > 192.168.0.1:10002 > 192.168.0.2:10002 > 192.168.0.3:10002
Slide 28
Slide 28 text
ポート衝突の解決 外部疎通性のある VIP を払い出す – 内部のポート 10001 などは CaaS 提供側が管理 – VIP を使っているためポートの衝突は起きない 必要に応じて同じ VIP を利用することも可能 16/12/09 28 Overlay (flannel + iptables + VXLAN) Container-B Container-A Container-B Container-C Container-C Container-A 192.168.1.1/24 192.168.1.2/24 192.168.1.3/24 :10001 > Container-A:80 :10002 > Container-B:80 :10003 > Container-C:53 10.0.0.1:80 (VIP) > 192.168.0.1:10001 > 192.168.0.2:10001 > 192.168.0.3:10001 10.0.0.2:80 (VIP) > 192.168.0.1:10002 > 192.168.0.2:10002 > 192.168.0.3:10002 10.0.0.1:53 (VIP) > 192.168.0.1:10003 > 192.168.0.2:10003 > 192.168.0.3:10003
Slide 29
Slide 29 text
有名どころな解決方法 CaaS の提供方法はいくつか存在 • OpenStack 環境用 – Magnum (Zun) + (Heat + Midonet) Magnum 単体では k8s が構築できるだけ • Internal Network の VIP に外部疎通性を持たせる方法 – Kuryr + Midonet 機能的には十分だがまだ敷居が高い – Calico 機能的には十分だがまだ敷居が高い • その他検討した方式 – ConPv OpenStack 環境では動作が怪しい、コミュニティが見えない – Large Kubernetes Cluster テナント分離や拡張性に難あり 16/12/09 29 障害時のデバッグが大変 情報が少なめ ProducPon Ready?
Slide 30
Slide 30 text
じゃあどうするか 16/12/09 30
Slide 31
Slide 31 text
弊社の CaaS 環境の構想 16/12/09 31 Overlay (flannel + iptables + VXLAN) Container-B Container-A Container-B Container-C Container-C Container-A Overlay (LVS+ iptables + VXLAN) Container-B Container-A Container-B Container-C Container-C Container-A Overlay (flannel + iptables + VXLAN) Container-B Container-A Container-B Container-C Container-C Container-A Overlay (LVS+ iptables + VXLAN) Container-B Container-A Container-B Container-C Container-C Container-A Tenant A Tenant B SNAT の LB を利用した 外部疎通性のある VIP OpenStack 上の各テナント毎に任意の COE クラスタ on nova-lxd Container ※ Docker Image は Swin バックエンドの docker-registry
Slide 32
Slide 32 text
弊社の要件 • 外部疎通性のある VIP が欲しい – ポートは任意のものが使えるように • 積極的に L3 agent を使う理由はまだない • 各コンテナに入りたい – SSH じゃなくても COE のノードにログインできればいい • NW 分離、Security Group、認証、Quota、BlockDevice • COE は自由に選びたい – Kubernetes – Swarm • COE on VM は避けたい 16/12/09 32 物理の SNAT LB を利用 テナント毎に OpenStack 上に クラスタ構築 nova-lxd 上に構築 OpenStack Heat を使って テンプレートを複数用意
Slide 33
Slide 33 text
次期 OpenStack 環境に向けて アプリケーション的な用途 Docker のアプリケーションコンテナ on nova-lxd 従来通りの VM 的用途 nova-lxd のシステムコンテナ 16/12/09 33 KVM docker nova-lxd nova-lxd 【現状】 【次期環境】 フルコンテナプラットフォームの実現も可能
Slide 34
Slide 34 text
まとめ 16/12/09 34 OpenStack では FloaPng IP が k8s の Service に bind できるのが自然 – Kuryr + Midonet がコンセプト的には好み とはいえ、障害時のデバッグとかは大変そう… コードを追えるようになるには時間が足りない VIP/LB 周りとかは信頼性のある LB に任せたい 大幅なリスク低減、疎結合なアーキテクチャ 全てコンテナで動かしたい 全部が Docker Container というわけではない
Slide 35
Slide 35 text
ご静聴ありがとうございました。 16/12/09 35