【Okinawa Open Days 2016】OpenStack 環境におけるContainer as a Service の提供と課題
by
Masaya Aoyama (@amsy810)
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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