Yahoo! JAPAN における OpenStack on Kubernetes 導入までの道のり 続 Dec 7, 2017 1 ヤフー株式会社システム統括本部サイトオペレーション本部北田駿也木下裕太
Who are we? 北田駿也 (Shunya Kitada) 2013 年からヤフーのOpenStackチームに所属 OpenStackと社内システムの開発 OpenStackのデプロイシステムの開発 木下裕太 (Yuta Kinoshita) 2015 年からヤフーのOpenStackチームに所属 OpenStackの運用に従事 Kubernetesの技術調査や構築 2
アジェンダ Yahoo! JAPAN のプライベートクラウド 変化と課題 OpenStack on Kubernetes による解決 Kubernetes によってもたらされるメリット OpenStack on Kubernetes 構成 監視 まとめ 3
アンケート OpenStack 知ってる人? 使ったことある人? 開発で使ってる人? プロダクションで使ってる人? 4
アンケート Kubernetes 知ってる人? 使ったことある人? 開発で使ってる人? プロダクションで使ってる人? 5
Yahoo! JAPAN の プライベートクラウド
Yahoo! JAPAN のプライベートクラウド クラウド基盤 : OpenStack 稼働時期 : 2011(In House)~ 2013(OpenStack) クラスタ数 : 60 以上 OpenStackバージョン : Grizzly Mitaka HV 数 : 7,000 以上 VM 数 : 100,000 以上 7
サービスドメイン on OpenStack EC 系 決済 / 金融系 メディア系 会員系 広告系 社内プラットフォーム系 etc... 8 ミッションクリティカルなシステム多数これら多くのサービスでプライベートクラウドを利用
インスタンス利用目的の変化と課題 2013 2014 2015 2016 ユーザの要望 既存のベアメタルを VM へ置き換えたい クラウドネイティブなアーキテクチャを採用したい システム毎の要件にマッチするクラスタが欲しい PaaS の基盤として使いたい クラウドチームの対応 本番環境のリリース クラスタ増設 個別要件にマッチした クラスタの構築 プラットフォーム毎の要件に対応したクラスタの構築 9
インスタンス利用目的の変化と課題 2013 2014 2015 2016 ユーザの要望 既存のベアメタルを VM へ置き換えたい クラウドネイティブなアーキテクチャを採用したい システム毎の要件にマッチするクラスタが欲しい PaaS の基盤として使いたい クラウドチームの対応 本番環境のリリース クラスタ増設 個別要件にマッチした クラスタの構築 プラットフォーム毎の要件に対応したクラスタの構築 クラスタ数の増加 OpenStack API の障害範囲が拡大 10
クラスタ数の増加によって OpenStack Cluster OpenStack Cluster OpenStack Cluster 検証等 運用者 OpenStack Cluster OpenStack Cluster OpenStack Cluster 障害対応新規構築 11 OpenStack クラスタの障害を自動で復旧させたいクラスタの構築 更新を完全に自動化したい
障害アラートと問い合わせ 障害アラート件数の推移 問い合わせ件数の推移 H L 12
プラットフォームの基盤となったことで OpenStackAPI のアクセス数が激増 プラットフォームがシステムの健全性を確認する 高い頻度のインスタンスの作成と削除 API のアクセス数 従来用途クラスタ OpenStackAPI の障害の深刻化 API がダウンしている場合にプラットフォームが期待した動作ができない可能性 場合によってはプラットフォーム上の App に影響がある可能性 プラットフォーム基盤のクラスタ 13 今まで以上に安定した OpenStack の提供 OpenStack のワークフローレベルでの健全性を担保
現在の課題 クラスタ数増加による障害の増加 障害の自動復旧が必要 クラスタの構築 更新を自動化する必要がある OpenStack の障害範囲がプラットフォームまで拡大する 今まで以上に正常な動作が求められる ワークフローレベルでの正常性担保が必要 インスタンスが立つか? ボリュームがアタッチできるか? 14
課題に対する解決策
課題に対する解決策 障害の自動復旧 OpenStack クラスタの構築 更新を自動化 ワークフローレベルの正常性担保 16
課題に対する解決策 障害の自動復旧 OpenStack クラスタの構築 更新を自動化 ワークフローレベルの正常性担保 人によるオーケストレーションではなく システムによるオーケストレーションが必要? 17
課題に対する解決策 障害の自動復旧 OpenStack クラスタの構築 更新を自動化 ワークフローレベルの正常性担保 人によるオーケストレーションではなく システムによるオーケストレーションが必要? 18
Kubernetes コンテナのオーケストレーションツール コンテナのデプロイ スケジューリング ヘルスチェック オートヒール オートスケール ロードバランシング マイクロサービスの管理に適する 19
Kubernetes の用語 Ingress nova.example.com Service nova-api-service nova-api-deployment nova-api nova.conf Deployment Configmap nova.conf マウント 20
Kubernetes の用語 Ingress nova.example.com Service 複数のコンテナをまとめたもの 21 nova-api-service Deployment nova-api-deployment nova-api nova.conf Configmap nova.conf マウント
Kubernetes の用語 Ingress nova.example.com Deployment Rolling Update を可能にする ReplicaSet を管理し の数を一定に保とうとする Service nova-api-service nova-api-deployment nova-api nova.conf Deployment Configmap nova.conf マウント 22
Kubernetes の用語 Ingress nova.example.com Service nova-api-service Deployment Service をグルーピングしたものに対してのアクセス方法を定義する nova-api-deployment nova-api nova.conf Configmap nova.conf マウント 23
Kubernetes の用語 Ingress nova.example.com Service Ingress L7 ルーティングを柔軟に設定できる 24 nova-api-service Deployment nova-api-deployment nova-api nova.conf Configmap nova.conf マウント
Kubernetes の用語 Ingress nova.example.com Configmap config などの設定情報を Kubernetes クラスタ内で共有できる Service nova-api-service nova-api-deployment nova-api nova.conf Deployment Configmap nova.conf マウント 25
障害復旧を自動化 自動復旧 自動復旧!! Kubernetes nodes Kubernetes nodes 26
コンテナ毎の正常性担保 Timeout Liveness probe HTTP/GET 再作成 削除 自動復旧 Kubernetes nodes Kubernetes nodes 27
定義書によるデプロイ Manifest Image Pike Replicas 2 Routing Mount...etc API を叩いて deploy Ingress nova.example.com Service nova-api-service nova-api nova.conf Nova の version は Pike で Nova API の は 2 つで nova.conf をマウントして外からはこのドメインでアクセスさせて 28
Helm Kubernetes のパッケージマネージャ Deployment や Service の Manifest を Chart という形でパッケージング テンプレートエンジンを持つ (Values という設定値を上書き可能 ) Chart でデプロイを管理可能 ( バージョニング機能 ) 29
Helm Ingress Chart Manifest のテンプレート Values テンプレートへ埋め込む値 helm install helm upgrade helm downgrade Service Deployment Configmap 30 アプリケーションを config 等も含めた形で管理 versioning による upgrade/downgrade も可能に
OpenStack on Kubernetes OpenStack を Kubernetes 上で動かせば 障害の自動復旧 個々のコンポーネントの正常性監視 デプロイの簡略化 31
OpenStack on Kubernetes OpenStack を Kubernetes 上で動かせば 障害の自動復旧 個々のコンポーネントの正常性監視 デプロイの簡略化 しかし Kubernetes のみではできないこともある ワークフローの正常性監視 デプロイの完全自動化 32
OpenStack on Kubernetes OpenStack を Kubernetes 上で動かせば 障害の自動復旧 個々のコンポーネントの正常性監視 デプロイの簡略化 しかし Kubernetes のみではできないこともある ワークフローの正常性監視 デプロイの完全自動化 Kubernetes の機能をうまく利用することで実現ができそう 33
OpenStack on Kubernetes
OpenStack on Kubernetes 構成 デプロイ 監視 35
OpenStack on Kubernetes 構成
構成の方針 ステートレスなサービスは Kubernetes 上へ 各 API: Keystone, Glance, Nova, 準ステートレスなサービスも Kubernetes 上へ ( データが消えてもいいもの ) RabbitMQ, Memcache ステートフルなサービスはコンテナ化しない DB, Glance Backend(Swift) Libvirt 37
Kubernetes Nodes OpenStack Controller OpenStack Compute Nodes keystone neutron neutronagent novacompute horizon cinder glance nova ingresscontroller libvirtd RabbitMQ 仮想マシン (qemu process) ステートフル ステートレス 38 MySQL Swift
デプロイの方針 人の手でのデプロイは最初のみ その後のデプロイは自動 Git でソース管理 クラスタ構成を一元管理 最新の変更を常に クラスタへ自動反映する 39
デプロイに必要なもの Contianer Deployment nova-api nova.conf Ingress nova.example.com Configmap Service Docker Image nova-api helm install 40 Docker Registry Dockerfile Chart Values
デプロイに必要なもの Contianer Deployment nova-api nova.conf Ingress nova.example.com Configmap Service Docker Image nova-api helm install 41 Docker Registry Dockerfile Chart Values
デプロイに必要なもの Contianer Deployment nova-api nova.conf Ingress nova.example.com Configmap Service Docker Image nova-api helm install 42 Docker Registry Dockerfile Chart Values
デプロイに必要なもの Contianer Deployment nova-api nova.conf Ingress nova.example.com Configmap Service Docker Image nova-api helm install 43 Docker Registry Dockerfile Chart Values
OpenStack Deploy Manager 以下の機能を実現するために内製した Helm による OpenStack の自動デプロイ Helm による OpenStack のコンフィグ等の自動アップデート Deploy Manager 自身も Helm で管理される Kubernetes 上で動作する 44
初回構築時のフロー 構築時に準備するもの Values クラスタ固有の値 OpenStack chart 45
初回構築時のフロー Helm を利用して deploymanager を Kubernetes 上に展開 deploy-manager values.yaml bootstrap-keystone.sh bootstrap-nova.sh Values クラスタ固有の値 OpenStack chart 46
初回構築時のフロー 自動で deploy-manager が Kubernetes 上に OpenStack を展開する helm install deploy-manager values.yaml bootstrap-keystone.sh bootstrap-nova.sh nova-api nova.conf keystone keytone.conf 47
初回構築時のフロー deploy-manager values.yaml OpenStack クラスタが完成 nova-api nova.conf keystone keytone.conf 48
アップデートのフロー nova.conf を変えたい! deploy-manager values.yaml Values クラスタ固有の値 nova-api nova.conf 49
アップデートのフロー 新しい設定値を GHE へ Push deploy-manager values.yaml NEW Values クラスタ固有の値 nova-api nova.conf 50
アップデートのフロー Jenkins が deploy-manager を helm upgrade する deploy-manager values.yaml deploy-manager values.yaml NEW NEW Values クラスタ固有の値 nova-api nova.conf 51
アップデートのフロー deploy-manager が bootstrap スクリプトが再実行して config のアップデートがあった OpenStack コンポーネントは Rolling Update する openstack deploy-manager values.yaml openstack deploy-manager values.yaml NEW bootstrap-nova.sh nova-api nova.conf nova-api nova.conf NEW Upgrade 52 Rolling Update
コントローラ以外のデプロイ OpenStack( コントローラ ) on Kubernetes はできた! それ以外は どうやってデプロイする? Kubernetes のデプロイ OpenStack コンピュートのデプロイ 53
コントローラ以外のデプロイ OpenStack( コントローラ ) on Kubernetes はできた! それ以外は どうやってデプロイする? Kubernetes のデプロイ OpenStack コンピュートのデプロイ Chef Chef 54
コントローラ以外のデプロイ Kubernetes OpenStack コンピュート libvirt libvirt libvirt nova-compute nova-compute nova-compute kubelet kubelet neutron-agent neutron-agent neutron-agent chef-client chef-client chef-client chef-client chef-client 自動更新 chef-server Cookbook, Role 55
OpenStack on Kubernetes 監視
監視の方針 OpenStackコントローラ (on Kubernetes) の監視運用者はKubernetesが健全に動いていれば その上のOpenStackも内部的には健全であると判断する外部監視 (Rally) シナリオ実行してワークフロー SLAを監視物理サーバ (Kubernetes, OpenStackコンピュート ) の監視プロセス監視 メトリクス監視 ログ監視 57
OpenStack コントローラの監視 運用者は Kubernetes が健全に動いていれば OpenStack が内部的には健全であると判断する Kubernetes の機能で OpenStack の各コンポーネントが すべて正常に稼働していることを保証する 58
Kubernetes の機能による監視 Liveness probe 失敗したら再起動 Readiness probe 準備できるまでサービスインしない 59
Liveness probe Liveness probe リクエストが失敗したら再起動 keystone HTTP GET /v3 200 keystone HTTP GET /v3 200 keystone HTTP GET /v3 500 keystone HTTP GET /v3 200 失敗したら再起動 60
Readiness probe Readiness probe 準備できるまでサービスインしない Service keystone keystone keystone HTTP GET /v3 200 HTTP GET /v3 500 Service keystone 成功したらサービスイン keystone keystone HTTP GET /v3 200 HTTP GET /v3 200 61
Kubernetes の機能による監視 Kubernetes が動いているから OpenStack も大丈夫? rabbitmq neutron nova keystone livenessprobe/readinessprobe
外部監視 OpenStack のサービスが正しく動作してるか監視したい! ( 外部監視 ワークフロー監視 ) rabbitmq neutron nova 外部監視システム (Rally) インスタンス作成 keystone livenessprobe/readinessprobe
物理サーバの監視 監視方法 Kubernetes OpenStack コンピュート プロセス監視 sensu メトリクス監視 sensu telegraf, influxdb, kapacitor ( 試験導入中 ) ログ監視 splunk kubelet, docker, kube-api, kube-proxy, CPU, Mem, Disk, etcd timeout, kube-dns cannot connect, nova-compute, neutronagent, libvirt, CPU, Mem, Disk, NIC Link Down, MEMORY CONTROLLER, 64
Kubernetes Nodes OpenStack Controller OpenStack Compute Nodes 外部監視 Kubernetes により監視 外部監視システム keytstone glance neutron horizon novacompute neutronagent libvirtd kapacitor Influxdb メトリクス監視 sensu-client telegraf sensu-client telegraf splunk splunk 65 汎用監視 sensu splunk ログ監視
OpenStack on Kubernetes まとめ
まとめ クラスタ数増加による障害の増加 障害の自動復旧が必要 クラスタの構築 更新を自動化する必要がある OpenStack の障害の影響が深刻化 ワークフローレベルでの正常性担保が必要 67
まとめ Kubernetesによる自動復旧 クラスタ数増加による障害の増加 障害の自動復旧が必要 クラスタの構築 更新を自動化する必要がある OpenStack の障害の影響が深刻化 ワークフローレベルでの正常性担保が必要 Deploy Manager による自動デプロイ 外部監視システムによる監視 68