Deploymentとは
Deploymentとは、KubernetesでPodやReplicaSetを管理するためのオブジェクトです。
Kubernetesでは、Podを単独で起動することはほとんどありません。ほとんどの場合には、ReplicaSet、Job、StatefulSetなどの管理用オブジェクトを通してPodを利用します。
このうち、ReplicaSetは常駐型でステートレスなPodに対して使われる管理用オブジェクトです。Deploymentは、さらにそのReplicaSetを管理するためのオブジェクトで、Podの世代管理をする役割を持ちます。

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
【カテゴリ】:システム管理  仮想化  オープンソースソフトウェア  
【Webセミナー】OSSのRoundcubeで実現できる!セキュアなWebメール運用・構築セミナー
| 日程: | 11月11日(火)Webセミナー「BigBlueButton」を使用します。 |
| 内容: | 今回は、プラグインで安心安全なWebメールシステムを作成できるRoundcubeを紹介します。 |
| ご興味のあるかたはぜひご参加ください。 | |
関連用語
- Kubernetesとは
- Dockerとは
- Podとは
- podmanとは
- ReplicaSetとは
- runcとは
- rktとは
- Kata Containerとは
- containerdとは
- gVisorとは
- CRI-Oとは
- Minikubeとは
- Microk8sとは
- Dockerfileとは



