第1章
Dockerコンテナとは
- Dockerイメージを元に実行されるプロセスです。Dockerイメージがあれば環境の影響を受けずに様々な環境上でコンテナを起動させる
Dockerコンテナの設計
主に気をつける点
- 1コンテナにつき1プロセス
- 1つのイメージの中に複数のプロセスを立てる方法は非推奨
- Immutable Infrastructureなイメージにする
- 不変のインフラを意味し、「環境を変更する際は古い環境は廃棄して新たに作る」「一度作られた環境は変更されないことを徹底する
- 軽量なDockerイメージにする
- コンテナ実行時、ノード上に使用するDockerイメージが存在しない場合は、外部からイメージをダウンロードして取得するため軽量に保つことが大事
- 実行ユーザをroot以外にする
- コンテナ内でプロセスを起動する実行ユーザの権限を最小化にして、リスクを減らす
Docker fileの関連
(省略)
第2章
Kubernetesを使うと何ができるのか
- 複数のKubernetes Nodeの管理
- コンテナのスケジューリング
- ローリングアップデート
- スケーリング/オートスケーリング
- コンテナの死活監視
- 障害時のセルフヒーリング
- サービスディスカバリ
- ロードバランシング
- データの管理
- ワークロードの管理
- ログの管理
- Infrastructure as Code
- その他エコシステムとの連携や拡張
コンテナオーケストレーションエンジンであるKubernetesを利用することで、これらの課題は自動化可能かつシンプルなオペレーションによって解決できる
宣言的なコードによる管理
- Kubernetesは、YAML形式やJSON形式で記述した宣言的なコード(マニフェスト)によって、デプロイするコンテナや周辺リソースを管理できる
- Infrastructure as Code
スケーリング/オートスケーリング
- Kubernetesはコンテナクラスタを形成して、複数のKubernetes Nodeを管理している
- 同じコンテナイメージを元にした複数のコンテナ(レプリカ)をデプロイすることで、負荷分散や耐障害性の確保が可能
クラスタ >ノード>pod>コンテナ
スケジューリング
- コンテナをKubernetes Nodeにデプロイする際には、どのKubernetes Nodeに配置するかを決定することを「スケジューリング」という。
- AffinityとAnti-Affinity機能を使用することで、コンテナ化されたアプリケーションのワークロードの特徴や、Kubernetes Nodeの性能差を意識してスケジューリングを行うことがでる。
- 例えば、「ディスクI/Oが多い」コンテナを「ディスクがSSD」のKubernetes Nodeに配置する、といった制御が可能
- AffinityとAnti-Affinity機能を使用することで、コンテナ化されたアプリケーションのワークロードの特徴や、Kubernetes Nodeの性能差を意識してスケジューリングを行うことがでる。
リソース管理
- コンテナ配置のための特別な指定がない場合には、Kubernetes NodeのCPUやメモリの空きリソースの状況に従ってスケジューリングが行われるため、ユーザはどのKubernetes Nodeにコンテナを配置するのかを管理する必要はありません
セルフヒーリング
- 耐障害性という観点では、Kubernetesにとって重要なコンセプトの一つでもある、セルフヒーリング
- Kubernetesは標準でコンテナのプロセス監視を行っており、プロセスの停止を検知すると、再度コンテナのスケジューリングを実行することで自動的にコンテナを再デプロイされる
- クラスタのノード障害が起きたり、ノード退避を行ったりして、そのノード上のコンテナが失われた場合であっても、サービスに影響なくアプリケーションを自動復旧できるように作られている
ロードバランシングとサービスディスカバリ
- あらかじめ指定した条件に合致するコンテナ群に対してルーティングを行うエンドポイントを払い出すことができる
- コンテナのスケール時にエンドポイントとなるServiceへのコンテナの自動追加や削除はもちろん、コンテナの障害時における切り離しや、コンテナのローリングアップデート時における事前の切り離しなども自動的に実行してくれます
※一部のサービスを順次更新していく手法
- Serviceにサービスディスカバリの機能があることにより、それぞれのマイクロサービスが定義された複数のマニフェストを元に、システム全体を簡単に連携させることが可能
データの管理
- Kubernetesは、バックエンドのデータストアにetcdを採用している
- etcdはクラスタを組むことで冗長化ができるため、コンテナやServiceに関するマニフェストも冗長化されて保存されている
- コンテナが利用する設定ファイルや認証情報などのデータを保存する仕組みも用意されており、コンテナで共通の設定やアプリケーションから利用されるデータベースのパスワードなどの情報を、安全かつ冗長化された状態でKubernetes上に集中管理できる
※etcdはオープンソースとして配布されているキーバリュー・ストアであり、配布されたシステムが実行し続けるために必要不可欠な情報を保持、管理するために使用される
引用元:Kubernetes完全ガイド 第2版