CloudNative Days Fukuoka 2019 講演資料
NoOps を目指して Kubernetesネイティブな物理データセンターを作るサイボウズ株式会社山本泰宇 @ymmt2005CloudNative Days Fukuoka 2019
View Slide
自己紹介▌サイボウズ株式会社で20年ほど⚫ CTO, 開発本部長, 運用本部長など歴任⚫ cybozu.com 開発プロジェクトの責任者⚫ 現在は Neco というプロジェクトの責任者▌きれいなコード、リファクタ、ドキュメントが好き⚫ Software Entropy Reducer を名乗ってます
今日の内容▌cybozu.com が抱える課題▌インフラ刷新プロジェクト Neco の紹介▌方法論とここまでの成果▌これからの話
サイボウズ & cybozu.com▌グループウェアの開発・販売⚫ 「サイボウズ Office」は 20 年以上ベストセラー⚫ もともとはパッケージソフトウェア販売▌cybozu.com⚫ 自社グループウェアを SaaS で提供⚫ 2011年11月からサービス開始
パッケージ パッケージ パッケージ
cybozu.com の規模▌契約社数 28,000社▌契約ユーザー数 100万人以上▌リクエスト数 2.6億/日▌サーバー台数 2,000台弱
単調に規模が拡大してきた-50000500010000150002000025000300003500040000450002011 2012 2013 2014 2015 2016 2017 2018契約社数契約社数 二次回帰 線形回帰需要予測が容易強気の投資が可能
cybozu.com の中身▌レガシーなアプリ(Office, メールワイズ)⚫ C++ の CGI, 組み込みのデータベース(sqlite)▌独自開発の自社インフラ⚫ VM, ストレージ, ロードバランサ等▌巨大なモノリス⚫ インフラ+デプロイ+モニタリング+ログ基盤
抱えている課題開発体制がクラウドに最適化できてない低いスケーラビリティ手作業・Toil が多い
開発体制がクラウドに最適化できてない▌パッケージ製品開発時代を引きずっている⚫ 製品開発とサービス運用が別部署⚫ 品質保証体制が出荷前試験に偏り▌問題⚫ 自分が作った製品の運用に疎い開発者⚫ 中身がわからない製品を運用する SRE⚫ 簡単な不具合がすぐに修正できないリリース管理
低いスケーラビリティ▌HDD ベースのネットワークストレージのみ⚫ ミドルウェア・製品単位に最適化できてない▌少数台のサーバーで顧客をグルーピング⚫ アプリケーションのスケールアウトが非常に困難▌台数に比例するオペレーションが存在⚫ OS のインストールやサーバー入れ替え作業
手作業・Toil が多い▌逐次的なオペレーション⚫ コマンド打って、確認して、次のコマンド打って…⚫ ときには何時間も端末に張り付いて作業▌非継続的なデリバリ⚫ 典型的なデリバリ作業も毎回手作業⚫ 作業時は SRE 2名でペア作業⚫ 作業時にエラーが出ることもしばしば
こうありたい▌高速な開発・運用のワークフロー(DevOps)▌ミドルウェアごとに最適化された構成▌数千台の規模を活かせるスケーラブルなシステム▌撃ちっぱなし可能な宣言的オペレーション▌継続的なデリバリ
NoOps(No “Uncomfortable” Ops)
NoOps とはNoOps Definition v1.0 よりhttps://github.com/noopsjapan/community/blob/master/DEFINITION.mdNoOpsはNo Uncomfortable Ops(システム運用の嬉しくないことをなくす)を目指すための技術、アーキテクチャ、それを実現するための活動を指します。このアプローチの代表例に、コンテナを活用した高回復性設計、DevOpsの活用、モニタリングと構成設定の自動化、SREによるToil削減活動、などがあります。NoOpsを実現するためのシステムが備えるべき代表的な能力には、高い回復性、可観測性、構成可能性、安全性の担保があります。これらNoOpsの能力を活用することで、例えば、Self-Healing、In-flightrenewing, Adaptive Scale, Safety Everywhereなどのエクスペリエンスを実現することが可能になります。
インフラ刷新プロジェクトNeco
Neco プロジェクト概要▌2018年1月から始動▌ゴールとスコープ⚫ 前述の課題を解消⚫ データセンターの刷新まで(現システムからの移行は別プロジェクト)⚫ 完全 IaaS 化はしない▌体制⚫ 私含め、当初 6 名現在 9 名
データセンター内のシステム論理構成3~5台の管理サーバー群数千台のノードで構成される Kubernetes クラスタElasticsearch や MySQL のマネージドサービステナント テナント テナント …Neco
なぜ物理データセンター?▌合理性と、気持ちの両面があります▌合理性⚫ IaaS との比較で億円単位で節約可能と試算⚫ 購入機材は使い放題でレガシーアプリに優しい⚫ 国内でDC運用する十分な人員と経験がある⚫ cybozu.com の需要は単調増加▌気持ちは後で!
なぜ Kubernetes?▌物理サーバーに直接依存させたくない⚫ 毎年数百台を増強・入れ替えするため→ コンテナ or VM でアプリは動作▌コンテナ・マイクロサービス時代の「勝ち馬」⚫ エコシステムが拡大を続けている▌優れた設計⚫ 宣言的 API で大規模分散システムの運用を容易に⚫ 拡張性が高く、様々な機能をアドオンできる
Neco の設計原則▌Be Declarative⚫ Kubernetes 以外もすべて、宣言的に操作可能にする▌Define by Software⚫ 特定の目的に縛られたサーバー・ネットワークを作らない⚫ サーバー・ネットワークの役割をソフトウェアで変更する▌Test Everything⚫ 継続的なデリバリーには試験は自動化しないといけない⚫ データセンターで動作するすべての機能を自動試験する
Neco 流データセンターの作り方
こんな順番で作ってきました1. 仮想データセンターの構築ツールを準備2. 標準化されたラックを単純増設可能にする3. BGP で OS から経路制御可能にする4. 大量のサーバーをネットブートで管理する5. 機能試験をアップグレードも含め自動化する6. デリバリ作業を宣言的(GitOps)にする
分散システムだって自動試験したい▌分散システムのテストは一般的に困難⚫ 例:複数台の Linux サーバーのユーザーを自動同期するツールの動作確認⚫ 従来は全開発者が共有する試験用データセンターで動作確認していた▌分散動作も事前に(自動)試験したい!⚫ github.com/cybozu-go/placemat
placemat▌仮想データセンター構築ツール⚫ L2 ネットワーク=Linux ブリッジ⚫ ルーター=BIRDコンテナ⚫ サーバー=QEMU/KVM▌機能⚫ YAML で宣言的に環境構築⚫ Virtual BMC (IPMI)⚫ UEFI HTTP Bootkind: Networkname: ext-nettype: externaluse-nat: trueaddress: 192.168.1.0/24---kind: DataFoldername: datafiles:- name: sabakanfile: sabakan- name: sabactlfile: sabactl---kind: Imagename: ubuntufile: ubuntu-18.04-server-cloudimg-amd64.img---kind: Nodename: host1interfaces:- ext-netcpu: 1memory: 1Gvolumes:- kind: imagename: rootimage: ubuntucopy-on-write: true- kind: vvfatname: datafolder: data---…
物理ラックの構成設計▌毎年数百台を増設・入れ替え⚫ ラック単位で管理したい⚫ ToR スイッチ2台で冗長化▌構成は標準化⚫ Software-defined なので特殊な物理構成が不要にもっとも標準的なラック構成
ネットワークの設計と実装▌L2 拡張技術を排除してマルチベンダー化▌経路の管理と冗長化は BGP + BFD⚫ Linux サーバーから自由に経路設定が可能▌専門的な話はブログをどうぞ
ネットワーク概略図これ全部 placematで仮想化してます
サーバー管理&ネットブート▌Kubernetes Node には CoreOS を採用⚫ ネットワークブートに最適化⚫ コンテナを動かす機能しかない→ サーバー再起動で OS がバージョンアップ!▌サーバーの IP アドレスや状態管理、ネットワークブートのためのソフトウェアを開発⚫ github.com/cybozu-go/sabakan
Sabakan▌管理サーバー上で動作▌データは etcd に保存▌複数台動作させるだけで簡単に冗長化
ここまで作るので半年
Kubernetes の自動運用▌Kubernetes を動かすには以下が必要⚫ etcd, 認証局, kubelet など管理プログラム⚫ Kubernetes 自体の運用はなかなかの手間▌自動運用ツールを開発⚫ sabakan と同じく、管理サーバー上で動作⚫ github.com/cybozu-go/cke
CKE▌Kubernetes クラスタを自動構築⚫ sabakan と連携してノードを自動で追加・削除⚫ 故障したコントロールプレーンの冗長化回復も⚫ Kubernetes の自動バージョンアップも▌Vault で秘密管理⚫ 証明書発行⚫ Secret 暗号化
管理サーバーの構成Ubuntu Ubuntu Ubuntu ………手作業管理はしんどい!etcd etcd etcdVaultSerfetcdpasswdSabakanCKEVaultSerfetcdpasswdSabakanCKEVaultSerfetcdpasswdSabakanCKEデータは etcdクラスタに保存Made by Neco
自動デリバリツール neco▌管理サーバーの構築・運用を自動化⚫ etcd, Vault クラスタのブートストラップ⚫ 管理サーバーの追加・削除⚫ 管理サーバー上のアプリの自動更新(GitOps)▌プロジェクトと同名のレポジトリで管理⚫ github.com/cybozu-go/neco⚫ placemat の仮想 DC 上で push 毎に CI
necoBuildTestNeco の CI パイプラインCKEsabakanDC Testnecoその他CKEsabakanその他push pushpullpush tagpush/dailyplacematすべてを結合して仮想データセンター上でテスト仮想DC上のテスト• ブートストラップ• アップグレード• クラスタ機能テスト• 停電復旧テスト• …
GitOps で pull 型デリバリーBoot Server Boot Serverneco-updateretcd etcdCKE sabakan CKE sabakanneco-worker neco-worker最新リリースのチェックnecoCKEsabakanその他push tagdeb パッケージをビルド&リリースdownload
物理サーバーの自動管理▌BIOS や BMC をネットブート後に自動設定⚫ github.com/cybozu-go/setup-hw⚫ BMC 経由で故障パーツの監視機能もあり▌Hashicorp serf で障害検知⚫ ネットワーク応答不能ノードを検知⚫ sabakan で状態を変えて、CKE が自動でKubernetes クラスタをメンテナンス
ここまで作るので一年
仮想データセンターで開発してきましたが
物理データセンターでもあっさり動きました\(^o^)/placemat の再現度を徹底的に高めるのが肝
今年に入ってからの成果▌Argo CD で k8s アプリを継続デリバリ⚫ これも GitOps で pull 型▌MetalLB で LoadBalancer を実装▌Prometheus でモニタリング▌PodSecurityPolicy で危険な Pod を防止▌Calico で NetworkPolicy を実装(Coming soon)
Neco as of Apr. 2019GitHubArgo CDNeco CDUbuntu管理サーバーSabakanCKEMade by Neco3~5台管理サーバーを自動更新CoreOSCoilCoreOSCoilCoreOSCoilCoreOSCoilネットブートKubernetes自動管理Argo CD PrometheusMetalLB Calico…アプリを自動管理
NoOps?
Neco でもできるぜ!
気持ちの話
なぜ、今あえて物理データセンターか▌全面 IaaS という選択肢も合理的でありえる⚫ 実際、U.S. 向けは AWS に移行予定▌合理性だけじゃない、気持ち⚫ 海外企業がデータセンターを総取りでいいのか⚫ ハードウェアを含めたコンピューターが好きだ⚫ 俺たちならやれる、自信がある
やる以上は、最高の結果を▌いいデータセンターを作る⚫ 一年ちょっとでここまで作れた▌いいデータセンターの作り方を広める⚫ Neco の成果物は 99.9% OSS で公開▌あわよくば、仲間を増やす!⚫ いいデータセンターを作るノウハウ、共有しましょう
まとめと今後
Neco 流データセンターの作り方1. 仮想データセンターの構築ツールを準備する2. 標準化されたラックを単純増設可能にする3. BGP で OS から経路制御可能にする4. 大量のサーバーをネットブートで管理する5. 機能試験を徹底的に自動化する6. デリバリ作業を宣言的(GitOps)にする
今後の予定▌マルチテナント環境の整備⚫ 一般開発者の利用に向けて認証やセキュリティを充実▌ミドルウェア as a Service の開発⚫ YAML ひとつ書けば指定したサイズのElasticsearch クラスタが準備される仕組み⚫ MySQL も同様に▌オブジェクトストレージ⚫ Ceph 運用を自動化する Rook で実装予定
年内に本番環境稼働予定!
おしまいご清聴ありがとうございました