がじぇったー

お金と家電とプログラミングのブログ

KubernetesのControllerについて(Replication Controller,ReplicaSet,Deployment Controller)

こんにちわ

がじぇったー (@hackmylife7) | Twitter


です。


KubernetesのControllerの機能について学んでいきます。

f:id:gadgeterkun:20190723224336j:plain



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)

Kubernetes完全ガイド (impress top gear)


Kubernetesの他の記事へは下記の一覧から飛べるようにしているので参照ください。

gadgeterkun.hatenablog.com