IBM Cloud Satelliteのホストバージョンアップ時の注意（現時点でコンソール・CLIは使わないでください）

# 経緯

IBM Cloud Satelliteを使うと他社クラウドやオンプレにRed Hat OpenShift on IBM Cloud（ROKS）環境を導入することができます。このクラスタはIBM CloudコンソールやCLIでも通常のROKSのように操作が可能です。

一般的にROKSではワーカーノードの更新版がリリースされたとき、コンソールやCLIでバージョンアップをすることができますが、SatelliteのROKSの場合、現時点では失敗するうえに、回復のためにノードを再作成しなければいけないことがわかってきました。下図は実際に失敗した例です。1番目のノードで失敗したので作業を止めていますが、もし2番目3番目のノードで更新をしていたら同様に失敗したはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/b5f62dd4-3127-8c7b-6cd2-160ffa3c2af0.png)

この事例の場合、異常ノードは新規スケジューリングができない状態になっていました。

```
$ oc get nodes
NAME            STATUS                     ROLES           AGE   VERSION
10.244.130.23   Ready                      master,worker   11d   v1.19.0+4c3480d
10.244.2.30     Ready,SchedulingDisabled   master,worker   11d   v1.19.0+4c3480d
10.244.66.26    Ready                      master,worker   11d   v1.19.0+4c3480d
```

一応、手動でuncordonすれば再度使えるようにはなりました。

```
$ oc adm uncordon 10.244.2.30
node/10.244.2.30 uncordoned

$ oc get nodes
NAME            STATUS   ROLES           AGE   VERSION
10.244.130.23   Ready    master,worker   11d   v1.19.0+4c3480d
10.244.2.30     Ready    master,worker   11d   v1.19.0+4c3480d
10.244.66.26    Ready    master,worker   11d   v1.19.0+4c3480d

$ oc create deployment centos8 --image=centos:8 --dry-run=client -o yaml -- tail -f /dev/null | sed -e "s/Deployment/DaemonSet/" | oc apply -f -
daemonset.apps/centos8 created

$ oc get pods -o wide
NAME            READY   STATUS    RESTARTS   AGE   IP              NODE            NOMINATED NODE   READINESS GATES
centos8-9zjmm   1/1     Running   0          24s   172.30.95.42    10.244.2.30     <none>           <none>
centos8-k92kv   1/1     Running   0          24s   172.30.155.40   10.244.66.26    <none>           <none>
centos8-pvlvh   1/1     Running   0          24s   172.30.14.51    10.244.130.23   <none>           <none>

$ oc rsh centos8-9zjmm date
Wed Oct  6 04:03:12 UTC 2021
```

ただしこの問題はIBM Cloudからも注意喚起されており、この状態になったらホストの再作成が正しい手順となります。

> https://cloud.ibm.com/docs/satellite?topic=satellite-ts-hosts-update-roks-console

# 確実なバージョンアップ方法

## ワーカーノードの場合

まず公式のドキュメントを参照ください。日本語版だと古い場合があるので必ず英語版を確認するようにしてください。

> https://cloud.ibm.com/docs/satellite?topic=satellite-hosts&locale=en#host-update-workers

まず最初に書いてありますが、CLIを使ったバージョンアップはしないでください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/394799df-5273-f88c-3ccc-aea64d8cdbe3.png)

注意深く読むと、コンソールやCLIはあくまで新バージョンが出ているかどうかの確認で使うだけです。

また、こちらにUI（コンソール）を使ったバージョンアップ方法がベータとして書かれていますが、現時点ではうまくいかない可能性が高いです（経緯で述べた事象です）。

> https://cloud.ibm.com/docs/satellite?topic=satellite-hosts&locale=en#host-update-roks-console

ではどうすればいいかというと、こちらに書かれています。要するに、新しいホストをアタッチすると新バージョンになるので、古いホストと入れ替えてください。

> https://cloud.ibm.com/docs/satellite?topic=satellite-hosts&locale=en#host-update-cli

## コントロールプレーンの場合

通常のROKSであればマスターはIBM Cloudが自動でバージョンアップしてくれましたが、SatelliteのROKSは自動ではありません。

こちらを注意深くお読みください。

> https://cloud.ibm.com/docs/satellite?topic=satellite-hosts&locale=en#host-update-location

コントールプレーンの場合もワーカーノードと同様にホストの新規アタッチと古いホストの削除です。コントールプレーンの場合は複数台を同時に作業せず、1台ずつ作業をしないとコントロールプレーンとして機能をしなくなる場合があるので注意してください。

# 考慮すべき点

## Red Hat Enterprise Linuxのサブスクリプション

Satelliteで使用するホストはRed Hat Enterprise Linuxのサブスクリプションを必要とします。AWSやAzureでSatelliteを使う場合はIaaSで払い出されたサブスクリプションが使えますが、もしオンプレミス等でサブスクリプションの数がホスト数ぎりぎりの場合、新規ホストを追加してもサブスクリプションが不足する可能性があります。その場合は旧ホストからサブスクリプションをunregisterし、新ホストでregisterしなおす必要があるかもしれません。

もしお使いのインフラストラクチャーで、OSレベルでのバックアップ・リストアができるのであれば、Satelliteにアタッチする直前の状態でバックアップを取ることをお勧めします。バージョンアップする際はそれをリストア（事前にROKSとSatelliteロケーションからは除去）し再度アタッチすることで、バージョンアップ作業が多少は楽になるかもしれません。