はじめに
オーケストレーションツールであるkubernetes(クーべネティス)を勉強しようとしても、聞きなれない単語のオンパレードで、覚えることが多すぎて面喰らってしまう。
とにかく登場人物が多い。マンガのワンピース並みに登場人物が多く、パッと見ただけではよくわからない。ドラゴンボール世代には辛い。
一個一個整理したい。
特徴
様々なアプリケーション、ミドルウェア、ストレージなどで構成されているシステムを構築、設定、運用するのに必要な自動化を行ってくれる。
kubernetesが自動スケールや死活監視も行う。
数あるオーケストレーションツールの中でもkubernetesの場合はコンテナに特化している。
コンテナ同士の関係性の明示的な記述し、サービスディスカバリを容易に行う事ができる。
コンテナがいつどこで実行されるのか、コンテナ同士の関係性に基づいた形でのスケジューリングの管理できる。
Terraformなどのプロビジョニングツールの場合は各環境に合わせた書き方をする必要がある。
kubernetesの場合は、環境の近いを吸収してくれる。
オーケストレーションというのは複雑なものだが、
kubernetesの場合はその複雑さを抽象化、簡素化するためにkubernetesの「用語」を生み出した。(用語というか、登場人物というべきか)
kubernetesが難しいと言われている点はまさにこれ。
しかし、一度「用語」を理解してしまえば、グッと理解しやすくなる。
Node
VMや物理サーバを指す。サーバのIPが付与される。
Cluster
Nodeの集合体。
kubernetesのデーモンはClusterやコンテナの実行状況の管理、
kubernetesが実行されている環境の橋渡しをする。
Pod
ユーザーから見ると、Podが1つのVM。コンテナはそこで動いているプロセスに近い。
Podはkubernetesのデプロイの最小単位。
Podは1つ以上のClusterの集合体。Node常に展開される。
Pod内で指定されたコンテナ群はすべて同時にデプロイされる。
Pod内部のコンテナはIPやポートを共有。
そのため、同じポートにバインドするコンテナを同じPodに複数載せることはできない。
また、Podは自らの情報以外を管理できない。複数のPodを制御するには、それ用のリソースが必要。
コントローラーという機能がこれを解決する。
Label
登録された定義に基づき、自動的に初期化、デプロイされる。
一般的にランダムな名前が自動的に割り与えられる。
リソースに付与する任意の文字列。タグに近い。Labelには名前と、値がある。
何らかの作業を行う際、特定の名前と値を指定すれば該当するLabelを持つすべてのリソースに対して一括で操作することができる。
Service
複数のPodで構成された集合体。serviceがお互いを見つける仕組み。
kubernetesでserviceを作成すると、
kubernetesが管理しているDNSサーバに必要なレコードが作成される。
ここで作った名前がPod間で使われる。
いくつかServiceの種類があるので紹介
名前 | 概要 |
---|---|
ClusterIP | クラスタ内で有効なDNSやVIPで複数のPodと紐付ける |
NodePort | ClusterIP Serviceを作成。Node上の静的なポート番号で公開 |
LoadBalancer | NodePort Serviceを作成。ロードバランサを作成して紐付ける。 |
ExternalName | 外部サービスを利用したい時に、DNSのCNAMEを利用。クラスタの内部向けにエイリアスを作成 |
Headless | StatefulSetを利用する際に使う。 |
基本的にkubernetes内部のアクセスを処理する時に使う。
Ingress
Podへのアクセスをhttpプロキシする。
Serviceに紐付き、通信内容をServiceにプロキシする。
Volume
データの格納領域を指す。外部ストレージをVolumeとしてコンテナにマウントできる。
Nodeに領域を確保する場合はemptyDir Volumeを使う。
Podのコンテナは同じNode上に展開される。Volumeに書いたデータはPod間で共有できる。
ただし、Podを削除するとemptyDirは削除される。
これを回避するためにNFSやcloud storage(PersistentVolume)
)を使うことも可能。
ConfigMap/Secret
イメージそのものにアプリケーションの設定を書き込むと、
設定変更の度に新しいイメージを作成しなければならない。
それを回避すべく、各種設定とコンテナに展開されるプログラムは切り離してデプロイでいるようにする。
kubernetesではConfigMap/Secretを利用する。
名前 | 概要 |
---|---|
ConfigMap | 平文の設定ファイル |
Secret | エンコードされている。ただし、kubernetesにアクセス可能なユーザなら中身が見えてしまう。※セキュアな情報を入れれる場合はRBACを使う |
水平スケーリングデプロイ
特徴として各Podがステート(状態)を意識しない。
完全なクローンで構成されている
ReplicaSet
Podのスケール制御するのに使う。
templateという項目に定義されたPodの定義から、
replicasという項目で指定された個数分だけPodを作成、起動する。
(まだまだ登場人物がいるので、後ほど編集予定)