KubernetesのControllerについて(Replication Controller,ReplicaSet,Deployment Controller)
こんにちわ
がじぇったー (@hackmylife7) | Twitter
です。
KubernetesのControllerの機能について学んでいきます。
TL;DR(要約)
- k8sの特徴としてPodが落ちても自動で立ち上がり、常に定められた数に保つ、というものがあるが、それを担うのがControllerの機能である
- 基本的にはDeployment Controllerを使い、それのサブセットとしてReplication Controller、ReplicaSetを使うのがBestPractice
Controllerとは何か?
ControllerはPodの集まりを管理し、宣言された状態に保つための機能
もしPodが落ちていたら、それを立ち上げ、宣言した状態(マニフェストファイルで定義した状態)にするのがControllerの役割である
Controllerには以下の種類があり、この記事では上の3つについて取り扱う
- Replication Controller
- ReplicaSet
- Deployment Controller
- StatefulSet
- Job
- DaemonSet
Replication Controller
Replication Controllerはマニフェストファイルで定義された数のPodを、同じくマニフェストファイルで定義されたテンプレートの内容をもとにPodを立ち上げる
手動で作られたPodと異なり、Replication Controllerにより作られたPodはStatusがfailした場合や消された場合、または何かしらが原因で終了した場合、自動的に新しいPodが立ち上げられ、置き換えられる
マニフェストファイルの例
kindでReplicationControllerを指定する
apiVersion: v1 kind: ReplicationController metadata: name: nginx spec: replicas: 3 selector: app: nginx template: metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
ReplicaSet
ReplicaSetも基本的にはReplication Controller同様、マニフェストファイルで定義されたレプリケーション数にPodの数を保つ
Replication Controller と何が違うのか?
equality-basedか、set-basedかが違う
前述の通り、Replication Controllerのマニフェストファイルはequality-based、つまりラベルappがnginxのもののみ、と対象範囲をイコールで定義しかできない。
ReplicaSetのマニフェストファイルは下記の通り、selectorでラベルtierが frontendのもの、というようにset-basedで選択できる
apiVersion: apps/v1 kind: ReplicaSet metadata: name: frontend labels: app: guestbook tier: frontend spec: # modify replicas according to your case replicas: 3 selector: matchLabels: tier: frontend template: metadata: labels: tier: frontend spec: containers: - name: php-redis image: gcr.io/google_samples/gb-frontend:v3
二つのControllerを紹介したが、推奨の構成は後述のDeployment Controllerを使い、それのサブセットとしてReplication Controller、ReplicaSetを使う
Deployment Controller
Deployment ControllerはReplicaSetを管理し、間接的にPodを管理する
Replication ControllerとReplicaSetはあくまでもPodの数を管理するのみ。DeploymentはRollout/Rollbackの機能を持つのが特徴(無停止)
※ rollout: アプリケーションの更新
※ rollback: アプリケーションを前のバージョンに戻す
例えばPodのイメージを変える場合、DeploymentはOld Replica SetとNew Replica Setを立ち上げ、徐々に中身のPodを新しいイメージに変えていく。これによりエンドユーザーにたいする影響が少ないようRolling Updateができる
例えばRolling Updateを行う際h、k8sはDeploy時に古いReplicaSetと新しいReplicaSetのグループを作り、徐々にトラフィックを新しいReplicaSetのグループに流す様な挙動をとる
また、DeploymentはHistoryも管理していて、コマンド一つで前のバージョンに戻すこともできる
マニフェストファイルの例
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
参考(Kubernetesの最強参考書)
Kubernetes完全ガイド (impress top gear)
- 作者: 青山真也
- 出版社/メーカー: インプレス
- 発売日: 2018/09/21
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
Kubernetesの他の記事へは下記の一覧から飛べるようにしているので参照ください。