なぜk8sが必要か
背景
近年、コンテナ技術への注目度が高まり、プロダクションでのコンテナ利用事例も増えてきた。
Dockerはコンテナランタイム(実行環境)であり、Dockerホストを複数台協調させて動作させたり、一元的に管理することはできない。
そのため、一定以上のプロダクションにおいて必要な、複数のホストから構成されるシステムの構築が難しい。
そこで、Kubernetes(k8s)の出番。
...コンテナオーケストレーションエンジン。コンテナ化されたアプリケーションのデプロイ、スケーリング、などの管理を自動化する。
Kubernetesとは
Kubernetes(k8s)...コンテナオーケストレーションエンジン。コンテナ化されたアプリケーションのデプロイ、スケーリング、などの管理を自動化する。
コンテナオーケストレーションエンジン...k8s以外にも、Docker Swarm mode、Apache Mesosなどがある。k8sは2020年7月時点でプロダクション利用事例が最も多く、コンテナオーケストレーションにおけるデファクトスタンダードとなっている。(これは、大手クラウドプロバイダによるマネージドサービスの提供が大きな要因となっている、らしい)
コンテナ...「なんらかのアプリケーションを実行するようにビルドされたコンテナイメージを元に起動されたワークロード(仮想マシン上で実行されているソフトウェア)」
k8sでできること
- 宣言的コードによる管理(Infrastructure as Code)…宣言的なコード(マニフェストファイル)によって、デプロイするコンテナや、周辺リソースの管理が可能。
- スケーリング/オートスケーリング
- Kubernetesクラスタの形成による複数ホスト(Kubernetes Node)の管理
- 同一コンテナイメージを元にした複数コンテナ(レプリカ)のデプロイによる負荷分散や耐障害性の確保
- 負荷に応じたレプリカ数の増減
- スケジューリング…PodをどのNodeに配置するかを決定することであり、デプロイ時のステップの一つである。Affinity, Anti-Affinity機能を用いることで、スケジューリングを調整可能。アプリケーションの特徴、Nodeの性能差などを意識することができ、例えば、ディスクI/Oが多いコンテナをディスクがSSD(I/O速度が速い)のNodeに配置する」といった制御が可能になる。
- リソース管理…スケジューリングの指定がない場合、Nodeのリソース状況(メモリ、CPUの空き状況)に従ってスケジューリングが行われる。そのため、ユーザーはコンテナ配置を管理する必要がない。また、リソース使用状況によって、自動でNodeの増減を行う、クラスタオートスケール機能も存在する。
- セルフヒーリング…コンテナのプロセス監視によって、停止を検知すると、再度コンテナのスケジューリングを実行することで、自動的にコンテナを再デプロイする。これにより、サービスの自動復旧ができる。また、セルフヒーリングの実行条件を変更することも可能。(HTTP/TCPや、シェルスクリプトによるヘルスチェックの成否)
- ロードバランシングとサービスディスカバリ...
- 複数台で構成されたアプリケーションを1つのアプリケーションとしてユーザーに見せるためにはユーザーからの接続先となる、複数台を束ねたエンドポイントを用意する必要がある。(仮想マシン利用の際には、ロードバランサーを利用するのが一般的)k8sにも、同様のロードバランシング機能(Service, Ingress)があり、設定した条件に合致したコンテナ群へのルーティングを行うエンドポイントを払い出すことが可能である。さらに、k8sは、スケール時のエンドポイントとなるServiceへのコンテナの自動追加・削除、コンテナ障害時の切り離し、コンテナのローリングアップデート時の事前の切り離しなどを自動で実行してくれる。
- サービスディスカバリ(サービスのネットワーク上の位置を決定すること)は、Serviceで実現可能。マイクロサービス同士で参照する必要がある時に、簡単にシステム全体を連携することができる。
- データ管理…データストアには、冗長化できるetcd(エトセディ)を使用。コンテナ間で共通の設定や、データベースのパスワードなどの情報、を安全かつ冗長化された状態でk8s上で管理できる。(コンテナや、Serviceに関するマニフェスト、コンテナが利用する設定ファイル、認証情報を保存する仕組みがある。)
- etcd...分散型キーバリューストア。クラスタを組むことで冗長化できる、らしい。
- 外部エコシステムとの連携が盛ん...今後の章でテーマ別に紹介される、らしい。