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を採用しよう!今更聞けないOSSの基本セミナー
日程: | 11月22日(金)Webセミナー「BigBlueButton」を使用します。 |
内容: | OSSを導入したいけど、どこから手をつければいいかわからない方必見! |
ご興味のあるかたはぜひご参加ください。 |
関連用語
- Kubernetesとは
- Dockerとは
- Podとは
- podmanとは
- ReplicaSetとは
- runcとは
- rktとは
- Kata Containerとは
- containerdとは
- gVisorとは
- CRI-Oとは
- Minikubeとは
- Microk8sとは
- Dockerfileとは