【Kubernetes】とりあえず動かしてみるDeploymentとReplicaSetとPod

はじめに

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を理想の状態に維持する。

参考

タイトルとURLをコピーしました