Kubernetesを勉強しよう、となりました。
何それ、ってところからのスタートなので、まず概要を理解するところから始めます。
Kubernetesとは
Kubernetesとは、コンテナ化されたアプリケーションのデプロイ、スケーリングなどの管理を自動化するためのプラットフォームです。
コンテナオーケストレーションエンジンともいうそうです。
ここ数年でDockerなどのコンテナ利用が増えていますが、それを一元管理することができませんでした。
そのため、コンテナを使った一定規模以上のシステム構築では、コンテナオーケストレーションエンジンを使うのが一般的のようです。
これからのシステム構築、運用ではKubernetesは必須になってくるような雰囲気を感じます。
コンテナ構築、運用の問題点
コンテナを使ったシステム構築、運用ではKubernetesを使うとのことでした。
では、使わなかった場合どのような問題が発生するのか列挙してみます。
- コンテナのスケジューリング
- ローリングアップデート
- スケーリング/オートスケーリング
- コンテナの死活監視
- 障害時のセルフヒーリング
- サービスディスカバリ
- ロードバランシング
- データの管理
- ログの管理
- Infrastructure as Code
- その他エコシステムとの連携や拡張
ここらへんの管理の仕組みをゼロから作らないといけないんですね。
そう考えると、Kubernetesを利用して自動化してもらったほうがいいなあ。
頑張って勉強しよう。
Kubernetesでできること
それでは、Kubernetesでできることを見ていきましょう。
- コードによる管理
- スケーリング/オートスケーリング
- スケジューリング
- リソース管理
- セルフヒーリング
- サービスディスカバリとロードバランシング
- データの管理
コードによる管理
Kubernetesは、YAMLやJSONで記述した宣言的なコード(マニフェスト)によって、デプロイするコンテナや周辺リソースを管理できます。Infrastructure as Codeですね。
コードによってシステムの構築や管理を自動化していくのは、今後増えていくんでしょうね。
スケーリング/オートスケーリング
Kubernetesは、コンテナクラスタ(Kubernetesクラスタ)を形成して、複数のKubernetes Nodeを管理します。
コンテナイメージをもとにKubernetes上にコンテナをデプロイする際には、同じコンテナイメージをもとにした複数のコンテナ(レプリカ)をデプロイすることで、負荷分散や耐障害性の確保が可能です。
負荷に応じて、コンテナのレプリカ数を自動的に増減(オートスケーリング)することもできます。
スケジューリング
コンテナをKubernetes Nodeにデプロイする際には、どのKubernetes Nodeに配置するかを決定する「スケジューリング」というステップがあります。
コンテナ化されたアプリケーションのワークロードの特徴や、Kubernetes Nodeの性能差を意識してスケジューリングを行うことができます。
たとえば、「機械学習する」コンテナを「GPUあり」のKubernetes Nodeに配置する、の制御ができるってことですね。
リソース管理
コンテナ配置のための特別な指定がない場合には、Kubernetes NodeのCPUやメモリの空きリソースの状況に従ってスケジューリングが行われます。
そのため、ユーザはどのKubernetes Nodeにコンテナを配置するのかを管理する必要はありません。
セルフヒーリング
耐障害性の機能です。
Kubernetesはコンテナのプロセス監視を行っており、プロセスの停止を検知すると、再度コンテナのスケジューリングを実行することで自動的にコンテナを再デプロイします。
クラスタのノード障害が起きたり、ノード退避を行ったりして、そのノード上のコンテナが失割れた場合でも、サービスに影響なくアプリケーションを自動復旧できるように作られています。
サービスディスカバリとロードバランシング
コンテナをスケーリングさせた場合、アプリケーションへのエンドポイントの問題が発生します。
Kubernetesはロードバランシング機能(Service)があり、あらかじめ指定した条件に合致するコンテナ群に対して、ルーティングを行います。
コンテナのスケール時のServiceへの自動追加や削除、コンテナの障害児にServiceからの切り離しやコンテナのローリングアップデート時に事前の切り離しなども自動的にやってくれます。
データの管理
Kubernetesは、バックエンドのデータストアにetcdを採用しています。
etcdはクラスタを組むことで冗長化ができるため、コンテナやServiceに関するマニフェストも冗長化されて保存されています。
また、Kubernetesにはコンテナが利用する設置ファイルや、認証情報などのデータを保存する仕組みも用意されています。
そのため、コンテナで共通の設定やアプリケーションから利用されるデータベースのパスワードなどの情報を、安全かつ冗長化された状態でKubernetes上に集中管理できます。
まとめ
文章をダダっと書きました。
まだ、ふーんって感じですが、これから実際に手を動かして感覚を掴んでいこうと思います。