Kubernetesの基礎として何回かに分けて基本事項をまとめていきたいと思います。
今回はアプリケーション実行系のリソース「Pod / ReplicaSet / Deployment」についてです。
本記事は、Kubernetes公式のDeploymentをベースに書いております。
はじめに
とりあえず、下のマニフェストファイルをコピーしてdeployment.yaml
を作りましょう。解説は後ほどしていきます。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
はい、ファイルを作ったら以下のコマンドを打ってdeployment.yaml
を適用させてみましょう。
% kubectl apply -f deployment.yaml
---
deployment.apps/nginx-deployment created
次に少し経ってから以下のコマンドを打ってリソースの状態を確認しましょう。
上段、STATUSの項目がRunning
になっていたらOKです。
% kubectl get pod,replicaset,deployment
---
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-585449566-dqc9t 1/1 Running 0 100m
pod/nginx-deployment-585449566-hqjtr 1/1 Running 0 100m
pod/nginx-deployment-585449566-t87f5 1/1 Running 0 100m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-585449566 3 3 3 100m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 3/3 3 3 100m
内容を確認すると、3つ項目が出てきました。
はい、前段が長くなってしまいましたが、
今回は、この3つ(これがPod / ReplicaSet / Deployment)について説明していきたいと思います。
本題
なぜ、3つのリソースが出てきたか?
オレはdeployment
をデプロイしただけなのに、pod
もreplicaset
も・・・とリソースが3つもできたのかという話ですが、deployment
というのはreplicaset
をまとめていて、replicaset
はpod
をまとめています。
そのため、deployment
がreplicaset
を生成して、replicaset
がpod
を生成しているます。
Kubernetesでは、xxx
がyyy
を生成しているということが他のものあります(cronjob
とjob
の関係とか)。
この感覚を覚えてください。この感覚がわかってくると、マニフェストファイルが読めるようになってきます。
なんとなく区切りが見えてきて、ここからここまでreplicaset
について記載しているんだな〜ってのがわかるようになるかと思います。
表示された3つのオブジェクトについて
では、本題ですね。
次に表示されたものそれぞれに説明していきます。
- Pod
- ReplicaSet
- Deployment
とあります。
Pod
pod/nginx-deployment〜
の項目がこれに相当します。
Podとは、複数のコンテナの集合体です。と言っても、YAMLファイルにコンテナが1個だけ定義されていても1Podですし、コンテナが100個定義されていても1Podです。
Kubernetes上の最小単位です。
今回は、同じPodが3つ立ち上がっています(この話は、ReplicaSet側でします)。
また、Podとコンテナは何が違うの?と混乱しがちですが、コンテナはDockerでビルドや起動できる単位のものです。
一方、PodはYAMLファイルに複数のコンテナを定義でき、コンテナ通しでデータボリューム領域を共有できたりするので、やはり、コンテナの集合体がPodであり違うものということがわかります。
ただ、1つのPodに1つのコンテナしか定義されていないことが多いので使い分けずに会話しても通じるかなという印象です。
ReplicaSet
replicaset.apps/nginx-deployment〜
の項目がこれに相当します。
ReplicaSetとは、Podを何個複製するか?という定義になります。
今回は、3つと定義されているので「同じPodを3つ用意してくれ」という意味になります。
また、「何を」3つ?かというと、spec.selector
のラベルに定義されているapp
という値がnginx
のものを3つです。
Pod側にもtemplate.metadata
というラベルが定義されているますので、nginx
のPodが3つ生成されました。
Deployment
deployment.apps/nginx-deployment
の項目がこれに相当します。
Deploymentは、ReplicaSetを管理してます。
つまり?となりますが、Deploymentは、ReplicaSetの世代を管理していたりします。
今回のマニフェストファイルだと、RelicaSetの世代管理くらいになってしまいますが、他にも、デプロイした時にどうやってPodを置き換えるか?を指定するstrategy
や世代管理はどのくらいするか?を指定するrevisionHistoryLimit
などがあります。
最後に
以上、
Kubernetesの基本であるDeploymentをはじめとするアプリケーション実行系のリソースについて説明いたしました。
これからKubernetesについて始める人の参考になればと思います。
コメント