見出し画像

AWS 上の OpenShift (4 系) の cluster を一時停止する方法

『IT自動化の力でビジネス加速を全ての企業に』

”IT自動化の専門会社”、リアルグローブ・オートメーティッド(RGA)の技術ブログ編集部の水谷です。本日もRGAの技師がまとめた技術情報を読者の皆様にお届けしていきます!

RGAでは Red Hat社 が提供するコンテナオーケストレーションツール「OpenShift 」を利用したインフラ基盤環境の構築支援やコンテナアプリケーションの開発支援を提供しています。OpenShift は、直接 Kubernetes を利用する場合に比べ、 GUI が整備されているため扱いやすく、コンテナ運用に関する様々な便利機能が追加されているので、コンテナ基盤の運用担当者にとって、大変有用なツールであると思います。

今回は RGA の技師がそんな OpenShift を使った検証作業において遭遇した「ふとした疑問」について調査した記録を、記事にしてみました。

――――――――――――――――――――――――――――――――――

OpenShift (4 系) の Cluster について、作成と削除はデフォルトのコマンドでサポートされており、create や destroy コマンドで行えます。しかし、一時的な停止については同様な手順で行えず、例えば stop コマンドのようなものは存在しません。

一時停止が必要な場面が多くあるわけではありませんが、検証作業をしているときに「停止して、作業を延期する」といったことがしたい場合もあります。

そこで、今回の記事では公式ブログを参考に、Cluster の停止と再起動方法についてまとめてみます。

Cluster の一時停止

上記のように、OpenShift には Cluster を一時停止させるデフォルトのコマンドが存在しません。今回は Cluster を停止させる方法、再起動させる方法を合わせて「Cluster を一時停止させる手順」としてまとめてみたいと思います。

以下のページを参考にしておりますので、合わせてご参照ください。

Enabling OpenShift 4 Clusters to Stop and Resume Cluster VMs

なお、このマニュアルでは 「OpenShift を AWS 上でインストールしている。」ことを前提とします。

また、以下の環境を想定しています。

OpenShift version 4.2.14
AWS 上に OpenShift を IPI インストール

Cluster の停止方法

停止には以下のスクリプトを実行します。使用する yaml ファイルについては、上記の公式ブログから引用しています。

cat << 'EOF' >$HOME/kubelet-bootstrap-cred-manager-ds.yaml.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
 name: kubelet-bootstrap-cred-manager
 namespace: openshift-machine-config-operator
 labels:
   k8s-app: kubelet-bootrap-cred-manager
spec:
 replicas: 1
 selector:
   matchLabels:
     k8s-app: kubelet-bootstrap-cred-manager
 template:
   metadata:
     labels:
       k8s-app: kubelet-bootstrap-cred-manager
   spec:
     containers:
     - name: kubelet-bootstrap-cred-manager
       image: quay.io/openshift/origin-cli:v4.0
       command: ['/bin/bash', '-ec']
       args:
         - |
           #!/bin/bash
           set -eoux pipefail
           while true; do
             unset KUBECONFIG
             echo "---------------------------------"
             echo "Gather info..."
             echo "---------------------------------"
             # context
             intapi=$(oc get infrastructures.config.openshift.io cluster -o "jsonpath={.status.apiServerInternalURI}")
             context="$(oc --config=/etc/kubernetes/kubeconfig config current-context)"
             # cluster
             cluster="$(oc --config=/etc/kubernetes/kubeconfig config view -o "jsonpath={.contexts[?(@.name==\"$context\")].context.cluster}")"
             server="$(oc --config=/etc/kubernetes/kubeconfig config view -o "jsonpath={.clusters[?(@.name==\"$cluster\")].cluster.server}")"
             # token
             ca_crt_data="$(oc get secret -n openshift-machine-config-operator node-bootstrapper-token -o "jsonpath={.data.ca\.crt}" | base64 --decode)"
             namespace="$(oc get secret -n openshift-machine-config-operator node-bootstrapper-token  -o "jsonpath={.data.namespace}" | base64 --decode)"
             token="$(oc get secret -n openshift-machine-config-operator node-bootstrapper-token -o "jsonpath={.data.token}" | base64 --decode)"
             echo "---------------------------------"
             echo "Generate kubeconfig"
             echo "---------------------------------"
             export KUBECONFIG="$(mktemp)"
             kubectl config set-credentials "kubelet" --token="$token" >/dev/null
             ca_crt="$(mktemp)"; echo "$ca_crt_data" > $ca_crt
             kubectl config set-cluster $cluster --server="$intapi" --certificate-authority="$ca_crt" --embed-certs >/dev/null
             kubectl config set-context kubelet --cluster="$cluster" --user="kubelet" >/dev/null
             kubectl config use-context kubelet >/dev/null
             echo "---------------------------------"
             echo "Print kubeconfig"
             echo "---------------------------------"
             cat "$KUBECONFIG"
             echo "---------------------------------"
             echo "Whoami?"
             echo "---------------------------------"
             oc whoami
             whoami
             echo "---------------------------------"
             echo "Moving to real kubeconfig"
             echo "---------------------------------"
             cp /etc/kubernetes/kubeconfig /etc/kubernetes/kubeconfig.prev
             chown root:root ${KUBECONFIG}
             chmod 0644 ${KUBECONFIG}
             mv "${KUBECONFIG}" /etc/kubernetes/kubeconfig
             echo "---------------------------------"
             echo "Sleep 60 seconds..."
             echo "---------------------------------"
             sleep 60
           done
       securityContext:
         privileged: true
         runAsUser: 0
       volumeMounts:
         - mountPath: /etc/kubernetes/
           name: kubelet-dir
     nodeSelector:
       node-role.kubernetes.io/master: ""
     priorityClassName: "system-cluster-critical"
     restartPolicy: Always
     securityContext:
       runAsUser: 0
     tolerations:
     - key: "node-role.kubernetes.io/master"
       operator: "Exists"
       effect: "NoSchedule"
     - key: "node.kubernetes.io/unreachable"
       operator: "Exists"
       effect: "NoExecute"
       tolerationSeconds: 120
     - key: "node.kubernetes.io/not-ready"
       operator: "Exists"
       effect: "NoExecute"
       tolerationSeconds: 120
     volumes:
       - hostPath:
           path: /etc/kubernetes/
           type: Directory
         name: kubelet-dir
EOF
oc apply -f $HOME/kubelet-bootstrap-cred-manager-ds.yaml.yaml
oc delete secrets/csr-signer-signer secrets/csr-signer -n openshift-kube-controller-manager-operator

以上のスクリプトの内容で "OpenShift の Cluster の停止"が始まります。

しかし、これだけでは Cluster が乗っている VM は停止していません。そこで、下記のコマンドを実行して cluster operator の停止を確認してから、VM を停止します。

watch oc get clusteroperators

結果:

NAME                                       VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE
authentication                             4.2.14    True        False         False      8d
cloud-credential                           4.2.14    True        False         False      8d
cluster-autoscaler                         4.2.14    True        False         False      8d
console                                    4.2.14    True        False         False      25m
dns                                        4.2.14    True        False         False      8d
image-registry                             4.2.14    True        False         False      45m
ingress                                    4.2.14    True        False         False      8d
insights                                   4.2.14    True        False         False      8d
kube-apiserver                             4.2.14    True        True          False      8d
kube-controller-manager                    4.2.14    True        False         False      8d
kube-scheduler                             4.2.14    True        False         False      8d
machine-api                                4.2.14    True        False         False      8d
machine-config                             4.2.14    True        False         False      17h
marketplace                                4.2.14    True        False         False      24m
monitoring                                 4.2.14    True        False         False      48m
network                                    4.2.14    True        False         False      8d
node-tuning                                4.2.14    True        False         False      24m
openshift-apiserver                        4.2.14    True        False         False      30m
openshift-controller-manager               4.2.14    True        False         False      8d
openshift-samples                          4.2.14    True        False         False      52m
operator-lifecycle-manager                 4.2.14    True        False         False      8d
operator-lifecycle-manager-catalog         4.2.14    True        False         False      8d
operator-lifecycle-manager-packageserver   4.2.14    True        False         False      25m
service-ca                                 4.2.14    True        False         False      8d
service-catalog-apiserver                  4.2.14    True        False         False      8d
service-catalog-controller-manager         4.2.14    True        False         False      8d
storage                                    4.2.14    True        False         False      58m

すべての cluster operator において Available=True, Progressing=False, Degraded=False となっていることを確認し、次の作業で Cluster の VM を停止してください。

# REGION と CLUSTERNAME は環境にあったものに変更してください
export REGION="ap-northeast-1"
export CLUSTERNAME="cluster-xxxx"

aws ec2 stop-instances --region ${REGION} --instance-ids $(aws ec2 describe-instances --filters "Name=tag:Name,Values=${CLUSTERNAME}-*" "Name=instance-state-name,Values=running" --query Reservations[*].Instances[*].InstanceId --region ${REGION} --output text)

以上で OpenShift の Cluster を停止が完了します。使用している AWS のアカウントから EC2 インスタンスの停止を確認してから、作業を終えてください。

再起動

OpenShift の Cluster の再起動をするにあたって、まず VM の起動を行います。

# REGION と CLUSTERNAME は環境にあったものに変更してください
export REGION="ap-northeast-1"
export CLUSTERNAME="cluster-xxxx"

aws ec2 start-instances --region ${REGION} --instance-ids $(aws ec2 describe-instances --filters "Name=tag:Name,Values=${CLUSTERNAME}-*" "Name=instance-state-name,Values=stopped" --query Reservations[*].Instances[*].InstanceId --region ${REGION} --output text)

上記作業後に Node の起動ができているかの確認を行います。

oc get nodes

結果:

NAME                                         STATUS   ROLES    AGE   VERSION
ip-10-0-132-82.us-east-2.compute.internal    Ready worker   18h   v1.14.0+b985ea310
ip-10-0-134-223.us-east-2.compute.internal   Ready master   19h   v1.14.0+b985ea310
ip-10-0-147-233.us-east-2.compute.internal   Ready master   19h   v1.14.0+b985ea310
ip-10-0-154-126.us-east-2.compute.internal   Ready worker   18h   v1.14.0+b985ea310
ip-10-0-162-210.us-east-2.compute.internal   Ready master   19h   v1.14.0+b985ea310
ip-10-0-172-133.us-east-2.compute.internal   Ready worker   18h   v1.14.0+b985ea310

このとき status が全て Ready であれば作業完了です。

NotReady な Node がある場合、その Node の証明書署名要求 (CSR) の発行を行います。NotReady な Node の CSR が Pending と表示されるのを以下のコマンドで確認してください(表示されるまで何度か試してみてください)。

oc get csr

CSR が表示されたら、それらの承認を行います。次のコマンドで全ての未処理な CSR を承認していきます。

oc get csr -oname | xargs oc adm certificate approve

上記コマンドの完了後、CSR が承認されたことを確認します。

oc get csr

全ての Node が Ready と表示されていることが確認できれば終了です。

まとめ

以上の操作によって、 OpenShift の Cluster の停止と再起動が可能です。
この一時停止が必要となる場面は稀かもしれませんが、現状ではコマンド操作でこの操作が行えないので注意してください。また、バージョンによってはこのドキュメント内容が適切でない場合もあるかもしれませんので、注意してください。

追記

OCP4.5からはシャットダウン方法が公式ドキュメントに記載されました。

――――――――――――――――――――――――――――――――――

執筆者プロフィール:合屋 純
九州大学大学院理学府修士卒 大学院で物理学を専攻し、数値計算プログラムに触れたことをキッカケにエンジニアリングに興味を持つ。
現在はリアルグローブ・オートメーティッドにて、コンテナ関連技術や自動化ツールの導入業務に従事。

【ご案内】
ITシステム開発やITインフラ運用の効率化、高速化、品質向上、その他、情シス部門の働き方改革など、IT自動化導入がもたらすメリットは様々ございます。
IT業務の自動化にご興味・ご関心ございましたら、まずは一度、IT自動化の専門家リアルグローブ・オートメーティッド(RGA)にご相談ください!

お問合せは以下の窓口までお願いいたします。

【お問い合わせ窓口】
株式会社リアルグローブ・オートメーティッド
代表窓口:info@rg-automated.jp
URL:https://rg-automated.jp

画像1