この記事は 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
には以下のものが指定できる。
In
NotIn
Exists
DoesNotExists
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で抑えるべきフィールドは以下の物がある。
minReadySeconds
paused
progressDeadlineSeconds
revisionHistoryLimit
strategy
その他に
replicas
selector
template
があるが、これらのフィールドは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について見ていこう。
それでは。