Satellite&Openshiftセットアップしてサンプルアプリの稼働を確認してみる



#目的
IBM Cloud Sattelite環境を作成後その上でROKS(Openshift on IBM Cloud)を作成、サンプルアプリケーションの稼働確認までを確認してみます。


#事前準備　
PrivateNetowrkのみに接続したサーバーにSatellite環境をセットアップします。最低4vCPU,16GBメモリ,100GBディスクのRHEL7サーバーが６台必要になります。
![スクリーンショット 2021-08-15 12.44.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/90def51c-3247-36a9-4be4-b6ff34dfbbc8.png)

詳細な前提条件は下記に記載あります。
[ホスト要件](https://cloud.ibm.com/docs/satellite?topic=satellite-host-reqs#reqs-host-system)
[Firewall設定](https://cloud.ibm.com/docs/satellite?topic=satellite-host-reqs#reqs-host-network-firewall-outbound)


Satelliteのセットアップに入る前に、サーバーで少なくても外部ネットワークでの名前解決ができる、必要なサイトにアクセスできる等の確認はしておいた方がいいでしょう

```
ping 8.8.8.8
nslookup google.com
nslookup google.com 8.8.8.8
curl https://google.com
curl https://containers.cloud.ibm.com/v1/healthz
curl https://us.icr.io
```
*PublicNetwork接続されたサーバーでも以下の操作でセットアップできます。


#Satelliteのセットアップ
[IBM Cloudカタログ](https://cloud.ibm.com/catalog)
IBM Cloud カタログからSatelliteで検索し、IBM Cloud Satelliteを選択します。
![スクリーンショット 2021-08-13 17.59.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/34935790-7623-d05a-e9ce-134e866aad44.png)

Satelliteロケーションの作成のボタンをおします
![スクリーンショット 2021-08-15 11.42.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/cb74a2b3-2beb-379c-32fe-fa1ca3359dc8.png)

手動セットアップを選択、Satelliteロケーションの名前を入力します。ここではsatellite-location-xyz-1と入力します。入力BOXが出てこない時はSatellite ロケーションの右にある編集(鉛筆マーク)ボタンを押せばBOXが開きます。
![スクリーンショット 2021-08-15 11.46.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/2a8d746b-9b3d-96fc-19fb-c58e1d9eefa0.png)




下にスクロールして、管理元(ControlePoint)にインスタンスを生成するregionを選択します。ここではワシントンDCを選択して、ゾーンは、デフォルトのままzone-1,zone-2,zone-3として右下のロケーションの作成ボタンを押します
![スクリーンショット 2021-08-13 12.22.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/c16abbc6-7fde-a936-019c-9fba021994d8.png)

新規ロケーションのセットアップ画面が現れ、ロケーションのセットアップが開始されます。次へのボタンを押してください。
![スクリーンショット 2021-08-13 12.24.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/28967d8d-b419-10f5-2d22-8ad2fc249b34.png)

スクリプトの生成ボタンを押してください
![スクリーンショット 2021-08-13 12.25.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/e7917ae7-f0fe-e469-af50-6bdb1e676420.png)

スクリプトの生成画面が現れます、そのままスクリプトのダウンロードボタンを押します。
![スクリーンショット 2021-08-13 12.26.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/9cab6f06-ef48-4656-997c-eec7de3f219c.png)


ポップアップ画面が現れるのでファイルを保存ボタンを押してください。スクリプトがattachHost-ロケーション名.shの名前で自身のPCにダウンロードされます。ダウンロードが完了したら、右下の次へボタンを押してください
![スクリーンショット 2021-08-13 12.27.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/d5336b24-f8d2-f5a2-f552-88517090cc79.png)

コントロールプレーンのセットアップ画面になります。
![スクリーンショット 2021-08-13 12.28.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/a123e106-084b-fbf5-34c3-3409382f185c.png)


いったんIBM Cloud Portal画面を離れ、セットアップ対象のサーバー側の作業を実施します。まず先ほど自PCに保存したScriptファイルをサーバーへuploadします

```
 % scp attachHost-satellite-xyz-1.sh root@10.xxx.xxx.xxx:/tmp/attachHost-satellite-xyz-1.sh
root@10.xxx.xxx.xxx's password: 
attachHost-satellite-xyz-1.sh                 100%   10KB 203.4KB/s   00:00  
```

サーバーにLogin後、RedHat Subscrptionの更新を行います。

```
[root@poc21 ~]# subscription-manager refresh
ローカルデータがすべて更新されました
[root@poc21 ~]# subscription-manager repos --enable=*
リポジトリー 'rhel-ha-for-rhel-7-server-eus-rpms' は、このシステムに対して有効になりました。
リポジトリー 'rhel-server-rhscl-7-rpms' は、このシステムに対して有効になりました。
リポジトリー 'rhel-7-server-optional-rpms' は、このシステムに対して有効になりました。

中途省略

リポジトリー 'rhel-7-server-extras-rpms' は、このシステムに対して有効になりました。
リポジトリー 'rhel-7-server-eus-supplementary-rpms' は、このシステムに対して有効になりました。
```

先ほどアップロードしたスクリプトを実行します、進行状況をモニターするコマンドを実行して、サーバー側のセットアップが開始されたことが確認できたら、CTL+Cで抜けます。

```
[root@poc21 ~]# nohup bash /tmp/attachHost-satellite-xyz-1.sh &
[1] 2913
[root@poc21 ~]# nohup: 入力を無視し、出力を `nohup.out' に追記します

[1]+  終了                  nohup bash /tmp/attachHost-satellite-xyz-1.sh

[root@poc21 ~]# journalctl -f -u ibm-host-attach
-- Logs begin at Mon 2021-08-23 04:08:46 CDT. --
Aug 23 04:49:20 poc21.ibm.cloud ibm-host-attach.sh[2723]: Failed to execute operation: No such file or directory
Aug 23 04:49:20 poc21.ibm.cloud ibm-host-attach.sh[2723]: + systemctl mask iptables.service
Aug 23 04:49:20 poc21.ibm.cloud ibm-host-attach.sh[2723]: Created symlink from /etc/systemd/system/iptables.service to /dev/null.
以降省略

```
上記操作(Scriptアップロード~Subscription更新~Script実行)をセットアップ対象のサーバー分繰り返します。Script再実行についてはScriptを解読すればわかりますが、flag用Directory:/etc/satelliteflagsを削除すればScriptは再実行できます


ここからはIBM Cloud Portal画面に戻ります。

ホストの割り当てボタンの横にあるオンラインの未割り当てホストの数が、上記サーバーでのスクリプト実行が終了するごとに１ずつ増え、３になったらホストへの割り当てが開始できます。3になったら開始ボタンを押してください。ここでいくら待っても１から増えない場合は、サーバーで外部ネットワークへの名前解決ができているかなど疑った方がいいでしょう。

[その他Script実行エラー時の対応](https://cloud.ibm.com/docs/satellite?topic=satellite-host-registration-script-fails)
![スクリーンショット 2021-08-13 13.32.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/a4efd571-48eb-f904-6c3c-60f483422d44.png)

コントロールプレーンへのホストの割り当て画面が現れるので対象サーバーをチェツクして、次ヘのボタンを押してください
![スクリーンショット 2021-08-13 13.34.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/68f4f971-4803-824b-ce4c-78f05282fd2b.png)

ゾーンの割り当て画面になりますのでzone-１、zone-２、zone-３と指定してください、ホストの割り当てボタンを押してください。
![スクリーンショット 2021-08-13 13.34.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/2cfc2f3e-ac9b-4d1a-f15c-43479aa8ed49.png)

コントロールプレーンのセットアップ画面に戻り、割り当てが開始されたことがわかります、
![スクリーンショット 2021-08-13 13.35.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/52561fb6-c66f-626e-725f-a2e398e37a5e.png)

30分程度で割り当てが完了します、次へのボタンを押して下さい
いくら待っても割り当てが完了しない、あるいはエラーが発生した場合は下記を参照ください
https://cloud.ibm.com/docs/satellite?topic=satellite-ts-hosts-login
https://cloud.ibm.com/docs/satellite?topic=satellite-assign-fails
![スクリーンショット 2021-08-13 14.05.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/0ac2f119-6d77-e65e-12d3-92b55e443b28.png)

ロケーションのファイナライズ画面が現れます、サーバーの割り当てが完了してから以降はサーバーへのsshログインはできなくなります。左のメニューからホストを選択します。
![スクリーンショット 2021-08-13 14.06.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/368b9251-4678-8e20-9f56-d6c7ae898830.png)

サーバーの状況が正常で割り当て済み,クラスターがコントロールプレーンであることが確認できます。

![スクリーンショット 2021-08-13 14.06.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/22e4b38d-9a72-9524-d029-8c03fe3cdeca.png)


#ROKSのセットアップ
まずSatelliteロケーションの左メニューのホストを選ぶと出てくるSatelliteホスト一覧画面で未割り当てのサーバーが最低３つあることを確認ください。
![スクリーンショット 2021-08-14 11.50.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/9633326c-8b12-324a-f03e-53a9cb2eec2a.png)

ROKSのオーダーを開始します。カタログからOpenShiftで検索、クリック
![スクリーンショット 2021-08-14 11.53.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/b2299015-0245-654c-73a7-90023d8f2b72.png)

ROKSのオーダー画面が現れます、Satelliteを選択、下にスクロール
![スクリーンショット 2021-08-14 11.55.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/0d4a379c-0c43-6558-4c55-c1e6a9a694d1.png)


Satelliteロケーションの一覧がでてくるので先ほど作成したロケーション(ここではsatellite-xyz-1)を選択、ワーカープールのSatelliteゾーンではzone-1,zone-2,zone-3をチェックして下にスクロール
![スクリーンショット 2021-08-14 11.55.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/de823302-efe6-3a18-4f08-6bf956e32592.png)

Satellite Configでは上の"クラスター管理者の Satellite Config のアクセス権限を有効にしてください。"をチェツクして、クラスター名には、ここではmycluster-satellite--xyz1を入力、右下の作成ボタンを押してください。
![スクリーンショット 2021-08-14 11.56.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/b22bdaa6-3922-1db2-f465-40d3d977d13e.png)


Openshiftのクラスター画面が現れ、クラスターの作成が開始されたことがわかります。
![スクリーンショット 2021-08-14 11.57.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/9f508b42-36c8-e8e8-4ab8-6b7da6b4e52c.png)

クラスターの作成が完了すると下記画面になります。ノードの状況が通常であることを確認して、右上のOpenShift webコンソールのボタンを押してください
![スクリーンショット 2021-08-14 13.24.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/a728a1ce-f3de-e5ad-651a-a236b5a2f048.png)

Webコンソールの画面が現れROKSクラスターにアクセスできました、右上のユーザーIDをクリックして、Copy Login Commnadを選ぶと別画面でDisplay Tokenと表示され、そのままクリックするとAPI Token付きのoc loginコマンドが表示されます。

![スクリーンショット 2021-08-17 11.08.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/5de54c3e-6408-8008-1db1-d0bb10d865cb.png)

oc loginコマンドを実行するとクラスターへログインできます。

```
% oc login --token=sha256~DFHLxmDdPSmuZeVVOIIAdRffwKNZMIRHTiXMa-uPmOk --server=https://sa3660e07e6bb157cdfca-6b64a6ccc9c596bf59a86625d8fa2202-ce00.us-east.satellite.appdomain.cloud:30794
Logged into "https://sa3660e07e6bb157cdfca-6b64a6ccc9c596bf59a86625d8fa2202-ce00.us-east.satellite.appdomain.cloud:30794" as "IAM#nsakata@jp.ibm.com" using the token provided.

You have access to 65 projects, the list has been suppressed. You can list all projects with ' projects'

Using project "test10".
```

Satelliteロケーションの左メニューからホストを選び、Satelliteのホスト一覧画面からも該当のホストに先ほど指定したクラスター名(mycluster-satellite--xyz1)で割り当てられていることが確認できます。
![スクリーンショット 2021-08-14 13.24.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/f90b43ea-9e10-f82d-700f-eb8149cbb220.png)

#サンプルアプリケーションの稼働確認。
サンプルアプリケーションのBuild,Deploy,接続確認を行います

##1.Registry設定（内部Storage)

新規にProjectを作成してRuby on Railsを導入してみます。Registryが見つからないのエラーがでます。

```
 % oc new-project test10

 % oc new-app rails-postgresql-example

 % oc logs -f buildconfig/rails-postgresql-example
   　　　中途略
error: build error: After retrying 2 times, Pull image still failed due to error: while pulling "docker://image-registry.openshift-image-registry.svc:5000/openshift/ruby@sha256:5e828cb537399a3d7c4950ced8fbf2e084d89ab7c6fcff995598b44e8d394450" as "image-registry.openshift-image-registry.svc:5000/openshift/ruby@sha256:5e828cb537399a3d7c4950ced8fbf2e084d89ab7c6fcff995598b44e8d394450": Error initializing source docker://image-registry.openshift-image-registry.svc:5000/openshift/ruby@sha256:5e828cb537399a3d7c4950ced8fbf2e084d89ab7c6fcff995598b44e8d394450: error pinging docker registry image-registry.openshift-image-registry.svc:5000: Get "https://image-registry.openshift-image-registry.svc:5000/v2/": dial tcp: lookup image-registry.openshift-image-registry.svc on 172.21.0.10:53: no such host
```
そこでRegistryを内部storageのEmptyDirに登録します。
[ワーカー・ノードの空のディレクトリーへのイメージの保管]
(https://cloud.ibm.com/docs/openshift?topic=openshift-registry#emptydir_internal_registry)

```
 % oc patch configs.imageregistry.operator.openshift.io/cluster --type merge --patch '{"spec":{"storage":{"emptyDir":{}}}}'

config.imageregistry.operator.openshift.io/cluster patched
 % oc patch configs.imageregistry.operator.openshift.io/cluster --type merge -p '{"spec":{"managementState":"Managed"}}'

config.imageregistry.operator.openshift.io/cluster patched
```
NameRegistry(image-registry-785cd79745-g7hvn)が起動されたことを確認します。 

```
 % oc get pods -n openshift-image-registry

NAME                                               READY   STATUS        RESTARTS   AGE
cluster-image-registry-operator-547bd97747-nnkns   1/1     Running       0          47h
image-pruner-1628985600-hxt9n                      0/1     Completed     0          26h
image-pruner-1629072000-8q7nv                      0/1     Completed     0          145m
image-registry-5598549b9f-bhlq4                    0/1     Terminating   0          20s
image-registry-785cd79745-g7hvn                    1/1     Running       0          20s
node-ca-fn7rd                                      1/1     Running       0          46h
node-ca-gtjqq                                      1/1     Running       0          46h
node-ca-lhpv5                                      1/1     Running       0          46h
```

導入を再実行します。(先ほどのtest10の削除/再作成してから)今度はImageのRegistryへのPushが成功しました。

```
% oc new-app rails-postgresql-example 

 % oc logs -f buildconfig/rails-postgresql-example
Cloning "https://github.com/sclorg/rails-ex.git" ...
	Commit:	57f02090043d0285de7e22261e9c407406c01ccf (Fix nokogiri dependencies)
	Author:	Yaakov Selkowitz <yselkowi@redhat.com>
	Date:	Tue Apr 20 16:10:47 2021 -0400
Caching blobs under "/var/cache/blobs".
Getting image source signatures

中途略

Writing manifest to image destination
Storing signatures
Successfully pushed image-registry.openshift-image-registry.svc:5000/test10/rails-postgresql-example@sha256:e72818b5bcd42c2094f22a5c46389d712d01c2c9affd03efbe90b3c4ae2b2cd0
Push successful
```

ROUTEを作成してアクセスできることまで確認します。

```
 % oc get pods -n test10
NAME                                  READY   STATUS      RESTARTS   AGE
postgresql-1-deploy                   0/1     Completed   0          4m7s
postgresql-1-zj6rc                    1/1     Running     0          4m5s
rails-postgresql-example-1-build      0/1     Completed   0          4m7s
rails-postgresql-example-1-cbsrk      1/1     Running     0          118s
rails-postgresql-example-1-deploy     0/1     Completed   0          2m11s
rails-postgresql-example-1-hook-pre   0/1     Completed   0          2m8s

 % oc get route -n test10                       
NAME                       HOST/PORT                                                                                                                       PATH   SERVICES                   PORT    TERMINATION   WILDCARD
rails-postgresql-example   rails-postgresql-example-test10.mycluster-satellite-xyz1-c82dcc5867b41450588f49284670f9a8-0000.upi.containers.appdomain.cloud          rails-postgresql-example   <all>                 None


 % curl https://rails-postgresql-example-test10.mycluster-satellite-xyz1-c82dcc5867b41450588f49284670f9a8-0000.upi.containers.appdomain.cloud
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
中途略
```

現時点では内部RegistryがEmptyDirなので、このままではNode再起動/障害には対応できていません。

##2.Registry設定（ICOS)
次にObject StorageをRegistryとして設定します。

カタログからObject Storageを検索して選択、Standardを選択してください。

![スクリーンショット 2021-08-16 12.20.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/4e6ead44-644e-5383-8f08-b3a646eb1001.png)

スクロールしてサービス名を入力して、右下の作成ボタンを押してください。
![スクリーンショット 2021-08-16 12.20.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/92ec6321-367b-bd3b-50b8-bd14b751318a.png)

左のメニューからサービス資格情報を選択し、新規資格情報のボタンを押してください
![スクリーンショット 2021-08-16 12.21.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/6b37a0e5-82f1-8590-d818-b45ea7d664d7.png)

資格情報の作成画面が現れます、名前の入力、HMAC資格情報を含めるをOnにします、追加ボタンを押します。
![スクリーンショット 2021-08-16 12.26.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/7a4a10f5-5a3a-d878-cb22-07c738badb5b.png)

作成されたaccess_key_idとsecret_access_keyをメモします。
![スクリーンショット 2021-08-16 12.27.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/579ba31e-7d70-56f6-68f6-66c9e66e4f40.png)

左のメニューからエンドポイントを選択し、ここではReginal, jp-tokを選択してjp-tokのPublicのURLをのちに利用するためにメモします。
![スクリーンショット 2021-08-16 12.25.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/c723554d-dd3d-bba4-b1d7-adb5adcfe508.png)

RegistryにSecretの登録を行います。先ほどメモしたサービス資格情報のアクセスキーとシークレットキーを利用します。Secret名は固定値でimage-registry-private-configuration-userにする必要があります。

```
% oc create secret generic image-registry-private-configuration-user \
--from-literal=REGISTRY_STORAGE_S3_ACCESSKEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
> --from-literal=REGISTRY_STORAGE_S3_SECRETKEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
> -n openshift-image-registry
secret/image-registry-private-configuration-user created
```

Registryコンフィグを修正し、spec.storageのemptyDir: {}の行は削除して,
代わりにs3の設定を追加します、regionにはバケットを作成するリージョンをクラス付きでここではjp-tok-standard,regionEndpointは先ほどメモしたバケットを作成するリージョンのパブリックエンドポイントです。

```
 % oc edit configs.imageregistry.operator.openshift.io/cluster -n openshift-image-registry

spec:
  storage:
    s3:
      region: jp-tok-standard
      regionEndpoint: s3.jp-tok.cloud-object-storage.appdomain.cloud

```
コンフィグを確認すると、bucketキーの値が自動的に追加されています。

```
$oc get configs.imageregistry.operator.openshift.io/cluster -o yaml 

    s3:
      bucket: kubernetes-image-registry-jp-tok-standard-btwxmjfhukeiuohlijug
      region: jp-tok-standard
      regionEndpoint: s3.jp-tok.cloud-object-storage.appdomain.cloud
      virtualHostedStyle: false
```

確認のためここではNodeJSを導入してみます。Build/Deploy/Routeの作成まで行い、正常にアクセスできることまで確認します。

```
% oc new-app openshift/nodejs~https://github.com/sclorg/nodejs-ex.git -n test10
% oc expose service/nodejs-ex
route.route.openshift.io/nodejs-ex exposed
% oc get route -n test10
NAME                       HOST/PORT                                                                                                                       PATH   SERVICES                   PORT       TERMINATION   WILDCARD
nodejs-ex                  nodejs-ex-test10.mycluster-satellite-xyz1-c82dcc5867b41450588f49284670f9a8-0000.upi.containers.appdomain.cloud                         nodejs-ex                  8080-tcp                 None
rails-postgresql-example   rails-postgresql-example-test10.mycluster-satellite-xyz1-c82dcc5867b41450588f49284670f9a8-0000.upi.containers.appdomain.cloud          rails-postgresql-example   <all>                    None

 % curl https://nodejs-ex-test10.mycluster-satellite-xyz1-c82dcc5867b41450588f49284670f9a8-0000.upi.containers.appdomain.cloud
<html>
  <head>
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
以後省略
```

ICOSの画面でも自動的に作成されたバケットにイメージが保管されてることを確認します。
![スクリーンショット 2021-08-16 13.22.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/8e83ef09-2b52-a0ce-13eb-1e98bd239f22.png)

##3.最終確認(ノード障害テスト)

全てのテスト用アプリケーションは10.193.37.146のNode稼働しており、このノードを意図的にダウン(電源OFF)させます。

```
 % oc get pod -o wide
NAME                                  READY   STATUS      RESTARTS   AGE     IP               NODE            NOMINATED NODE   READINESS GATES
nodejs-ex-1-build                     0/1     Completed   0          5m24s   172.30.187.218   10.193.37.146   <none>           <none>
nodejs-ex-7ffdf556bf-6ntsl            1/1     Running     0          3m53s   172.30.187.219   10.193.37.146   <none>           <none>
rails-postgresql-example-1-build      0/1     Completed   0          98m     172.30.187.212   10.193.37.146   <none>           <none>
rails-postgresql-example-1-cbsrk      1/1     Running     0          96m     172.30.187.217   10.193.37.146   <none>           <none>
rails-postgresql-example-1-deploy     0/1     Completed   0          96m     172.30.187.215   10.193.37.146   <none>           <none>
rails-postgresql-example-1-hook-pre   0/1     Completed   0          96m     172.30.187.216   10.193.37.146   <none>           <none>
```

10.193.37.146がNotReadyになったことからNodeダウンを確認します。

```
 % oc get nodes
NAME            STATUS     ROLES           AGE    VERSION
10.193.37.146   NotReady   master,worker   2d2h   v1.19.0+4c3480d
10.193.37.168   Ready      master,worker   2d2h   v1.19.0+4c3480d
10.193.37.186   Ready      master,worker   2d2h   v1.19.0+4c3480d
```

またIBM Cloud Portal画面からもNODEダウンを確認できます。
![スクリーンショット 2021-08-16 15.48.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132988/082acef3-b849-c8d1-8206-cf8783e83d19.png)

Podの状況を確認していきます、StatusがTerminatingから他のノードへ切替後ContainerCreatingが開始されたことがわかります。

```
 % oc get pods
NAME                               READY   STATUS              RESTARTS   AGE
nodejs-ex-7ffdf556bf-697vz         0/1     ContainerCreating   0          20s
nodejs-ex-7ffdf556bf-6ntsl         1/1     Terminating         0          110m
rails-postgresql-example-1-cbsrk   1/1     Terminating         0          3h23m
rails-postgresql-example-1-m5tv9   0/1     ContainerCreating   0          20s
```

10.193.37.168のNodeへの切替を確認できます。

```
 % oc get pod -o wide
NAME                               READY   STATUS             RESTARTS   AGE     IP               NODE            NOMINATED NODE   READINESS GATES
nodejs-ex-7ffdf556bf-697vz         1/1     Running            0          34m     172.30.74.100    10.193.37.168   <none>           <none>
nodejs-ex-7ffdf556bf-6ntsl         1/1     Terminating        0          144m    172.30.187.219   10.193.37.146   <none>           <none>
rails-postgresql-example-1-cbsrk   1/1     Terminating        0          3h56m   172.30.187.217   10.193.37.146   <none>           <none>
rails-postgresql-example-1-m5tv9   0/1     ImagePullBackOff   0          34m     172.30.74.104    10.193.37.168   <none>           <none>
```

PODの状況がRunningとErrImagePullのものがあります。

```
 % oc get pods
NAME                               READY   STATUS         RESTARTS   AGE
nodejs-ex-7ffdf556bf-697vz         1/1     Running        0          71s
nodejs-ex-7ffdf556bf-6ntsl         1/1     Terminating    0          111m
rails-postgresql-example-1-cbsrk   1/1     Terminating    0          3h23m
rails-postgresql-example-1-m5tv9   0/1     ErrImagePull   0          71s
```

ErrImagePullの原因を確認します。RegistryにImageが見つからない。これはRegistryをICOSへ設定する前、内部のEmptydirにある時に導入したアプリケーションでした。ImageをICOSに保存したPODのみノード障害時の切替が成功したことがわかります。

```
 % oc describe pod/rails-postgresql-example-1-m5tv9
Name:         rails-postgresql-example-1-m5tv9
Namespace:    test10
Priority:     0
Node:         10.193.37.168/10.193.37.168
Start Time:   Mon, 16 Aug 2021 15:10:40 +0900
Labels:       deployment=rails-postgresql-example-1
              deploymentconfig=rails-postgresql-example
              name=rails-postgresql-example

中途略
Events:
  Type     Reason          Age                    From               Message
  ----     ------          ----                   ----               -------
  Normal   Scheduled       6m18s                  default-scheduler  Successfully assigned test10/rails-postgresql-example-1-m5tv9 to 10.193.37.168
  Normal   AddedInterface  6m16s                  multus             Add eth0 [172.30.74.104/32]
  Normal   Pulling         3m48s (x4 over 6m16s)  kubelet            Pulling image "image-registry.openshift-image-registry.svc:5000/test10/rails-postgresql-example@sha256:e72818b5bcd42c2094f22a5c46389d712d01c2c9affd03efbe90b3c4ae2b2cd0"
  Warning  Failed          3m48s (x4 over 5m20s)  kubelet            Failed to pull image "image-registry.openshift-image-registry.svc:5000/test10/rails-postgresql-example@sha256:e72818b5bcd42c2094f22a5c46389d712d01c2c9affd03efbe90b3c4ae2b2cd0": rpc error: code = Unknown desc = Error reading manifest sha256:e72818b5bcd42c2094f22a5c46389d712d01c2c9affd03efbe90b3c4ae2b2cd0 in image-registry.openshift-image-registry.svc:5000/test10/rails-postgresql-example: manifest unknown: manifest unknown
  Warning  Failed          3m48s (x4 over 5m20s)  kubelet            Error: ErrImagePull
  Normal   BackOff         3m19s (x7 over 5m19s)  kubelet            Back-off pulling image "image-registry.openshift-image-registry.svc:5000/test10/rails-postgresql-example@sha256:e72818b5bcd42c2094f22a5c46389d712d01c2c9affd03efbe90b3c4ae2b2cd0"
  Warning  Failed          68s (x16 over 5m19s)   kubelet            Error: ImagePullBackOff

```

10.193.37.146を電源ONに戻します、下記で確認できます。

```
 % oc get node
NAME            STATUS   ROLES           AGE    VERSION
10.193.37.146   Ready    master,worker   2d4h   v1.19.0+4c3480d
10.193.37.168   Ready    master,worker   2d4h   v1.19.0+4c3480d
10.193.37.186   Ready    master,worker   2d4h   v1.19.0+4c3480d
```

NodeのDown時は情報が取得できなかったためTerminatingだったPODがきれいに消えました。rails-postgresql-example-1-m5tv9のPODはNODEが再起動されてもIMAGEは依然取得できないのでImagePullBackOffのままです。またnodejs-ex-7ffdf556bf-697vzのPODが元のNode10.193.37.146が復活したからといって切り戻されることはありません。

```
 % oc get pod -o wide
NAME                               READY   STATUS             RESTARTS   AGE    IP               NODE            NOMINATED NODE   READINESS GATES
nodejs-ex-7ffdf556bf-697vz         1/1     Running            0          147m   172.30.74.100    10.193.37.168   <none>           <none>
rails-postgresql-example-1-m5tv9   0/1     ImagePullBackOff   0          147m   172.30.74.104    10.193.37.168   <none>           <none>
```