はじめに
以下の記事にてKubernetesについて超入門記事を書きました。
本記事ではもう少し技術的な観点でKubernetes、通称k8sを説明します。
具体的に解説するキーワードは以下です。
- クラスタ
- マニフェスト
- マスタ
- ポッド
Kubernetesのアーキテクチャ
あえてざっくり言うならば、k8sは
- クラスタ
- マニフェスト
の二つを構成要素として捉えることができます。
クラスタとは、k8sが管理するマシンの集合です。ここでいうマシンとは、いわゆる一意のホスト名を持つサーバです。
マニフェストとは、クラスタの状態を指定する定義ファイルです。
それぞれの詳細を見ていきます。
クラスタとは?
上の図にもある通り、クラスタとはマシンの集合です。このマシンは物理サーバでも仮想マシンでも構いません。
このマシンはk8sの世界では役割によって二つに分類できます。
ノードとマスタです。
一言でいえば、クラスタ全体の管理を担うマシンがマスタで、それ以外のdocker等が起動しているマシンがノードです。ちなみにこれらは役割なので、マスタ上でdockerを動かしてノードとして捉えることももちろん可能です。
ノードはdockerが起動しているマシンなのでイメージがつくかと思いますが、マスタはk8sで登場する概念なので少し補足します。
マスタはクラスタを管理するための情報を外部に公開します。そして、ユーザはマスタに対して操作コマンドを投入してクラスタ構成を変更できます。その操作コマンドがよく見るkubectlです。
例えば、コンテナを作成するコマンドであるkubectl create
でマスタに対して投入すればどこかのノードで一台コンテナが立ち上がります。が、マニフェストにその情報を記載してマスタに適用することで同様の操作が可能です。
マニフェストとは?
マニフェストはYAMLやJSONでクラスタの状態を記載したテキストファイルです。こちらの情報を元にk8sはコンテナの状態を管理するので、Chefでいうreceipeに当たります。
一例に公式ページに掲載されているサンプルのyamlファイルは以下です。
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 2 # tells deployment to run 2 pods matching the template template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
このファイルをkubectl apply
でマスタに適用することでnginxが起動されます。
そんな上記ファイルの中に「pod」という文言がありますが、Podとはコンテナの集合です。
この集合で何が管理されているのかと言えば、同一のPodに属するコンテナは同一のマシンに起動し、ネットワークインターフェースやストレージ割り当てを共有します。
このような仕組みにより、各コンテナを最小にしながら、関わりが深い機能を持つコンテナをグループで管理することが可能になります。ちなみに、k8sではPodを最小単位として扱いますが1コンテナ1Podという紐づけも可能です。
終わりに
上記の用語をまとめると以下の図になります。
つまり、マニフェストをマスタに反映することで各ノードにPodが展開されることでサービスが提供されます。k8sとは、簡単に言えばPodを適切に管理するツールとも言えます。
このPodを取り巻く用語にはまた色々あるのですが、それについては別記事で触れたいと思います。
以上、k8sのアーキテクチャ入門記事でした。