Skip to content

Deployment

deployment

Deploymentとは

デプロイのためのObjectsです。
ReplicaSetの世代管理を司ります。

一旦、ここまでの登場人物たちをまとめてみましょう。

  • Pod
    • 1つ以上のコンテナを実行する環境
  • ReplicaSet
    • Podを指定した台数分維持する
  • Deployment
    • ReplicaSetの世代管理

実際に動かしてみる

ここでは nginx:1.16 イメージを起動し、 nginx:1.17 へアップデートを行ってみましょう

Deploymentでコンテナを動かす

まずはDeploymentを作成します。

$ kubectl create deployment mynginx --image nginx:1.16
deployment.apps/mynginx created

作成されたObjectsを見てみましょう。

$ kubectl get deployment,replicaset,pod
NAME                            DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/mynginx   1         1         1            1           37s

NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.extensions/mynginx-5559c9b58   1         1         1       38s

NAME                          READY   STATUS    RESTARTS   AGE
pod/mynginx-5559c9b58-rzrcc   1/1     Running   0          38s

現在は以下の図のような状態になっています。
DeploymentがReplicaSetを管理し、ReplicaSetがPodを管理しています。

deployment-1

バージョンアップ

deployment versionup

ここでは nginx:1.16 イメージを起動し、 nginx:1.17 へアップデートを行ってみましょう

まず、現在のdeploymentのイメージが nginx:1.16 であることを確認します。

$ kubectl get deploy mynginx -o yaml | grep "image:"
      - image: nginx:1.16

確認したDeploymentのイメージを kubectl set コマンドを使用して nginx:1.17 へ変更します

$ kubectl set image deploy mynginx nginx=nginx:1.17
deployment.extensions/mynginx image updated

Podが代替わりしたことと、Deploymentが指定しているイメージを確認しましょう。

$ kubectl get pods
NAME                       READY   STATUS        RESTARTS   AGE
mynginx-5559c9b58-rzrcc    1/1     Terminating   0          18m
mynginx-84fc57c5f9-6mst8   1/1     Running       0          5s
$ kubectl get deploy mynginx -o yaml | grep "image:"
      - image: nginx:1.17

ロールバックする

DeploymentはReplicaSetの世代管理を行っています。
先程 kubectl set で行った更新も1世代として記録されています。確認してみましょう。

$ kubectl rollout history deploy mynginx
deployment.extensions/mynginx
REVISION  CHANGE-CAUSE
1         <none>
2         <none>

2世代存在することが確認できました。
1世代目は kubectl run で新規作成した際に、2世代目は kubectl set でイメージを更新した際のものです。

それぞれのの世代の詳細は以下のように --revision オプションを使うことで確認できます。

$ kubectl rollout history deploy mynginx --revision 1
deployment.extensions/mynginx with revision #1
Pod Template:
  Labels:       app=mynginx
        pod-template-hash=5559c9b58
  Containers:
   nginx:
    Image:      nginx:1.16
    Port:       <none>
    Host Port:  <none>
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>
$ kubectl rollout history deploy mynginx --revision 2
deployment.extensions/mynginx with revision #2
Pod Template:
  Labels:       app=mynginx
        pod-template-hash=84fc57c5f9
  Containers:
   nginx:
    Image:      nginx:1.17
    Port:       <none>
    Host Port:  <none>
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

では、第一世代( nginx:1.17 )から第二世代( nginx:1.16 )へロールバックを行ってみましょう。
kubectl rollout undo コマンドを使用して第一世代へ戻ってみます。

$ kubectl rollout undo deploy mynginx --to-revision 1
deployment.extensions/mynginx

deploymentの状態を確認すると nginx:1.16 になっていますね。

$ kubectl get deploy mynginx -o yaml | grep "image:"
      - image: nginx:1.16

kubectl rollout history を確認すると第一世代が消えて第三世代になっています。

$ kubectl rollout history deploy mynginx
deployment.extensions/mynginx
REVISION  CHANGE-CAUSE
2         <none>
3         <none>

第一世代と同じく nginx:1.16 が使用されていることが確認できます。

$ kubectl rollout history deploy mynginx --revision 3
deployment.extensions/mynginx with revision #3
Pod Template:
  Labels:       app=mynginx
        pod-template-hash=5559c9b58
  Containers:
   nginx:
    Image:      nginx:1.16
    Port:       <none>
    Host Port:  <none>
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

お片付け

$ kubectl delete deployment mynginx

参照