2018年9月3日月曜日

Kubernetes のローリングアップデートを試してみる

概要

k8s のローリングアップデート (rollout) は Deployment と ReplicaSet を使うことで実現できます
今回はローリングアップデート/ロールバックを試してみました
なお、環境は minikube を使っています

環境

  • macOS 10.13.6
  • minikube v0.28.2
  • kubectl 1.11.2

Deployment 作成

  • vim echoserver.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-echo
spec:
  selector:
    matchLabels:
      run: my-echo
  replicas: 1
  template:
    metadata:
      labels:
        run: my-echo
    spec:
      containers:
        - name: my-echo-c
          image: k8s.gcr.io/echoserver:1.3
          ports:
            - containerPort: 8080
  • kubectl create -f echoserver.yaml --record

--record を付与することで rollout の一覧を確認したときに実行時のコマンドを残すことができます (後述)

Service 作成

  • vim echoserver_svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-echo
spec:
  type: NodePort
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    run: my-echo

アクセスしやすいように Service を作成しておきます

  • kubectl get svc my-echo
NAME      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
my-echo   NodePort   10.97.177.175   <none>        8080:30390/TCP   1m

minikube の IP の 30390 にアクセスすることでアプリにコンテナにアクセスできます

コンテナ確認

  • curl -s $(minikube ip):30390 | grep 'server_version'
server_version=nginx: 1.9.11 - lua: 10001

nginx のバージョンが 1.9.11 になっています

ローリングアップデート

先程の Deployment のファイルを新たに作成します
内容はほぼ同じで今回は image の部分を更新しています

  • vim echoserver.yaml.1.4
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-echo
spec:
  selector:
    matchLabels:
      run: my-echo
  replicas: 1
  template:
    metadata:
      labels:
        run: my-echo
    spec:
      containers:
        - name: my-echo-c
          image: k8s.gcr.io/echoserver:1.4
          ports:
            - containerPort: 8080
  • kubectl apply -f echoserver.yaml.1.4 --record

create ではなく apply を使います

コンテナ確認

しばらくすると新たにコンテナが作成されます
Pods の状態を見てるとわかりますが、古いコンテナが削除されて新しいコンテナが起動するのが確認できると思います

  • curl -s $(minikube ip):30390 | grep 'server_version'
server_version=nginx: 1.10.0 - lua: 10001

同じエンドポイントにアクセスしていますが先程のバージョンとは違うバージョンになっていることがわかります

ロールバック

やっぱり元に戻したい場合に行います

  • kubectl get rs
NAME                 DESIRED   CURRENT   READY     AGE
my-echo-5bd677d688   1         1         1         54s
my-echo-7f5b5f6bf    0         0         0         3m

k8s はコンテナのデプロイ履歴を ReplicaSet として保存しています
数字が 0 になっていない方が現在デプロイされている ReplicaSet になります

  • kubectl rollout history deployment my-echo
deployments "my-echo"
REVISION  CHANGE-CAUSE
1         kubectl create --filename=echoserver.yaml --record=true
2         kubectl apply --filename=echoserver.yaml.1.4 --record=true

rollout コマンドを使うことでその履歴を確認することができます
リビジョン番号が大きいほうが新しいバージョンになります
今回は 1 番に戻したいので以下のコマンドを使います

  • kubectl rollout undo deployment my-echo --to-revision=1

要するにリビジョン 1 番のときに実行したコマンドの状態に戻すということをしています

コンテナ確認

  • curl -s $(minikube ip):30390 | grep 'server_version'
server_version=nginx: 1.9.11 - lua: 10001

という感じでまた元のバージョンに戻っていることが確認できると思います
リビジョンもまた新しい番号が振られています

  • kubectl rollout history deployment my-echo
deployments "my-echo"
REVISION  CHANGE-CAUSE
2         kubectl apply --filename=echoserver.yaml.1.4 --record=true
3         kubectl create --filename=echoserver.yaml --record=true

最後に

k8s でローリングアップデートとロールバックを試してみました
アップデートは Deployment を更新することで自動的にコンテナの再作成を行ってくれます
ロールバックは ReplicaSet の履歴管理を使うことで実現します
履歴に振られているリビジョン番号を指定することで戻りたい状態に簡単に戻すことができます

なお今回試したローリングアップデータは k8s で言うところの rollout になります
同じような機能で rolling-update というコマンドがありますが、それは現在だと非推奨になっています
rolling-update は Replication Controller に対して実行できるアップデート機能で rollout は Deployments に対して行えるアップデート機能です

参考サイト

0 件のコメント:

コメントを投稿