CNDT2021、Kubernetes上のステートフルアプリに関する深い考察をゼットラボのエンジニアが解説
CloudNative Days Tokyo 2021から、ステートフルなアプリケーションをKubernetes環境下で実行する際のポイントを解説したセッションを紹介する。ヤフージャパンの技術開発会社であるゼットラボのエンジニア坂下幸徳氏によるセッションのタイトルは「ステートフルアプリ on Kubernetesの現在と今後の展望」というものだ。サブタイトルの「~ステートフルの苦手意識を吹っ飛ばそう~」に坂下氏の想いが現れていると言えるだろう。
Kubernetesでは難しいとされてきたステートフルアプリの実装と永続的ストレージについて、実際はそれほど難しいものではないということをさまざまな角度から解説する内容となっている。元日立製作所で2018年からゼットラボに移っている坂下氏は、さまざまなカンファレンスでスピーカーをしている経験豊富なエンジニアだ。坂下氏のストレージやコンテナ、Kubernetes関連のソフトウェアに関わってきた経験が滲み出てくる深い考察を伴った内容となっており、特定のソフトウェアの機能を解説するだけではない深みのあるセッションとなった。
坂下氏は20分という短い時間の中で「コンテナでステートフルアプリは難しいは風評」であり、すでに多くのソフトウェアがKubernetes上でのコンテナを本番環境で使っていること、そしてKubernetesの永続的ストレージの基本、仮想マシンとの性能比較、ステートフルアプリを運用する際のポイント、MySQLを例にとってスケールアウトの概要解説、Kubernetesでのスケールアウトの方法論、ステートフルアプリに要求される稼働率についての考察、さらに自身の経験から作り上げたステートフルアプリに至るまでのトレイルマップ、Kubernetes環境でのストレージ技術の動向などを解説している。
「コンテナでステートフルアプリ」はもう当たり前
最初に紹介したのは「Kubernetesではステートフルアプリは難しい」という認識に関するスライドだ。
ステートフルアプリを仮想マシンで実行することは、2009年頃の認識では当たり前ではなかったが、2021年現在では仮想マシンはベアメタルなどと同様に選択肢のひとつとなっていることを紹介している。コンテナ上でステートフルアプリを使うことに積極的でない人は性能や設定の難しさなどを理由に挙げているが、それは風評ではないのか? という問題提起を行っている。
CNCFの調査の結果を挙げて、すでに半分以上の企業がステートフルアプリをコンテナ上で利用していることを紹介。CNCFのメンバーは先進的であることを差し引いても、すでに忌避することではないと解説した。またコンテナ上でステートフルアプリを使うためのOperatorも数多く作成されていることを合わせて紹介した。
Kubernetesの永続的ストレージ
次にKubernetesの永続的ストレージの基本を解説し、PersistentVolumeClaim(PVC)、PersistentVolume(PV)、StorageClass(SC)というシンプルな階層構造となっていることを紹介した。
コンテナ(Pod)から物理的なストレージに至る経路についても1枚のスライドで解説を行い、ここでもシンプルな構成になっていることを紹介した。
コンテナと仮想マシンのストレージ性能比較
ここでベアメタル、仮想マシン、Kubernetesのアプリケーションからストレージに至るまでの仕組みを解説し、コンテナのそれが実際にはシンプルな構成になっていること、仮想マシン上にKubernetesを実装する場合は2階建ての構成になることを解説した。
そしてIBMが2015年に公開したIEEEの論文を使ってベアメタルとコンテナ、仮想マシンによるIO性能の比較を紹介し、実際には仮想マシンよりもコンテナ実装のほうが性能高いことを解説した。
参考:An updated performance comparison of virtual machines and Linux containers
運用のポイント
ここまででコンテナ、Kubernetesで永続的ストレージを避ける理由として挙げられる「難しい」と「遅い」がいずれも正しくないことを解説した坂下氏は、次に運用面に踏み込んで解説を行った。
データを利用するアプリケーション側は、キャッシュにデータを残したまま終わらないようにする配慮が必要であること、スケールアウトするためのレプリケーションなどにも必要な操作があることなどを紹介した。
次のスライドではMySQLを例に挙げて1つのインスタンスからレプリケーションを行う一般的な操作を解説。ここでも実際に運用に関わっている経験が生きている内容となった。
その上で、Kubernetes環境でその操作を行う場合のパターンを紹介。ここでは2番目にKubernetesの特徴であるReconciliation Loopに注目して解説を行っている。
Kubernetesの特徴である自律性については、同じくゼットラボのエンジニアがGoogleのBorgの生い立ちなどから考察を行っているので、そちらも参考にして欲しい。
参考:これから学ぶKubernetesのReconciliation Loop
稼働率に関する考察
そしてここからはステートフルアプリに求められる永続性の根拠となる稼働率についても考察を行っている。例えば1年に1回だけ1時間停止する場合と、毎月5分だけ停止する場合が同じ稼働率99.988%となることを紹介。これまでのステートフルアプリに求められる稼働率の考え方について、年に一回だけ停止するようなシステムを求める考え方ではなく、常にアプリケーションや利用頻度が変化するような場合についてはMTBF(平均故障間隔)を短くする方法、つまりKubernetesのようなシステムを想定するべきであると解説した。
ステートフルアプリ実装のトレイルマップ
次のスライドは、坂下氏が考えるステートフルアプリをKubernetesで実装する場合のステップをトレイルマップとして紹介したものだ。これは、CNCFによるクラウドネイティブなシステムへのステップを紹介しているトレイルマップを参考にした発想だろう。
ここではファイル共有、バックアップ、シングル構成とマルチ構成のPodによるステートフルアプリ、Operatorによる実装などの各ステップを解説した。
ここではアプリケーションの特性、利用されるデータベースの種類などによってさまざまな方法があることを語り、必ずしも1つの方法でカバーできないことを強調した。
またRed Hatなどが推進するKubernetes運用のためのフレームワークOperatorにも言及し、利用するのは容易だが実際にOperatorを開発するにはノウハウが必要であることを解説した。
エッジ向けストレージ
ここまででKubernetes上でのステートフルアプリの運用面での解説を終え、次に坂下氏が注目しているエッジ向けのストレージ、そしてKubernetesのSIGであるStorageから発生したワーキンググループで議論されているアプリケーションの視点から、バックアップを実装する機能の進展を解説した。
エッジ向けではSoftware Defined Storage(SDS)がネイティブにコンテナ対応していること、IoTの基盤である省電力CPUであるARMへの対応が始まっていることなどを紹介した。
これはベンダーに依存しないニュートラルなアーキテクチャーでバックアップのあるべき姿を実装しようという試みだと思われるが、「実際に今足らないコンポーネントは何か?」「どうあるべきか?」などを議論の上でKEP(Kubernetes Enhancement Proposal)についても紹介し、現材進行形の機能拡張についても解説を行った。
KEPとは:https://github.com/kubernetes/enhancements/blob/master/keps/README.md
最後にまとめとして、コンテナ(Kubernetes)でステートフルアプリを動かすのは選択肢のひとつであることを再度、強調してセッションを終えた。単にKubernetesの機能を紹介するだけではなく、業界動向や推奨する手順を解説するなど、経験豊富なエンジニアとしての考察がまとめられた充実した内容となった。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- CNDT2021、日本オラクルのエンジニアによるクラウドネイティブを再確認するセッション
- コンテナを導入しないと、どのような未来が待っていたのか?【後編】
- CloudNative Days Tokyo 2019開催。Airbnb、IBM、Canonicalなどが登壇
- 「CloudNative Days Tokyo 2021」開催レポート
- CNCFのサンドボックスプロジェクト、カオスエンジニアリングのLitmus Chaosを紹介
- オープンソースのストレージ管理ソフトウェアSODAがオンラインカンファレンスを開催
- コンテナ対応ストレージの登場により、エンタープライズ領域へと広がるKubernetes
- いよいよ11/4開催! 「CloudNative Days Tokyo 2021」みどころ紹介
- CNDT2020シリーズ:オススメのGitOpsツールをCAのインフラエンジニアが解説
- KubeCon North Americaサンディエゴで開催。12,000人と過去最大の規模に