よくある質問・用語集

  • もっと調べる
  • どうやって使う?

Deploymentとは

Deploymentとは、KubernetesでPodやReplicaSetを管理するためのオブジェクトです。

Kubernetesでは、Podを単独で起動することはほとんどありません。ほとんどの場合には、ReplicaSet、Job、StatefulSetなどの管理用オブジェクトを通してPodを利用します。

このうち、ReplicaSetは常駐型でステートレスなPodに対して使われる管理用オブジェクトです。Deploymentは、さらにそのReplicaSetを管理するためのオブジェクトで、Podの世代管理をする役割を持ちます。

deployment

Deploymentの作成

KubernetesでDeploymentを作成するには、YAML形式のマニフェストファイルを使います。次は、最も基本的なマニフェストの例です。

Deploymentのマニフェストの例(sample.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
    name: sample-deployment
spec:
    replicas: 3
    selector:
      matchLabels:
        app: sample-pod
    template:
      metadata:
        labels:
      app: sample-pod
      spec:
        containers:
        - name: httpd-container
          image: httpd:latest

マニフェストの定義は、ReplicaSetとほぼ同じです。spec.replicasには、作成するコンテナの数が定義されています。

Deploymentの起動と確認

Kubernetesで、Deploymentを起動するには、用意したマニフェストを使って次のようにkubectl applyコマンドを実行します。ただし、履歴管理をするために、--recordオプションを指定します。

$ kubectl apply -f sample.yaml --record ⏎
deployment.apps/sample-deployment created

Deploymentの状態は、kubectl get deploymentコマンドで確認することができます。また、次のように指定することで、同時にPodやReplicaSetの状態も確認することができます。

$ kubectl get pod,replicaset,deployment ⏎
NAME                                     READY   STATUS RESTARTS   AGE
pod/sample-deployment-7c6576986d-5blxv   1/1     Running 1          11m
pod/sample-deployment-7c6576986d-t52kr   1/1     Running 1          11m
pod/sample-deployment-7c6576986d-z4q8h   1/1     Running 1          11m

NAME                                                 DESIRED CURRENT   READY   AGE
replicaset.extensions/sample-deployment-7c6576986d   3 3         3       11m

NAME                                      READY   UP-TO-DATE AVAILABLE   AGE
deployment.extensions/sample-deployment   3/3     3 3           11m

ローリングアップデート

Deploymentは、作成したPodの仕様が変更されると、自動的にReplicaSetを再作成します。

例えば、次のようにマニフェストにポートの定義を追加します。

修正したマニフェスト(sample.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
    name: sample-deployment
spec:
    replicas: 3
    selector:
      matchLabels:
        app: sample-pod
    template:
      metadata:
        labels:
      app: sample-pod
      spec:
        containers:
        - name: httpd-container
          image: httpd:latest
          ports:     ← 追加
            - containerPort: 80

修正したマニフェストをkubectl applyで適用します。この時も--recordオプションを指定します。

$ kubectl apply -f sample.yaml --record ⏎
deployment.apps/sample-deployment configured

すぐに状態を確認すると、次のようになっています。

$ kubectl get pod,replicaset,deployment ⏎
NAME                                     READY STATUS              RESTARTS   AGE
pod/sample-deployment-5ff57589b9-87qwq   1/1 Running             0          23s
pod/sample-deployment-5ff57589b9-kvrz2   1/1 Running             0          8s
pod/sample-deployment-5ff57589b9-s5pmh   0/1 ContainerCreating   0          3s
pod/sample-deployment-7c6576986d-c5r4c   0/1 Terminating         0          2m1s
pod/sample-deployment-7c6576986d-m4npx   1/1 Running             0          2m1s

NAME                                                 DESIRED CURRENT   READY   AGE
replicaset.extensions/sample-deployment-5ff57589b9   3 3         2       23s
replicaset.extensions/sample-deployment-7c6576986d   1 1         1       2m1s

NAME                                      READY   UP-TO-DATE AVAILABLE   AGE
deployment.extensions/sample-deployment   3/3     3 3           2m1s

ReplicaSetが2つになり、Podの数も増えていることが分かります。また、AGEの欄を見ると、古いオブジェクトと新しいオブジェクトの区別ができます。そして、生成、停止が順に行われていることが分かります。

このように、Kubernetesは、新しいReplicaSetを作成し、順番にPodを起動しながら、古いコンテナのPodを停止していきます。

履歴の確認

kubectl rolloutコマンドを使うと、履歴の確認をすることができます。

$ kubectl rollout history deployment.extensions/sample-deployment
deployment.extensions/sample-deployment
REVISION  CHANGE-CAUSE
1         kubectl apply --kubeconfig=/var/snap/microk8s/671/credentials/client.config --filename=sample-deploy.yaml --record=true
2         kubectl apply --kubeconfig=/var/snap/microk8s/671/credentials/client.config --filename=sample-deploy.yaml --record=true

ロールバック

履歴を使うことで、元の状態に戻すロールバックを行うこともできます。

ロールバックは、次のようにkubectl rollout undoで行います。次のように、ロールバックするリビジョンを--to-revisonオプションで指定します。

$ kubectl rollout undo --to-revision=1 deployment.extensions/sample-deployment ⏎
deployment.extensions/sample-deployment rolled back

アップデート方法の変更

Deploymentのアップデート方法は、デフォルトでローリングアップデートになっています。ローリングアップデートには、新旧のReplicaSetを生成し、新しいPodを古いPodと順に入れ替えていきます。そのため、ダウンタイムが発生しないというメリットがある代わりに、切り替えに時間がかかるというデメリットがあります。また、一時的にReplicaSetで指定した以上のPodが生成され、多くのリソースが必要となります。

そのため、Kubernetesでは、再生成(Recreate)というアップデート方法を選択することができます。再生成では、古いReplicaSetを停止してから、新しいReplicaSetを生成します。そのため、ダウンタイムが発生しますが、切り替えが早く、余分のリソースを必要としないというメリットがあります。

再生成を選択するには、次のようにspec.strategyの項目を追加し、spec.strategy.typeにRecreateを指定します。

再生成を指定したDeploymentのマニフェストの例

apiVersion: apps/v1
kind: Deployment
metadata:
    name: sample-deployment
spec:
    strategy:       ← 追加
      type: Recreate
    replicas: 3
    selector:
      matchLabels:
        app: sample-pod
    template:
      metadata:
        labels:
      app: sample-pod
      spec:
        containers:
        - name: httpd-container
          image: httpd:latest

【カテゴリ】:システム管理  仮想化  オープンソースソフトウェア  

  • もっと調べる
  • どうやって使う?

【共催セミナー】研修管理・運用の負担を軽減 学習管理システム(LMS)紹介セミナー

日程: 5月23日(木)Webセミナー「BigBlueButton」を使用します。
内容: 社内研修の課題を解決できる学習管理システム(LMS)について紹介します。
ご興味のあるかたはぜひご参加ください。

セミナー申込

関連用語

Deploymentに関連するページ(事例など)

Deploymentとは先頭へ