AKS上のcert-managerをv0.7.0からv0.8.0にバージョンアップする

cert-manager利用ユーザ宛てにこんなメールが届きました。（抜粋＆翻訳してます）

```
Cert-managerは、Let's Encryptのサーバーに継続的に本当に過剰なトラフィックを送信するトラフィックパターンに陥ることがあります。
これを緩和するため、2019年11月1日から、バージョン0.8.0（現在のsemverマイナーリリース）未満のcert-managerからのすべてのトラフィックのブロックを開始する予定です。
```

これはまずいということで、現在のv0.7.0からv0.8.0にバージョンアップしたので手順を残しておきます。
公式手順は以下です。Azure Kubernetes Serviceでバージョンアップしましたが、Kubernetesであれば手順は変わらないはずです。  
[Upgrading cert-manager](http://docs.cert-manager.io/en/latest/tasks/upgrading)

# 環境
* Azure Kubernetes Service
* cert-manager v0.7.0

# 事前準備
* cert-manager関連の設定をバックアップしておきます。

```
$ kubectl get -o yaml --all-namespaces issuer,clusterissuer,certificates,orders,challenges > cert-manager-backup-prod.yaml
```

* 現在の状態を確認します。v0.7.0がデプロイされています。

```
$ helm list
NAME            REVISION        UPDATED                         STATUS          CHART                   APP VERSION     NAMESPACE
cert-manager    1               Wed Jun 19 16:35:26 2019        DEPLOYED        cert-manager-v0.7.0     v0.7.0          cert-manager
```

* helmのリビジョンを確認しておきます。今回は初回にインストールしてから変更はありません。

```
$ helm history cert-manager
REVISION        UPDATED                         STATUS          CHART                   DESCRIPTION
1               Wed Jun 19 16:35:26 2019        DEPLOYED        cert-manager-v0.7.0     Install complete
```

* 実際に動作しているcert-manager Podがv0.7.0であることを確認します。

```
$ kubectl describe pod cert-manager-xxxxxxxxxx-xxxxx -n cert-manager
～～～
    Image:         quay.io/jetstack/cert-manager-controller:v0.7.0
～～～
```

# バージョンアップ
* Helm Chartをアップグレードします。

```
$ kubectl apply --validate=false -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.8/deploy/manifests/00-crds.yaml
customresourcedefinition.apiextensions.k8s.io/certificates.certmanager.k8s.io configured
customresourcedefinition.apiextensions.k8s.io/challenges.certmanager.k8s.io configured
customresourcedefinition.apiextensions.k8s.io/clusterissuers.certmanager.k8s.io configured
customresourcedefinition.apiextensions.k8s.io/issuers.certmanager.k8s.io configured
customresourcedefinition.apiextensions.k8s.io/orders.certmanager.k8s.io configured
```

* jetstack Helmリポジトリを追加します。（追加済みとなるはず）

```
$ helm repo add jetstack https://charts.jetstack.io
"jetstack" has been added to your repositories
```

* ローカルHelm Chartリポジトリキャッシュをアップデートします。

```
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "jetstack" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete.
```

* バージョンアップします。

```
$ helm upgrade --version v0.8.0 cert-manager jetstack/cert-manager
Release "cert-manager" has been upgraded.
～～～
cert-manager has been deployed successfully!
～～～
```

# 事後確認

* 現在の状態を確認します。v0.8.0に変わっています。

```
$ helm list
NAME            REVISION        UPDATED                         STATUS          CHART                   APP VERSION     NAMESPACE
cert-manager    2               Wed Oct 16 19:49:15 2019        DEPLOYED        cert-manager-v0.8.0     v0.8.0          cert-manager
```

* helmのリビジョンを確認します。REVISION #2が追加されています。

```
$ helm history cert-manager
REVISION        UPDATED                         STATUS          CHART                   DESCRIPTION
1               Wed Jun 19 16:35:26 2019        SUPERSEDED      cert-manager-v0.7.0     Install complete
2               Wed Oct 16 19:49:15 2019        DEPLOYED        cert-manager-v0.8.0     Upgrade complete
```

* 実際に動作しているcert-manager Controller Podがv0.8.0であることを確認します。

```
$ kubectl describe pod cert-manager-xxxxxxxxxx-xxxxx -n cert-manager
～～～
    Image:         quay.io/jetstack/cert-manager-controller:v0.8.0
～～～
```

# ロールバックしたい場合

* helmのリビジョンを確認します。

```
$ helm history cert-manager
REVISION        UPDATED                         STATUS          CHART                   DESCRIPTION
1               Tue Sep 24 23:08:30 2019        SUPERSEDED      cert-manager-v0.7.0     Install complete
2               Wed Oct 16 19:34:38 2019        SUPERSEDED      cert-manager-v0.8.0     Upgrade complete
```

* REVISION #1にロールバックします。

```
$ helm rollback cert-manager 1
Rollback was a success.
```

* helmのリビジョンを確認します。#3が増えて、0.7.0がデプロイされています。

```
$ helm history cert-manager
REVISION        UPDATED                         STATUS          CHART                   DESCRIPTION
1               Tue Sep 24 23:08:30 2019        SUPERSEDED      cert-manager-v0.7.0     Install complete
2               Wed Oct 16 19:34:38 2019        SUPERSEDED      cert-manager-v0.8.0     Upgrade complete
3               Wed Oct 16 19:42:03 2019        DEPLOYED        cert-manager-v0.7.0     Rollback to 1
```

* やっぱりv0.8.0に戻したい場合は、#2を指定します。

```
$ helm rollback cert-manager 2
Rollback was a success.
```

* v0.8.0になりました。

```
$ helm history cert-manager
REVISION        UPDATED                         STATUS          CHART                   DESCRIPTION
1               Tue Sep 24 23:08:30 2019        SUPERSEDED      cert-manager-v0.7.0     Install complete
2               Wed Oct 16 19:34:38 2019        SUPERSEDED      cert-manager-v0.8.0     Upgrade complete
3               Wed Oct 16 19:42:03 2019        SUPERSEDED      cert-manager-v0.7.0     Rollback to 1
4               Wed Oct 16 19:43:54 2019        DEPLOYED        cert-manager-v0.8.0     Rollback to 2
```