LoginSignup
21
7

More than 3 years have passed since last update.

kubernetesでのPodアップデート戦略

Last updated at Posted at 2019-02-21

はじめに

kubernetes上でアプリなどをPodとして運用していると、
アプリ等のバージョンアップに伴いPodをアップデートする機会があります。
kubernetesでは大きく2つのPodアップデート戦略をとることができます。
kubernetes公式ドキュメントではあまり詳しく扱われていないように見えたので
備忘も兼ねて記事にします。

参考にしたもの

O'Reilly 入門 Kubernetes
https://www.oreilly.co.jp/books/9784873118406/

kuberbnetesのアップデート戦略

kuberbnetesのアップデート戦略には以下2つが存在します。

  • Recreate
  • RollingUpdate

アップデート戦略は以下の例のようにkubernetesのマニフェストにて、
Deploymentのspec.strategy.typeで定義します。

Recreateの例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14
        ports:
        - containerPort: 80

RollingUpdateの例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 50%
      maxUnavailable: 0%
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14
        ports:
        - containerPort: 80

以下では各アップデート戦略におけるPodアップデート方式を説明します。

Recreate

もっともシンプルなアップデート方式です。
現在起動しているPodを全て削除した後に最新のPodを起動します。

recreate.png

注意点としてはPod起動数がゼロになるタイミングが存在するため、
ダウンタイムが発生することです。
以下のRollingUpdateのところで触れますが、Recreate戦略はRollingUpdate戦略で
maxUnavailable=100%,maxSurge=0%とした時の動作と同じになります。

RollingUpdate

Recreateに対してRollingUpdateでは以下2つのパラメータを用いることで、
旧Podを一部起動させたまま少しずつ新Podへのアップデートを行います。

  • maxUnavailable:現在起動しているPod数に対してアップデート時にどの程度までの減少(スケールイン)を許すか

    →例えば現在2台のPodが起動しており、maxUnavailable=50%(もしくは1)を設定した場合、アップデートに伴い2台中1台のPodは利用不可となることを許可します。

  • maxSurge:アップデート時に現在起動しているPod数に対してどの程度までの増加(スケールアウト)を許すか

    →例えば現在2台のPodが起動しており、maxSurge=50%(もしくは1)を設定した場合、アップデートに伴いPod1台までのスケールアウトは許可します。つまりアップデート中は旧バージョン含め合計3台までであればPodの起動を許可することになります。

以下にmaxUnavailable=0%,maxSurge=50%の場合の例を示します。

rollingupdate_50.png

また、maxUnavailable=0%,maxSurge=100%とした場合は以下のようにBlue-Green Deploymentが実現できます。
万一新バージョンのPod起動に失敗場合でも旧バージョンでサービス提供を継続することができます。

rollingupdate_100.png

RollingUpdate戦略ではPodを停止させることなくアップデートを行うことができるため、
ダウンタイムを発生させずにPodのアップデートが可能です。
しかしながら、良くも悪くも新旧Podが同時に起動するタイミングが発生してしまいます。
クライアントとサーバサイドが密結合となっているアプリケーションの場合は注意が必要です。

例えば

 ・クライアントv1.0-サーバ1.0
 ・クライアントv2.0-サーバ2.0

という密結合があったとすると、RollingUpdateの方式では

 クライアントv2.0-サーバ1.0

となるタイミングが発生してしまいます。※ユーザに既にクライアントv2.0を配布している場合

RollingUpdate戦略を用いる場合はこの点を考慮に入れる必要があります。

備考

アップデート戦略をマニフェスト上で特に指定しなかった場合は、
RollingUpdate戦略のmaxUnavailable=25%,maxSurge=25%が適用されるようです。


宣伝

弱小Twitterやってます。良かったら少し付き合ってください。
https://twitter.com/mochizuki875

21
7
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
7