Kubernetes(AKS)をやさしく学ぶ旅 その2
その2です
前回は Kubernetes の触りの部分を記事にしましたが、まったり優しく行く為、今回もハンズオンはナシです。次回くらいから触っていこうと思います。
今回の題材としては Kubernetes を利用することによって何が変わるのか?そのメリデメを学ぼうと思います。
Kubernetes で変わること、メリデメ。
下記の方のスライドがとってもとってもまとまってます!超が10回つくほどオススメです。スライドの P38 にもあるように変わることは非常に沢山あります。「とりあえず、 Kubernetes にしましょう。」というレベルでないことは一目瞭然です。が、インフラのコード化によって個々のバラバラだった環境を全て Kubernetes 環境下においてコントロールできるようになるのは大きいメリットです。
*はてブロで Slideshare をリンクするとこうなるんですね!ステキ。
メリット
ベロシティ(速度)
Web システムを例にとると1日に数度改善を入れる、ということもある昨今。新しい機能を開発してデプロイするスピードが求められる中、単なるスピードだけではなく信頼性の高いサービスである必要があります。すなわち、可用性も高めた上で運用できる環境を求められ Kubernetes は実現します。下記のような例で考えるとお客様の立場からするとシステムは止まらずに稼働し続けているように見えます。
【Legacy】Ver 1.0 -> stop -> Update!! -> start -> Ver 1.1
【Kubernetes】Ver 1.0 -> running -> Update!! -> running -> Ver 1.1
イミュータブル(不変)
Legacy の時は「ミュータブル」であり、設定変更・OSのアップデート・コンポーネントの追加等の積み重ねでシステムが構築されます。それに対して Kubernetes は「イミュータブル」であり、その積み重ねを「新しいイメージを作成」することでシステムを置き換えてしまいます。前者は変更の履歴を持たないのに対して後者は作成した方法を明示的に持っており(Dockerfile)障害時のリカバリとしてその履歴を利用できます。
宣言的設定
イミュータブルであることはクラスタ上でコンテナを動作させるだけなく、 Kubernetes に対してアプリケーションを記述する方法にもあてはまります。 Kubernetes上ではあらゆるものが、システムの望ましい状態を表現する宣言的設定のオブジェクトです。
自己回復するオブジェクト
Kubernetes はオンラインで自己回復するシステムです。現在の状態が望ましい状態に一致するよう動き続けます。初期化やシステムを不安定にするという信頼性に影響を及ぼしかねない障害からシステムを保護します。
マイクロサービスの構築に適している
導入として下記の Google の文献(マイグレーション)は参考になります。日本語です。
Legacy の際は「モノリシック アプリ」を指し多い人数(ここでは18人と想像する)で全ての機能を載せた1つの大きなシステムの集合体を開発しているとします。これに対して Kubernetes が得意とする「マイクロサービス」は機能A・B・Cを6人ずつの開発者で分け独立したシステムを連携した形で表現します。チームの人数が機敏性に優れることをはじめとし、以下のメリットもあります。
・モノリシックに対して個別に機能を切り出している為、スケール化しやすい。
・マイクロサービス毎に言語を変えることもでき、環境を柔軟に変えられる。
・他の機能との境界が明確であり、影響を及ぼしにくい。
Kubernetes はこのマイクロサービスを最適化する為、抽象化層や API を提供しております。(マイクロサービスの話に関しては前述の記事にも参考があります)
・前回の記事の Pod という概念
➡さまざまなチームが開発したコンテナイメージをグループ化しデプロイ可能とする
・Service がマイクロサービス間の分離の為にロードバランシングやネーミングなどの機能を提供する
・Namespace がマイクロサービス同士の連携範囲を制御できるよう、分離とアクセス制御を行う。
・Ingress が複数のマイクロサービスをまとめつつ、単一の外部からアクセス可能なAPIを提供したりフロントエンドを提供できる。
と、良いことづくめに見えますが・・・・。
デメリット(私感含めて)
一言でまとめると「ハードルが高く感じる」(≒入門レベルではない)です。概念含め理解するのには時間がかかりますし一筋縄で行かないところも多いと感じます。ただ、そこで挫折するのではなくトライアンドエラーを繰り返しながら設計・構築しナレッジを少しずつ積み上げることで最終的に得られるメリットを恩恵として受け取れれば良いのかなと思います。
また、上記のサイト内の記載にもあるように Kubernetes は全てのシステムに対して万能ではない為、活用するのに適したシチュエーションがあります。そこを見誤らない目を磨くためにもやはりナレッジを蓄積していくのは大事なのかなと考えます。