この記事は Kubernetes道場 Advent Calendar 2018 8日目の記事です。
今回はいよいよReplicaSetとDeploymentについて。
ReplicaSetについて

このリソースは直接使用することは少ないが、次に出てくるDeploymentを抑える上で理解が進むのでやっていこう。
ReplicaSetは指定された数のPodを複製し、実行してくれる。
Podの雛形(Pod Template)を定義し、Label Selectorという方法で管理対象を選択してReplicaSetに制御してもらう。
要点としては以下の3つだ。
replicas: Podの複製数selector: Label Selector。後に詳細template: Pod Templateを指定
さて、Label SelectorとPod Templateを少し掘り下げてみていこう。
Label Selector
Label Selectorは読んだとおりだが、Labelを選択するための設定を指定する。
selector というフィールドに指定をする。指定の仕方は2つある。
matchLabels
matchLabels は等価ベースの比較をする。 指定したLabelと全て一致したものが対象になる。指定方法は以下の通り。
|
|

matchExpressions
matchExpressions は operator を使って柔軟な選択ができる。 operator には以下のものが指定できる。
InNotInExistsDoesNotExists

In と NotIn
In と NotIn は key と一致するラベルの値が values に指定したリスト内に存在する、または存在しないするかを指定できる。
例は以下の通り。
|
|
Exists と DoesNotExists
Exists と DoesNotExists は key に指定したラベル存在する、または存在しないするかを指定できる。
例は以下の通り。
|
|
Pod Template
Pod TemplateはReplicaSetで複製するためのPodの雛形を指定する。指定は template フィールドに指定する。
例は以下の通り。
|
|
spec についてはPodと同様のものなので特に問題ないだろう。 metadata.labels でPodのラベルを指定する。
ここで注意が必要なのが、Label Selectorで指定したものが metadata.labels で指定したものと一致している必要がある。
一致してない場合はKubernetesから拒否され、作成できない。
ReplicaSetを作成する
さて、ReplicaSetを作成してみよう。
|
|
replicas 3にセットしておいた。上記のManifestを使って作成する。
|
|
ReplicaSetの取得は replicaset 、または省略形の rs で可能だ。
|
|
また、複製されているはずのPodも確認してみよう。
|
|
ちゃんと指定した3つのPodを作成しているのが確認できる。
ReplicaSetのreplica数を増減させる
さて、複製数が指定できるので、これを変更してPodの数を増やしてみよう。方法は2つある。
- Manifestファイルの
replicasを変更して適用 kubectl scaleコマンドを用いて変更
片方ずつ試してみよう。
replica数を増やす
replica数を増やす際はManifestを変更して行ってみよう。
|
|
先程のManifestの replicas を10に変更して適用してみよう。
|
|
Podが10個に増えたことが確認できる。
replica数を減らす
replica数を減らす際は kubectl scale コマンドを用いて行ってみよう。
--replicas オプションで複製数を指定する。
|
|
Podが1個に減ったことが確認できる。
Deploymentについて
さて、本命のDeploymentについてだ。
Deploymentは以下の機能を提供する。
- PodのRolling Update
- Rolloutの履歴を保持
- Rollback
Deploymentは実際のところPodを直接管理しているのではなく、ReplicaSetを管理する。 Deploymentを変更した際は、新しいReplicaSetを作成してPodを置き換えていく。
以下のような関係図になる。
Deploymentで抑えるべきフィールドは以下の物がある。
minReadySecondspausedprogressDeadlineSecondsrevisionHistoryLimitstrategy
その他に
replicasselectortemplate
があるが、これらのフィールドはReplicaSetと同様のものになる。
Deploymentのフィールドについて
minReadySeconds
minReadySeconds はPodが作成されてから使用可能な状態になるまでの待ち時間を指定する。デフォルトでは0秒だ。なので指定をしないと即座に使用可能な状態として扱われる。
paused
paused はDeploymentの変更をポーズさせるかを指定する。通常は指定する必要はない。
kubectl rollout pause コマンドや kubectl rollout resume コマンドでポーズや解除を行うことができる。
progressDeadlineSeconds
progressDeadlineSeconds はDeploymentの処理の最大処理時間を指定する。Deploymentの処理時間がこの時間を超えた場合、 処理を失敗させ ProgressDeadlineExceeded をstatusにセットする。
デフォルトは600秒だ。
revisionHistoryLimit
revisionHistoryLimit はリビジョンの履歴の保持する数を指定する。デフォルトは10だ。
strategy
strategy はPodを置き換える際の戦略を指定する。strategyには Recreate と RollingUpdate がある。
デフォルトは RollingUpdate だ。
RollingUpdate
strategy をRolling Updateにした際は追加で設定をすることができる。maxSurge と maxUnavailable だ。
maxSurge はRolling Update中に複製数をどの程度超えていいかを指定する。 maxUnavailable はRolling Update中に無効なPodをどの程度許容するかを指定する。
この2つのフィールドの値は絶対値かPodの数の割合をパーセンテージで指定する。デフォルトはどちらのフィールドも25%だ。
また、どちらかのフィールドを0にした場合、もう片方のフィールドは0にすることができない。
以下が指定方法の例だ。
|
|
Deploymentはこの maxSurge と maxUnavailable を元にRolling Updateを行ってくれる。
以下の設定で replicas を2に設定した際のRolling Updateは以下の画像のような手順で行われる。
|
|
Recreate
strategy をRecreateにした際は、全てのPodを削除してから新しいPod Templateを元にPodを作成する。
ついでに、Rolling UpdateでRecreateと同じ挙動にする場合、 maxSurge を0、 maxUnavailable を100%のように設定することでできる。
以下が指定方法の例だ。
|
|
Deploymentを作成する
以下のようなManifestを作成した。
|
|
さて、Manifestを適用してDeploymentを作成してみる。
|
|
Deploymentの取得は deployment か短縮形の deploy で取得できる。
|
|
対応してReplicaSetの作成やPodの作成がされていることがわかる。
また、DeploymentのRolloutは kubectl rollout history というコマンドで履歴を確認できる。
|
|
先程適用したManifestで作成されたのがRivision 1のものだ。
作成したDeploymentをPauseしてみよう。 kubectl rollout pause で可能だ。
|
|
さて、先程作成したDeploymentのイメージを nginx:alpine に変更して適用してみよう。
|
|
|
|
さて、どのようになったか確認してみる。
|
|
特に何も変更されてないことがわかる。
これは先程 kubectl rollout pause でDeploymentの処理をポーズさせているからだ。
kubectl rollout resume で再開できるので実行する。
また、この時からRolling Updateが開始される。可能な方は watch コマンドや kubectl get po -w などで確認してみよう。
|
|
さて、再度各リソースを確認してみよう。
|
|
Podが別のものに置き換わっているのがわかる。また、別のReplicaSetが作成されていることがわかる。
Rolloutの履歴を確認してみよう。
|
|
Revision 2が追加されていることがわかる。
最後にRollbackをやってみよう。Revision 1にRollbackしてみる。
kubectl rollout undo で行う。また、 --to-revision オプションでリビジョン番号を指定する。
|
|
さて、各リソースを確認してみよう。
|
|
Rollbackできている。
Rollbackを実行すると新しいReplicaSetが作成されるのではなく、過去のReplicaSetを再利用してPodを作成していることがわかる。
ついでに、 kubectl rollout history を実行した際のCHANGE-CAUSEはリソース作成・適用時に --record オプションをつけることで操作する際のコマンドを記録してくれる。
|
|
というわけで今回はかなり長くなってしまったがここまで。
次回はServiceについて見ていこう。
それでは。
