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