V2.1.0からV2.1.0.1にマイグレーションしてみた (Kubernetes / IBM Cloud Private)

# はじめに
Kubernetes環境(IBM Cloud Private)を新しいバージョンにマイグレーションしてみたいと思います。
今回は，手順をざっと追ってみます。

適宜公式ページ([Upgrading from IBM® Cloud Private version 2.1.0 to 2.1.0.1](https://www.ibm.com/support/knowledgecenter/ja/SSBS6K_2.1.0/installing/upgrade.html)) を参照ください。

# 対象環境
- IBM Cloud Private Community Edition (開発用途無償版) : **V2.1.0**


まだICPを導入しておらず，これから新規に V2.1.0.1 をインストールする場合は，以前の [Qiita記事](https://qiita.com/capsmalt/items/d15055ab3cb423d2d7ae) を参考にバージョンを読み替えてください。

ちなみに，V2.1.0.1では EvictionPolicy の設定が不要になりました。

```text:/etc/k8s-icp/cluster/hosts
### before (as of V2.1.0)

[master]
10.132.75.83    kubelet_extra_args='["--eviction-hard=memory.available<100Mi,nodefs.available<2Gi,nodefs.inodesFree<5%", "--image-gc-high-threshold=100%", "--image-gc-low-threshold=100%"]'
...


### after (as of V2.1.0.1)

[master]
10.132.75.83
...

```

参考: [Installing IBM Cloud Private-CE](https://www.ibm.com/support/knowledgecenter/ja/SSBS6K_2.1.0/installing/install_containers_CE.html)
参考: [ICPクラスターのhostsの設定](https://www.ibm.com/support/knowledgecenter/ja/SSBS6K_2.1.0/installing/hosts.html)

# 早速マイグレーションしてみる
超シンプルな5ステップです。

1) インストールイメージを取得
2) 新しくディレクトリを作成
3) 各構成ファイルをコピー
4) config.yamlに各自の構成を追記
5) V2.1.0.1をインストール

以下，手順に進みます。
クラスターを複数ノードで構成している場合は，Bootノードで実行します。
(今回はシングル構成です)

## 1) インストールイメージを取得

`docker pull`でICPのインストールイメージ(Dockerイメージ)を取得します

```text
# docker pull ibmcom/icp-inception:2.1.0.1

# docker images

以下のようなイメージが追加されていればOK
...
ibmcom/icp-inception                          2.1.0.1             ee6cc00ff945        4 weeks ago         327MB
...

```

## 2) 新しくディレクトリを作成
以前，[V2.1.0をインストールした際](https://qiita.com/capsmalt/items/d15055ab3cb423d2d7ae) は，`/etc/k8s-icp`というディレクトリを作っていました。

今回は，V2.1.0.1用に，`/etc/k8s-icp-2.1.0.1` ディレクトリを作成します。

```text
# mkdir /opt/k8s-icp-2.1.0.1

# cd /opt/k8s-icp-2.1.0.1
```

次に，構成ファイルを抽出します。
構成ファイルを含んだclusterディレクトリが生成されます。

```text
# docker run -e LICENSE=accept -v "$(pwd)":/data ibmcom/icp-inception:2.1.0.1 cp -r cluster /data

# ls
cluster
```
## 3) 各構成ファイルをコピー
古いICPクラスターディレクトリから，2)で作ったV2.1.0.1用のディレクトリに構成ファイルをコピーします。

from: /opt/k8s-icp/cluster/cfc-certs
to: /opt/k8s-icp-2.1.0.1/cluster


```text
# cp -r /opt/k8s-icp/cluster/cfc-certs /opt/k8s-icp-2.1.0.1/cluster
# cp -r /opt/k8s-icp/cluster/cfc-keys /opt/k8s-icp-2.1.0.1/cluster
# cp -r /opt/k8s-icp/cluster/cfc-components /opt/k8s-icp-2.1.0.1/cluster
# cp /opt/k8s-icp/cluster/hosts /opt/k8s-icp-2.1.0.1/cluster
# cp /opt/k8s-icp/cluster/ssh_key /opt/k8s-icp-2.1.0.1/cluster
```

## 4) config.yamlに各自の構成を追記
UIへのアクセスIPや，バックアップバージョンなどを指定します。

```text:/opt/k8s-icp-2.1.0.1/cluster/config.yaml
default_admin_password: YOUR_PASSWORD   // <== 任意のパスワードを設定
cluster_access_ip: 10.132.75.83         // <== IBM Cloud PrivateのコンソールアクセスIP
proxy_access_ip: 10.132.75.83           // <== リクエストを受け付けるプロキシーIP
glusterfs: false                        // <== falseを指定
backup_version: 2.1.0                   // <== バックアップバージョンを追加
```

この他，クラスター構成をいじっている場合は同様に修正します。

参考: [config.yamlファイル](https://www.ibm.com/support/knowledgecenter/ja/SSBS6K_2.1.0/installing/config_yaml.html)



## 5) V2.1.0.1をインストール
新バージョンをインストールします。
以下を順に行います。

5-1) クラスターアップグレードの準備
5-2) Kubernetesをアップグレード
5-3) 管理サービスをアップグレード

### 5-1) クラスターアップグレードの準備
```text
# docker run -e LICENSE=accept --net=host --rm -t -v "$(pwd)":/installer/cluster ibmcom/icp-inception:2.1.0.1 upgrade-prepare
```

### 5-2) Kubernetesをアップグレード
```text
# docker run -e LICENSE=accept --net=host --rm -t -v "$(pwd)":/installer/cluster ibmcom/icp-inception:2.1.0.1 upgrade-k8s
```

### 5-3) 管理サービスをアップグレード
```text
# docker run -e LICENSE=accept --net=host --rm -t -v "$(pwd)":/installer/cluster ibmcom/icp-inception:2.1.0.1 upgrade-mgtsvc


以下のように，エラー無くダッシュボードURLが出力されれば完了です。
.
.
PLAY RECAP *********************************************************************
10.132.75.83               : ok=3    changed=1    unreachable=0    failed=0
localhost                  : ok=238  changed=78   unreachable=0    failed=0


POST DEPLOY MESSAGE ************************************************************

The Dashboard URL: https://10.132.75.83:8443, default username/password is xxxxx/xxxxx

Playbook run took 0 days, 0 hours, 21 minutes, 33 seconds
```

※アップグレードしている最中に，以下のように何度かリトライする場合があります。
※タイムアウトでエラー終了した場合は，再度コマンド実行してみてください。

```text
TASK [cloudant : Deleting cloudant pods] ***************************************
changed: [localhost]
FAILED - RETRYING: Waiting for cloudant to start (50 retries left).
FAILED - RETRYING: Waiting for cloudant to start (49 retries left).
FAILED - RETRYING: Waiting for cloudant to start (48 retries left).
FAILED - RETRYING: Waiting for cloudant to start (47 retries left).
FAILED - RETRYING: Waiting for cloudant to start (46 retries left).
FAILED - RETRYING: Waiting for cloudant to start (45 retries left).
```

参考: [トラブルシューティング](https://www.ibm.com/support/knowledgecenter/ja/SSBS6K_2.1.0/troubleshoot/troubleshoot.html)

# V2.1.0.1のコンソールにログイン
ブラウザで UI URLに接続 (インストール成功時に表示されたものです)
私の場合，
URL: `https://10.132.75.83:8443` です。
Username: `admin`
Password: `xxxxxx`

メニューが整理されて分かりやすくなっています。
<img width="282" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/951148b8-f229-3aa9-6e8e-b5c1252eb712.png">

namespaceでフィルターして，Workloadを閲覧できるようになっています。
<img width="460" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/929f515c-42e5-0528-60aa-e2f08a02cfd7.png">


# まとめ
今回は IBM Cloud Private をV2.1.0からV2.1.0.1にマイグレーションする手順を追ってみました。
手順はものすごく簡単でした。

V2.1.0.1では細かなユーザビリティ向上を含めて，機能追加やアップデートが行われています。
UI面で分かり易いのは，マルチテナント(例えば，組織や複数人)で利用する場合に必要となる
**ロールベースアクセス制御** の使い勝手が向上している点かと思います。
試してみたい方は，LDAPを利用してUser/Teamとnamespaceを定義することでアクセス制御を確認できます。

V2.1.0.1のアップデート(箇条書き)は[こちら](https://qiita.com/capsmalt/items/6cbbbeb7aac707d753c4)を参照ください。

マイグレーション手順は簡単ということが分かりましたが，本番システムをイメージすると，
実運用におけるマルチノード構成の場合にどうやってマイグレーションするのか？
など気になることがあると思います。

また細かな運用ノウハウについては，別途投稿しようと思います。