【試行】k8sで「--record」付きでDeploymentを作成し、アップデート時の履歴を保持

# お題
表題の通り。

# 前提
- [GCP](https://cloud.google.com/?hl=ja)は知っている。
- k8s自体は多少触っていて「Deploymentって何？」というほどではないこと。
- [GKE](https://cloud.google.com/kubernetes-engine/?hl=ja)上にデプロイ（GKE自体は知ってなくてもOK）。

以下は済んだ上での作業。

- GCPプロジェクトの作成
- [Cloud SDK](https://cloud.google.com/sdk/docs/)のインストールと初期化・認証

# 開発環境
### # OS
```
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.2 LTS (Bionic Beaver)"
```

### # kubectl
```
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"11+", GitVersion:"v1.11.9-dispatcher", GitCommit:"e3f5193e8f1091a162af7e17a781e6a3129bcfd0", GitTreeState:"clean", BuildDate:"2019-03-28T18:13:46Z", GoVersion:"go1.10.8", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"12+", GitVersion:"v1.12.6-gke.10", GitCommit:"aaf0906400b5fc1d858ce0566a571e4f3ed06b9f", GitTreeState:"clean", BuildDate:"2019-03-30T19:30:48Z", GoVersion:"go1.10.8b4", Compiler:"gc", Platform:"linux/amd64"}
```

### # k8s
```
v1.12
```

# 実践

## k8sクラスタ作成

下記コマンドにてミニマム構成のクラスタを作っておく。

```
$ gcloud container clusters create clst-pe-01 --preemptible --machine-type=f1-micro --num-nodes=3 --disk-size=10
```

## Deployment作成

３Pod指定。
DockerHub公式よりNginxの１つ前のバージョンをイメージとして採用。

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: t04-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: s-app
  template:
    metadata:
      labels:
        app: s-app
    spec:
      containers:
        - name: nginx
          image: nginx:1.14
          ports:
            - containerPort: 80
```

## デプロイ

```
$ kubectl apply -f t04-deploy.yaml --record
deployment.apps/t04-deploy created
```

一瞬で返ってくる。

デプロイは？

```
$ kubectl get deploy
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
t04-deploy   3         3         3            3           18s
```

できてる。レプリカセットは？

```
$ kubectl get rs
NAME                    DESIRED   CURRENT   READY   AGE
t04-deploy-66fd547668   3         3         3       48s
```

できてる。Podは？

```
$ kubectl get po
NAME                          READY   STATUS    RESTARTS   AGE
t04-deploy-66fd547668-6kxrn   1/1     Running   0          62s
t04-deploy-66fd547668-jzvh6   1/1     Running   0          62s
t04-deploy-66fd547668-pkzml   1/1     Running   0          62s
```

できてる。OK。

「`--record`」を付けてみたけど、その記録はどうやって見れる？

```
$ kubectl rollout history deploy t04-deploy
deployment.extensions/t04-deploy 
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=t04-deploy.yaml --record=true
```

ふむ。

## コンテナイメージ更新

Nginxイメージを最新の「v1.15」に上げる。

```
$ kubectl set image deploy t04-deploy nginx=nginx:1.15
deployment.extensions/t04-deploy image updated
```

状況チェック。

```
$ kubectl rollout status deploy t04-deploy
deployment "t04-deploy" successfully rolled out
```

![screenshot-console.cloud.google.com-2019.04.17-08-00-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180599/6cac88cf-aba6-dba0-f1be-0c8bfd9fba42.png)

うん、1.15 に上がってる。
それにしても、変更の適用早いな。。。

## 変更履歴を確認

```
$ kubectl rollout history deploy t04-deploy
deployment.extensions/t04-deploy 
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=t04-deploy.yaml --record=true
2         kubectl apply --filename=t04-deploy.yaml --record=true
```

？
たしかに、履歴は１つ増えたけど。
この出方でいいの？
２行目には「`kubectl set image deploy t04-deploy nginx=nginx:1.15`」って出るのかと思ったけど。
ローカル環境上のYAMLファイル自体を修正していないから？

## YAML修正によりコンテナイメージ更新

apply対象のYAMLに記載のNginxバージョンを `1.15` に修正してみる。

```
$ git diff t04-deploy.yaml
diff --git a/ch05_Workloads/t04-deploy.yaml b/ch05_Workloads/t04-deploy.yaml
index ae389bd..8af87fb 100644
--- a/ch05_Workloads/t04-deploy.yaml
+++ b/ch05_Workloads/t04-deploy.yaml
@@ -14,6 +14,6 @@ spec:
     spec:
       containers:
         - name: nginx
-          image: nginx:1.14
+          image: nginx:1.15
           ports:
             - containerPort: 80
```

で、apply

```
$ kubectl apply -f t04-deploy.yaml 
deployment.apps/t04-deploy configured
```

そうすると、履歴は？

```
$ kubectl rollout history deploy t04-deploy
deployment.extensions/t04-deploy 
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=t04-deploy.yaml --record=true
2         kubectl apply --filename=t04-deploy.yaml --record=true
```

むぅ？？？
YAMLを修正する前に `kubectl set image 〜〜` でNginxのバージョンは `1.15` に上がっていて変更は無いから？
じゃあ、 `1.15-alpine` に修正するapplyをしたらどうだろう？

```
$ git diff t04-deploy.yaml
diff --git a/ch05_Workloads/t04-deploy.yaml b/ch05_Workloads/t04-deploy.yaml
index 8af87fb..9a6e719 100644
--- a/ch05_Workloads/t04-deploy.yaml
+++ b/ch05_Workloads/t04-deploy.yaml
@@ -14,6 +14,6 @@ spec:
     spec:
       containers:
         - name: nginx
-          image: nginx:1.15
+          image: nginx:1.15-alpine
           ports:
             - containerPort: 80
```

適用。

```
$ kubectl apply -f t04-deploy.yaml 
deployment.apps/t04-deploy configured
$
$ kubectl rollout status deploy t04-deploy
deployment "t04-deploy" successfully rolled out
```

すると履歴は？

```
$ kubectl rollout history deploy t04-deploy
deployment.extensions/t04-deploy 
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=t04-deploy.yaml --record=true
2         kubectl apply --filename=t04-deploy.yaml --record=true
3         <none>
```

コマンドでの変更ではないから「 `<none>` 」と出るのかな。。。

![screenshot-console.cloud.google.com-2019.04.17-08-20-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180599/5f8ee80a-286d-d088-677a-81d4d98bc8f3.png)

まあ、「`1.15-alpine`」へのバージョンの変更は適用されているのと、履歴自体が１つ増えていることはたしか。

## ロールバック

新しいバージョンに不備があって、前のバージョンに戻したい時、先の履歴を見て指定の版に戻せるらしい。
試しに一番最初の版に戻してみる。

```
$ kubectl rollout undo deploy t04-deploy --to-revision 1
deployment.extensions/t04-deploy
$
$ kubectl rollout status deploy t04-deploy
deployment "t04-deploy" successfully rolled out
```

![screenshot-console.cloud.google.com-2019.04.17-08-27-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180599/13fbb918-7853-6039-0468-b7c5a58c9762.png)

うん、戻った。
履歴はどうなった？

```
$ kubectl rollout history deploy t04-deploy
deployment.extensions/t04-deploy 
REVISION  CHANGE-CAUSE
2         kubectl apply --filename=t04-deploy.yaml --record=true
3         <none>
4         kubectl apply --filename=t04-deploy.yaml --record=true
```

なんだか不思議な履歴。
版１に戻す対応を取ることで、版１の履歴が消えて、（時系列にする都合上？）版４となった感じかな。

# まとめ
履歴が取れてロールバックも出来ることはわかった。
ただ、CI/CDと絡めた場合は、このコマンドで履歴管理するより、YAMLの修正履歴をGit等で管理して適用したい版のYAMLを都度適用するケースの方を使うのかも。