#はじめに
本記事は 抽象度の高い Kubernetes のアーキテクチャを言語化し理解する目的で作成しました。
#1.概要
Kubernetes はコンテナ( Docker )のデプロイやスケジューリングを自動化するためにグーグルが作成した オーケストレーションエンジン
-
オーケストレーションエンジンとは…
アプリやコンテナを複数のサーバマシンに配置してシステムを自動化する仕組み -
Kubernetesとは…
Docker や containerd などコンテナランタイムのオーケストレーションエンジンのデファクトスタンダードと言われ、次世代の Linux になるといわれている技術
Kubernetes のリソースは
ホストとなるサーバマシンや仮想マシンのことを Node
複数のコンテナを Pod として管理する
イメージ図
###1-1. Kubernetes の機能
Kubernetes を使用することで以下のような機能が使用できる。
- Infrastructure as Code(IaC)
- コンテナのデプロイ、スケジューリング
- コンテナの死活管理
- 障害時の自動復旧
- 複数サーバー(Node)でのコンテナ管理
- コンテナの負荷分散
- 負荷によってコンテナの数を調節するオートスケーリング
- コンテナのリソース管理
…etc
特に重要なのが 宣言的設定(IaC)
Kubernetes における宣言的設定とは、 YAML 形式や JSON 形式で記述したコードによって「システムのあるべき姿」を定義するもの。
これによって、通常障害が起きると運用担当のエンジニアが手動で復旧作業を行い復旧するが、Kubernetes では IaC によって例えば Pod を常に 3 つ起動させておきたいといった場合には「ReplicaSet」 を使用することである 1 つの Pod が障害でダウンして 2 つになった際も自動的に Pod が作成され 3 つになるように自動復旧する。
■参考資料
障害時の動作について以下のブログを参考にさせていただきました。
1-2. Kubernetes 採用時の注意点
完璧に見える Kubernetes さんだが注意すべきポイントが 4 点ある。
- Kubernetes そのものが非常に複雑
- Kubernetes の更新サイクルが早い
- Kubernetes を運用するために周辺サービスが必要となる場合が多い
- 大規模でなければコンテナ(Docker)を採用するだけでも十分
#2. Kubernetes のアーキテクチャ
Kubernetes は Master Node (別名:コントロールプレーン)と Worker Node の 2 種類あり
kube-apiserver を中心とした分散システムとなっている。
2-1 Master Node
クラスタの制御を受け持つ。 スケジューリングやイベントの検知や対応など、クラスタの全体に関わる決定を行い、クラスタ内のどのノードでも実行可能。
-
api (kube-apiserver)
Kubernetes API を提供するフロントエンドのコンポーネント。
ユーザから発行される kubectl コマンドを api に送ることでリソースの作成や削除ができる。その情報は etcd に登録される。 -
etcd
全てのクラスタデータ保存用のデータベース。
Key-ValueStore (KVS) 形式で保存される。 -
c-m (kube-controller-maneger)
様々なコントローラを実行するコンポーネント。
Deployment コントローラや ReplicaSet コントローラはリソースの状態によって ReplicaSet や Pod の作成を行う。 -
sched (kube-scheduler)
未割当状態の Pod をどのノードに配置されるかを決定する。
デプロイは kubelet が行う。
2-2 Worker Node
ノードで実行され、実行中のポッドを維持しコンテナランタイムを提供する。
- kubelet
Node 上で動作をするコンポーネント。
コンテナランタイムと連携してコンテナのデプロイや停止などを行う。
- kube-proxy
Kubernetes クラスタ内の各ノードで実行されるプロセス
クラスタ内外のネットワーク通信を提供する。
最後に
参考資料を元に自分の言葉で言語化することで Kubernetes のアーキテクチャをより理解できた。引き続き勉強の過程でまとめていきたいと思う。
#参考資料
Kubernetes 完全ガイド 第2版