「マイクロサービスにおけるRails」としてのKubernetes――それをAWSで。
freeeでも徐々にそのような課題が見え始めてきたため、打ち手の一つとしてKubernetes on AWSの導入を進めています。
Kubernetesは一般的に「コンテナオーケストレーション」を実現するためのシステムであり、OSSです。代表的なユースケースでは、人間が「どのような条件を満たすDockerコンテナがいくつ必要か」という意思(Declarative Specといいます)をYAMLファイルに定義し、それを渡すことでKubernetesがその意思に基づき、コンテナをよしなにデプロイします。
仮にKubernetesが管理するサーバーが障害などによって停止した場合は、余剰リソースを使うか、足りなければサーバーを追加してコンテナを自動的に復旧します。サーバー障害の有無にかかわらず人間の「こんなコンテナがほしい」という意思は変わらないため、Kubernetesがそれを尊重するように自発的に動く、といったデザインです。
Kubernetesと類似のシステムはRancher、DC/OS、Docker Swarm、Hashicorp Nomad、Kontena、AWS ECSなど例を挙げればキリがありません。こうしたツールのどれを採用するかは状況次第なので、正解はありません。
freeeでKubernetesを採用した代表的な理由は以下の通りです。
- マイクロサービスアーキテクチャの基盤が欲しかったため
- 「kube-aws」というKubernetesクラスタをAWS上に構築するツールのメンテナーがいるため
- AWSそのものの利用に長けたエンジニアが多数いるため
- マイクロサービス数が増える一方であるため
- インフラチームはなく、SREチームがあり、人力よりエンジニアリングで組織をスケールさせる方向性を持っているため
- Kubernetes(on AWS)や周辺ツールが成熟してきたため
いくつかピックアップして説明していきます。
注意
ここまでKubernetes on AWSを軸とした打ち手について紹介しましたが「Kubernetes on AWSで課題が解決する」と言っていないところには注意してください。
Kubernetes on AWSは実装詳細であり、開発・運用の自動化、という目的を達成することができれば実装は何でもいいでしょう。私は「kube-aws」というOSS(後ほど説明します)のメンテナーをしているので、そのOSSコミュニティと技術、ソフトウェアについては愛情がありますが、それを企業で採用することの是非は全く別問題です。
マイクロサービスアーキテクチャの基盤
私はKubenetesのことをよく「マイクロサービスアーキテクチャのためのRails」と説明しています。
Kubernetesの特徴は、多くの機能にしっかりデザインされたAPIでアクセスでき、主要なプログラミング言語向けのライブラリが公式にメンテナンスされていることです。
Railsの利点の一つはフレームワークによってアプリケーションを構造化し再利用可能にできること、と書きました。同じことがKubernetesにもいえます。Kubernetesはありとあらゆる機能をAPIで提供し、そのAPIを使うと「Kubernetes上で動く(分散)システム」を(少なくともフルスクラッチよりは楽に)実装することができます。結果的に、KubernetesのAPIで実現できるタスクはちょっとしたスクリプトによって自動化できます。これは、まさにわれわれがRailsでWebアプリケーションを実装することによって得られていた恩恵のマイクロサービス版です。
また、マイクロサービスを開発・運用する課題が多岐にわたることも前述の通りですが、KubernetesはAPIを中心にさまざまな機能を追加・拡張できるため、そうした課題を少ない手数で解決することができます。
例えば、分散ロギングのためにはFluentdやtd-agentをKubernetesへデプロイすることで、Kubernetes上で起動したコンテナのすべてのログをFluentdで集約する方法が確立されています。Fluentdにロックインされているわけではなく、Elasticsearchで著名なElastic Stackに含まれるFilebeatといったログエージェントを利用することも可能です。
分散トレーシングのためには、DatadogやNew Relicのような著名なSaaSのほか、ZipkinやJaegerといったOSSを組み込む手段も確立されています。
このように、KubernetesはHerokuのようなPaaSではなく、あくまでよくデザインされたAPIを軸としたフレームワークです。フレームワーク上でどのようなマイクロサービスプラットフォームを実装するか、われわれが選ぶことができるのが、Kubernetesの特徴といえます。
freeeでKubernetesを利用する目的の一つは、自社にとって必要十分なPaaSをできるだけ現実的な工数でつくりたいからです。freeeでは、増え続けるマイクロサービスの運用を楽にしていくために、アプリケーション開発者ができるだけビジネスに直結する開発に集中できるような環境づくりを進めています。それを中長期的に見て低コストで行うための手段が自動化であり、それを突き詰めた先には、例えばHerokuのような汎用的で多機能なPaaSほどではないにしろ、freeeにとって必要十分なPaaSがある、と考えています。