【Kubernetes】とりあえず動かしてみるDeploymentとReplicaSetとPod
はじめに
Kubernetesでは覚えることがたくさんありますが、今回は基本的なKubernetesオブジェクトであるDeployment/ReplicaSet/Podを動かしながらざっくり解説したいと思います。
DeploymentとReplicaSetとPod
Pod
:1つ以上のコンテナからなる集合体(Kubernetes上でコンテナを管理する最小単位)ReplicaSet
:同じ仕様のPodを期待する数に維持するオブジェクトDeployment
:ReplicaSetを管理するオブジェクト(アプリケーションデプロイの基本単位)
それぞれの関係を図で表すと以下のようになります。
マニフェストとは
Kubernetesでは、オブジェクトの望ましい状態をYAML形式の「マニフェスト」で定義します。
以下のような形式で書くことができます。
1apiVersion: v1 # Kubernetes APIのバージョン
2kind: Pod # 対象オブジェクト
3metadata: # メタデータ
4 name: myapp
5 labels:
6 name: myapp
7spec: # オブジェクトの定義
8 containers:
9 - name: web-container
10 image: nginx
11 ports:
12 - containerPort: 80
Podを動かす
ここからそれぞれのオブジェクトのマニフェストを定義して、実際に動かしてみます。
以下のpod.yml
のようなnginxコンテナを含むPodをマニフェストで定義します。
1apiVersion: v1
2kind: Pod
3metadata:
4 name: myapp
5 labels:
6 name: myapp
7spec:
8 containers:
9 - name: web-container
10 image: nginx
11 ports:
12 - containerPort: 80
このマニフェストを反映するにはkubectl apply -f
を利用します。
1❯ kubectl apply -f pod.yml
2pod/myapp created
確認するとPodが1つ稼働しているのがわかります。
1❯ kubectl get pod
2NAME READY STATUS RESTARTS AGE
3myapp 1/1 Running 0 6s
削除する場合は以下で削除します。
1❯ kubectl delete pod myapp
ReplicaSetを動かす
次にReplicaSetを作成してみます。ここではReplicaSetを作成してみますが、実際には単体で利用するケースは少なく、Deploymentなどから呼び出されることが多いです。
以下のようなレプリカ数が3のReplicaSetをreplicaset.yml
で定義します。レプリカ数が3ですので、3つのPodが常に稼働しているようになります。
1apiVersion: apps/v1
2kind: ReplicaSet
3metadata:
4 name: myapp
5spec:
6 replicas: 3
7 selector:
8 matchLabels:
9 app: myapp
10 template:
11 metadata:
12 labels:
13 app: myapp
14 spec:
15 containers:
16 - name: web-container
17 image: nginx
18 ports:
19 - containerPort: 80
マニフェストを反映してみます。
1❯ kubectl apply -f replicaset.yml
2replicaset.apps/myapp created
確認するとReplicaSetが作成されており、Podも3つ稼働していることがわかります。
1❯ kubectl get rs
2NAME DESIRED CURRENT READY AGE
3myapp 3 3 2 7s
4
5❯ kubectl get pod
6NAME READY STATUS RESTARTS AGE
7myapp-8t5zn 1/1 Running 0 10s
8myapp-sbbdf 1/1 Running 0 10s
9myapp-xdkd5 1/1 Running 0 10s
試しに1つのPodを削除してみると、削除されたものとは名前の異なるPodが起動し、3つのPodが稼働している状態が維持されているのがわかります。
1❯ kubectl delete pod myapp-sbbdf
2pod "myapp-sbbdf" deleted
3
4❯ kubectl get pod
5NAME READY STATUS RESTARTS AGE
6myapp-4xq2f 1/1 Running 0 5s
7myapp-8t5zn 1/1 Running 0 42s
8myapp-xdkd5 1/1 Running 0 42s
削除する場合は以下で削除します。
1❯ kubectl delete rs myapp
Deploymentを動かす
最後にDeploymentを作成してみます。
作成するDeploymentのマニフェストは以下になります。内容としてはReplicaSetで作成したものとほとんど変わりませんが、ReplicaSetを管理するオブジェクトとしてDeploymentが作成されます。
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: myapp
5spec:
6 replicas: 3
7 selector:
8 matchLabels:
9 app: myapp
10 template:
11 metadata:
12 labels:
13 app: myapp
14 spec:
15 containers:
16 - name: web-container
17 image: nginx
18 ports:
19 - containerPort: 80
マニフェストを反映してみます。
1❯ kubectl apply -f deployment.yml
2deployment.apps/myapp created
以下のようにDeployment、ReplicaSet、3つのPodが確認できます。
1~/Documents/handson/k8s-sample/deployment-replicaset-pod
2❯ kubectl get deployment
3NAME READY UP-TO-DATE AVAILABLE AGE
4myapp 2/3 3 2 7s
5
6~/Documents/handson/k8s-sample/deployment-replicaset-pod
7❯ kubectl get replicaset
8NAME DESIRED CURRENT READY AGE
9myapp-599c74f9fd 3 3 3 15s
10
11~/Documents/handson/k8s-sample/deployment-replicaset-pod
12❯ kubectl get pod
13NAME READY STATUS RESTARTS AGE
14myapp-599c74f9fd-2b99c 1/1 Running 0 20s
15myapp-599c74f9fd-bkg9z 1/1 Running 0 20s
16myapp-599c74f9fd-sbxmt 1/1 Running 0 20s
削除する場合は以下で削除します。
1❯ kubectl delete deployment myapp
まとめ
DeploymentがReplicaSetを管理し、ReplicaSetがPodを理想の状態に維持する。
参考
- Kubernetesオブジェクトを理解する | Kubernetes
- Deployment | Kubernetes
- ReplicaSet | Kubernetes
- Podの概観 | Kubernetes