OpenShiftクラスターの起動停止手順

## はじめに
OpenShift（以下OCP）クラスターの起動・停止の手順はRedHat社のマニュアルサイトに記載されていますが、実機で手順を確認したところマニュアルの内容だと一部不十分な箇所があったためそれらを補足した手順を残しておきます。

:::note info
この記事を執筆した時点のOCPの最新バージョンは4.16ですが、今後リリースされるバージョンのマニュアルでは修正されているかもしれません。必ず公式のマニュアルを参照するようにしてください。
:::


## etcdのバックアップ

クラスターを停止する前にetcdのバックアップ取得が推奨されています。

マニュアル（v4.16）
https://docs.redhat.com/ja/documentation/openshift_container_platform/4.16/html/backup_and_restore/control-plane-backup-and-restore#backing-up-etcd-data_backup-etcd

### 手順

ocコマンドで OCPクラスターにcluster-adminロールを持つユーザーでログインします。

```
oc login -u <user_name> -p <password> <URL>
```

rootとしてデバッグセッションを開始します。
```
oc debug --as-root node/<マスターノード名>
```


rootディレクトリを/hostに変更します。
```
chroot /host
```

バックアップスクリプトを実行します。
```
/usr/local/bin/cluster-backup.sh /home/core/assets/backup
```

これで `/home/core/assets/backup/`ディレクトリに以下の2ファイルが作成されます。

- snapshot_\<datetimestamp>.db
- static_kuberesources_\<datetimestamp>.tar.gz

マニュアルはここで手順は終わっていますが、実際はMasterノード上に作成されたバックアップファイルを他のサーバー（bastion node等）にscp等で退避しておく必要があると思います。
多くの場合はcoreユーザーでscpすることになると思いますが、バックアップファイルはrootのみしか読み取れない状態のため、最後にパーミッションを変更しておきましょう。

```
cd /home/core/assets/backup/
chmod 644 *
```

最後にデバッグセッションを終了します。(exitは2回行う必要があります）
```
exit
exit
```

あとはbastion nodeにバックアップファイルをコピーするなどしてください。
```
cd <保管先ディレクトリ>
scp -p core@<Masterノードのホスト名>:/home/core/assets/backup/* .
```

## OCPクラスターの停止手順
停止についてはマニュアルに記載の手順で問題ありませんでした。

マニュアル（v4.16）
https://docs.redhat.com/ja/documentation/openshift_container_platform/4.16/html/backup_and_restore/graceful-shutdown_graceful-shutdown-cluster

ただ、コマンドが長いので入力ミスをしないよう事前に各コマンドをテキストファイルに書いておいてコピペするのが良さそうです。

### 手順

シャットダウン前にクラスター証明書の期限を確認します。

```
oc -n openshift-kube-apiserver-operator get secret kube-apiserver-to-kubelet-signer -o jsonpath='{.metadata.annotations.auth\.openshift\.io/certificate-not-after}'
```

上記コマンドを実行すると証明書の期限が切れる日時が表示されます。
クラスターを停止している間に期限切れになりそうな場合は停止を中止するなどします。

<br>

クラスターのすべてのノードをスケジュール対象外に設定します。
```
for node in $(oc get nodes -o jsonpath='{.items[*].metadata.name}'); do echo ${node} ; oc adm cordon ${node} ; done
```

Podを退避します。
```
for node in $(oc get nodes -l node-role.kubernetes.io/worker -o jsonpath='{.items[*].metadata.name}'); do echo ${node} ; oc adm drain ${node} --delete-emptydir-data=true --ignore-daemonsets=true --timeout=60s ; done
```

全てのノードをシャットダウンします。
なお、マニュアルによると10ノード以上の大規模クラスターでは最後の `shutdown -h 1`の数字を`10`以上に変更するよう記載がありました。
```
for node in $(oc get nodes -o jsonpath='{.items[*].metadata.name}'); do oc debug node/${node} -- chroot /host shutdown -h 1; done
```

これでOCPクラスターの停止は完了です。


## OCPクラスターの起動手順

マニュアル
https://docs.redhat.com/ja/documentation/openshift_container_platform/4.13/html/backup_and_restore/graceful-restart_graceful-restart-cluster


### 手順

全てのMaster/Workerノードを起動します。

10分ほど待ってからMasterノードのステータスを確認します。
```
oc get nodes -l node-role.kubernetes.io/master
```

Masterノードのいずれかが「Ready」でない場合はCSRの有無を確認します。
```
oc get csr
```

以下のようにCONDITIONが`Pending`のCSRがある場合は `oc adm certificate approve <CSR名>`で１つずつ承認してください。
```
NAME        AGE    REQUESTOR                                          CONDITION
csr-xxxxxx   2m5s   system:serviceaccount:・・・:node-bootstrapper      Pending
```


次にWorkerノードのステータスを確認します。
```
oc get nodes -l node-role.kubernetes.io/worker
```
Workerノードのいずれかが「Ready」出ない場合は同様にCSRを確認＆承認を行ってください。


ただ、マニュアルではこの時点で全ノードのステータスは「Ready」になっているものと記載されていますが、停止の際に全ノードをスケジュール対象外に設定しているため、実際は「Ready,<font color="Red">SchedulingDisabled</font>」となっているはずです。

そのため以下のコマンドで全ノードをスケジュール対象に戻してあげる必要があります。
これで各Podが立ち上がってくるはずです。

```
for node in $(oc get nodes -o jsonpath='{.items[*].metadata.name}'); do echo ${node} ; oc adm uncordon ${node} ; done
```


次に全てのクラスターオペレーターのAVAILABLE値が`True`になっていることを確認します。
```
oc get cluster operators
```

あとは、必要なアプリのPodが起動していることを確認すれば終了です。