Kubernetesとは

Kubernetesのまとめメモ。ほぼ本の抜粋。

Kubernetesとは

Kubernetesとは複数マシンからなる基盤上でコンテナ群を効率的に管理するためのオーケストレーションエンジンのこと。コンテナオーケストレーション。

ノードの障害時には当該ノード上のコンテナを落とし、他ノードで自動的に再稼働させるセルフヒーリング機能や、負荷条件などに応じて自動的にコンテナ数を増減させるオートスケーリング機能などが盛り込まれている。またマニフェストと呼ばれる設定ファイルによる宣言による管理スタイルも特徴の一つ。

全体像とコンポーネント

クラスタ

コンテナ群を実行するマシンの集合。ユーザーはクラスタに対して理想状態を宣言したり確認するなどの操作を行う。

ノード

各コンテナが実行されるマシンのこと。

ノードコンポーネント

ノード上のコンテナ群の実行管理やイメージの管理、通信の管理を行う。

コントロールプレーン

クラスタ全体の管理を担うコンポーネント群。基本的なコントローラーやスケジューリングを行うコンポーネントなどが含まれる。また、先述の理想状態の宣言や確認のため、クラスタ全体の管理情報を「リソース」として公開し、照会要求を受けるためのkube-apiserverと呼ばれるAPIサーバーも含まれる。

kubectl

ユーザーや各コンポーネントはAPIリソースを通じてクラスタを操作するが、そのAPI操作をわかりやすくコマンド化したもの。ユーザーはkubectlを入り口にしコントロールプレーン内のAPIサーバーに対しアクセスすることでクラスタを操作する事になる。

Pod

複数コンテナをひとまとめに扱うことができるデプロイ単位。一つのPod内のコンテナ群は同一のノード上でデプロイされ、ネットワークインターフェイスやストレージの割り当てを共有する。Kubernetesは各PodにIPを吐き出し、Pod同士はそのIPを用いて通信する事になる。またPod内のコンテナ間はlocalhostで通信が可能。

またPodにラベルを付与することにより、ノード間を超越して特定のPod群を操作することができる。

デプロイにまつわるリソース

Deployment

Pod群を一定数維持しながらクラスタ上に展開するのに有用なリソース。

セルフヒーリング

設定された数のPodが正常に稼働してない際に自動的に新たなPodを実行し復旧を試みる機能

スケーリング

マニフェストを変更してapplyすると更新してくれる。この際、Pod群を一部ずつ更新していく「ローリングアップデート」にも対応している。アップデートやロールバックに利用される。

StatefulSet

Podやコンテナは基本的にステートレスな実行単位であり、永続データは保持されず、狩猟と同時にデータは破棄される。それでは困る場合、データベースを必要とする場合のために、Kubernetesではステートフルなコンテナ実行もサポートしている。それがStatefulSetである。

Deploymentでは管理されるPodは全て画一的に扱われるが、StatefulSetでは各Podを区別して扱う。まず、各Podには一意のインデックスが付与される。スケーリングなどはインデックス順に準拠する。また、各Podにそれぞれ固有の永続的ボリュームを割り当てることも可能である。これはPresistentVolume機能が用いられる。例えばあるインデックス番号をもつPodをロールアップし、新たなPodが同一のインデックスを持つ場合、前回の実行時に割り当てられていたボリュームを格納データはそのままに引き継ぐことができる。これにより、Podは一貫したインデックスとボリュームを持つことが可能になる。

DaemonSet

各ノードにて、いわゆるデーモンのように稼働させたい用途に向けたリソース。例えばノードのログ収集やモニタリングなどノードと密接に連携するアプリケーションに用いられる。

DeploymentではPod群はノードに縛れられることなく「クラスタ内で何台」といった条件指定になるが、DaemonSetでは前述のように「各ノードで一台ずつ」などの条件指定が可能である。また、Deployment同様ローリングアップデートにも対応している。

Job

Podをジョブ的に、単発に実行するユースケースに有用。最低限成功する必要のあるPod数やタイムアウト時間などを設定するとKubernetesはそれに従いPodをデプロイして実行し、終了ステータスで成否を判断し再実行などの処理を行う。

CronJob

Jobを制御しCronフォーマットで実行開始時間や定期実行などの設定が可能になる。

サービスディスカバリ

Service

先述のように各Podには固有のIPが割り当てられるが、そのIPは頻繁に変わり得るため、それを回避するために複数Podに共通のIPアドレスを付与し、一つのサービスのようにアクセス可能にさせるリソースがService。基本的にはラベルセレクタでPodを指定しIPを割り当てていく。またServiceによりクラスタ内ではService名でアクセスすることも可能になる。

ただし、ServiceによるIPはクラスタ内からしかアクセスできず、外部からのアクセスは不可能である。外部に公開するのに有用なリソースはNodePort, LoadBalancer Service, Ingressなどが挙げられる。今回は省略。

参考