未解決
1 Rookie
•
63 メッセージ
1
38
コンテナ事始め(5) OpenShiftクラスタのシャットダウン方法
前回の投稿「コンテナ事始め(4) レジストリを構成する」はこちらから。
こんにちは。デル・テクノロジーズでクラウド、コンテナ関連を担当している平原です。先日、お客様からOpenShiftのシャットダウン方法について問い合わせがありました。vCenterのようにGUIからチャチャっと出来るわけではないので、Red Hat社の製品ドキュメントをベースに回答をしたのですが、実際にそれで大丈夫なのかを試してみました。
etcdのバックアップ
シャットダウンをする前にMasterノード上にあるetcdをバックアップします。etcdはOpenShift/K8sクラスタの構成情報が格納されている極めて重要なデータベースです。このデータベースが破損してしまうとOpenShiftクラスタは正常に起動できません。
- Masterノードへのアクセス
バックアップスクリプトはMasterノードの中で実行しますが、OpenShiftは標準で各ノードのOSにCore OSが使われています。CoreOSはコンテナを動かすために機能を絞ったOSです。そのため、OpenShiftではsshなどで各ノードに直接ログインして操作することはできません。このため、oc debugコマンドを使用して、debug用のPodを起動して、そこからアクセスをします。
oc get node コマンドを実行してMasterノード名を調べます
oc debug --as-root node/<Masterノード名>でdebugモードに入ります
chroot /host コマンドを実行します(プロンプトがsh-5.1#に変わります - etcdデータベースのバックアップ
/usr/local/bin下にあるcluster-backup.shスクリプトを実行します。ここでは/home/core/assets/backupにバックアップを作成します。
- このままだとetcdはOpenShiftクラスタ内部にバックアップされているだけなので、sftpなどで必要に応じて外部環境に保管しておきます。
OpenShiftクラスタのシャットダウン
- 証明書の有効期限確認
シャットダウンが長期にわたる場合、証明書の有効期限が過ぎると起動できなくなるので、有効期限を確認するため以下のコマンドを実行します。
oc -n openshift-kube-apiserver-operator get secret kube-apiserver-to-kubelet-signer -o jsonpath='{.metadata.annotations.auth\.openshift\.io/certificate-not-after}’
- これ以降、アプリケーションのPodが勝手にスケジュールされないよう以下のコマンドを実行します。oc get nodeでコマンド前後を比較すると、ノードステータスが「Ready」から「Ready, SchedulingDisabled」に変わったことが確認できます。
for node in $(oc get nodes -o jsonpath='{.items[*].metadata.name}'); do echo ${node} ; oc adm cordon ${node} ; done
- Workerノード上で稼働中の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 --ignore-daemonsets=true --timeout=15s ; done
- ノードをシャットダウンするために以下のコマンドを実行します。
for node in $(oc get nodes -o jsonpath='{.items[*].metadata.name}'); do oc debug node/${node} -- chroot /host shutdown -h 1; done
OpenShiftクラスタの再起動
- OpenShiftクラスタの再起動は関係するMaster/Workerノードの電源を投入するだけです。10-15分程度待って、oc loginコマンドでOpenShiftクラスタにログインし、oc get nodeコマンドでステータスを確認します。Readyの文字が確認できればOKですが、このままではスケジュール不可の状態なのでアプリケーションの展開ができません。
- このためノードに付いているスケジュール不可のマークを解除する以下のコマンドを実行します。ステータスが「Ready」になればOKです
for node in $(oc get nodes -o jsonpath='{.items[*].metadata.name}'); do echo ${node} ; oc adm uncordon ${node} ; done
構築したOpenShift環境を何らかの理由でシャットダウンする状況も出てくると思うので、覚えておいて損はない手順だと思います。