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