はじめに
OpenShift(以下OCP)クラスターの起動・停止の手順はRedHat社のマニュアルサイトに記載されていますが、実機で手順を確認したところマニュアルの内容だと一部不十分な箇所があったためそれらを補足した手順を残しておきます。
この記事を執筆した時点のOCPの最新バージョンは4.16ですが、今後リリースされるバージョンのマニュアルでは修正されているかもしれません。必ず公式のマニュアルを参照するようにしてください。
etcdのバックアップ
クラスターを停止する前に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クラスターの停止手順
停止についてはマニュアルに記載の手順で問題ありませんでした。
ただ、コマンドが長いので入力ミスをしないよう事前に各コマンドをテキストファイルに書いておいてコピペするのが良さそうです。
手順
シャットダウン前にクラスター証明書の期限を確認します。
oc -n openshift-kube-apiserver-operator get secret kube-apiserver-to-kubelet-signer -o jsonpath='{.metadata.annotations.auth\.openshift\.io/certificate-not-after}'
上記コマンドを実行すると証明書の期限が切れる日時が表示されます。
クラスターを停止している間に期限切れになりそうな場合は停止を中止するなどします。
クラスターのすべてのノードをスケジュール対象外に設定します。
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クラスターの起動手順
手順
全ての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名>
で1つずつ承認してください。
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,SchedulingDisabled」となっているはずです。
そのため以下のコマンドで全ノードをスケジュール対象に戻してあげる必要があります。
これで各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が起動していることを確認すれば終了です。