OpenShift 4.10をPower Systems Virtual Serverにデプロイする（詳細編）


# はじめに

[「概要編」]では、PowerVSにOCP 4.10を導入するとき、既存ガイドからどんな変更点が必要だったのか、ざっくりご説明しました。こちらの「詳細編」では、以下の３つの手順にわけて、もうちょっと詳しく実施した手順をご紹介したいと思います。

[「概要編」]: https://qiita.com/hiroyuki_z_tanaka/items/c2b279bcd23a2f0b9c4d

>1. OCP導入のためのPowerVSの準備
>2. RHCOSのOVAイメージを作成して、PowerVSに登録
>3. OCPをPowerVSへデプロイ

# 1. OCP導入のためのPowerVSの準備

まずは、PowerVS側の準備を行います。下記のリンクの手順を大阪リージョンで試したところ、最後まで問題なく進みました。
また、プライベート・ネットワーク内での通信の有効化は、Direct Linkを使う方法を利用しました。ibmcloud pi conan コマンドを実行後、すぐにプライベート・ネットワークがDirect Linkに接続することを確認できました。

>PowerVS Prerequisites
>https://github.com/ocp-power-automation/ocp4-upi-powervs/blob/master/docs/ocp_prereqs_powervs.md

なお、前提となるibmcloud CLIの導入と、piプラグインの追加は、下記の手順を参考にさせていただきました。

>PowerVS IBM i 日記(20): IBM Cloud CLI で PowerVS に アクセスする
>https://qiita.com/6onoda/items/01f0edd723316fcfa637

# 2. RHCOSのOVAイメージを作成して、PowerVSに登録

概要編で述べたように、最近のPowerVSではRHEL 8のイメージが提供されています。
そのため、ここではRHCOSのイメージのみ作成すれば大丈夫です。
手順としては、下記を参考にしました。

>Creating OVA images for Red Hat OpenShift Container Platform on IBM Power Systems Virtual Servers
>https://developer.ibm.com/tutorials/preparing-ova-for-openshift-on-cloud/

この手順の実行には、ppc64leアーキテクチャ(つまりIBM Power)のRHELインスタンスが必要です。
PowerVS上のインスタンスを使うこともできますし、オンプレの環境を使うことも可能です。
ただし、インターネットへのアクセスが必要です（proxyも可。proxyを使う場合は、環境変数HTTP_PROXY,HTTPS_PROXYを設定しておきましょう）。
また、上記手順では、RHCOS 4.6を使っていますが、今回はOCP 4.10を導入したいので、RHCOS 4.10のQCOW2イメージを利用しました。

>RHCOS QCOW2イメージ
>https://mirror.openshift.com/pub/openshift-v4/ppc64le/dependencies/rhcos/4.10/latest/rhcos-openstack.ppc64le.qcow2.gz

手順に従ってOVAが出来上がったら、ICOSへアップロードします。ICOSのBucketの作り方については、下記チュートリアルがありました。
なお、オブジェクトの追加をWebブラウザから行う場合、Asperaを導入していないと200MBまでしかアップロードできません。RHCOSのイメージはもっと大きいので、手順にある通りアップロードはpvsadmコマンドを使うのが簡単です。

>入門チュートリアル
>https://cloud.ibm.com/docs/cloud-object-storage?topic=cloud-object-storage-getting-started&locale=ja

最後に、ICOSからPowerVSへイメージのインポートを行います。上記手順では、"pvsadm image import"コマンドを使っていますが、わたしはこのコマンドでは以下のようなエラーになってしまいました。

~~~
Error: [POST /pcloud/v1/cloud-instances/{cloud_instance_id}/images][422] pcloudCloudinstancesImagesPostUnprocessableEntity  &{Code:606 Description: Error: Message:osType in body should be one of [aix ibmi rhel sles]}
~~~

いろいろ試しても解決できなかったので、インポートはPowerVSのGUIから行いました。インポートには、"HMAC アクセス鍵"と"HMAC 秘密アクセス鍵"が必要になります。これは、ICOSのService Credentialを「HMAC認証情報を含める」を有効にして作成すると入手できます。詳しくは、下記の記事が参考になりました。

>IBM Cloud Object Storage (ICOS) の認証方式について調べてみた
>https://qiita.com/khayama/items/abe223073f286d9ac16a

ちなみに、Service CredentailのJSONの中の、以下の部分を使います。

>access_key_id → HMAC アクセス鍵
>secret_access_key → HMAC 秘密アクセス鍵　

GUIからインポートを実行しても、すぐにはブートイメージに反映されません。わたしの場合は１時間くらい経ってからリロードしたら、画面上に出てきました。あわてず、気長に待ちましょう。

# 3. OCPをPowerVSへデプロイ

では、いよいよPowerVS上にOCPをデプロイします。githubで公開されているスクリプトやTerraformのモジュールなどを使うことで、簡単にデプロイできました。ただ、あまりにも自動化されていて、何が動いているのかわからず、ちょっと不安なところもあります・・・。
手順としては、下記を参考にしました。

>Install OpenShift on PowerVS
>https://github.com/ocp-power-automation/openshift-install-power

結果的には、この手順通りでPowerVS上にOCPのクラスターが出来上がりました。"openshift-install-powervs create"を最初に実行したときの質問には以下のように答えました。


~~~
[question] > Select the RHEL image to use for bastion node:
- You have answered: RHEL8-SP4
[question] > Select the RHCOS image to use for cluster nodes:
- You have answered: rhcos-410-06062022
[question] > Select the system type to use for cluster nodes:
- You have answered: s922
[question] > Select the private network to use:
- You have answered: ocp-net
[question] > Select the OCP version to use:
- You have answered: stable-4.10
[question] > Enter a short name to identify the cluster (test-ocp)
- You have answered: test-ocp
[question] > Enter a domain name for the cluster (ibm.com)
- You have answered: ibm.com
[question] > Do you want to configure High Availability for bastion nodes?
- You have answered: no
[question] > Select the flavor for the cluster nodes:
- You have answered: small
[question] > Do you need NFS storage to be configured?
- You have answered: no
[question] > Enter RHEL subscription username for bastion nodes
- You have answered: XXXXXXXXXXXX
[question] > Enter the pull-secret
*********************************************
[question] > Do you want to use IBM Cloud Classic DNS and VPC Load Balancer services?
- You have answered: no
~~~

実行完了まで１時間以上必要でした。
また、何度か以下のようなWarningでリトライが発生し、ちょっと不安感を煽られました。

~~~
Attempt: 1/5
[retry_terraform] Encountered below errors:         (3%)
│ Error: failed to provision: failed to Create PVM Instance :[POST /pcloud/v1/cloud-instances/{cloud_instance_id}/pvm-instances][400] pcloudPvminstancesPostBadRequest  &{Code:0 Description:bad request: create pvm-instance test-ocp-c1e3-osa21-bastion-0 for cloud-instance 16e1b4a4bc434d938ac80d90dd493822 processing error: unable to initialize IBM Linux Subscription Manager, please try again at a later time Error:bad request Message:}
[retry_terraform] WARN: Issues were seen while running the terraform command. Attempting to run again...
~~~

最終的には、以下のようにクラスターへのアクセス情報が表示され、スクリプトは無事完了しました。

~~~
[retry_terraform] Completed running the terraform command.
Login to bastion: ssh -i automation/data/id_rsa root@XXX.XXX.XXX.XXX and start using the 'oc' command.
To access the cluster on local system when using 'oc' run: export KUBECONFIG=/root/ocp-install2/automation/kubeconfig
NOTE: 'oc' on local system will not work for WDC04 and DAL13 DC. Login to bastion system to use 'oc'
Access the OpenShift web-console here: "https://console-openshift-console.apps.test-ocp-c1e3.ibm.com"
Login to the console with user: kubeadmin and password: XXXXXXXXXXXXXXXXXXXXXXXX
Add the following records to your DNS server: <<EOT

api.test-ocp-c1e3.ibm.com.  IN  A  XXX.XXX.XXX.XXX 
*.apps.test-ocp-c1e3.ibm.com.  IN  A  XXX.XXX.XXX.XXX 

EOT
Alternatively, you can add the line on local system 'hosts' file: <<EOT

XXX.XXX.XXX.XXX  api.test-ocp-c1e3.ibm.com console-openshift-console.apps.test-ocp-c1e3.ibm.com integrated-oauth-server-openshift-authentication.apps.test-ocp-c1e3.ibm.com oauth-openshift.apps.test-ocp-c1e3.ibm.com prometheus-k8s-openshift-monitoring.apps.test-ocp-c1e3.ibm.com grafana-openshift-monitoring.apps.test-ocp-c1e3.ibm.com example.apps.test-ocp-c1e3.ibm.com

EOT
[apply] SUCCESS: Congratulations! create command completed
~~~

# 遭遇したトラブル

このようにスクリプト自体は無事完了したのですが、いくつか問題も発生しました。

**(1)workerノードが見えない**

PowerVSのコンソールから「仮想サーバー・インスタンス」を見るとworkerノードがつくられていたのですが、bastionから"oc get nodes"を見るとworkerノードがいませんでした。また、クラスター・オペレーターの状態を見ると、"Available=false"になっているものが多々ありました。

~~~
[root@test-ocp-c1e3-osa21-bastion-0 ~]# oc get nodes
NAME                                   STATUS   ROLES    AGE     VERSION
osa21-master-0.test-ocp-c1e3.ibm.com   Ready    master   3h19m   v1.23.5+3afdacb
osa21-master-1.test-ocp-c1e3.ibm.com   Ready    master   3h19m   v1.23.5+3afdacb
osa21-master-2.test-ocp-c1e3.ibm.com   Ready    master   3h19m   v1.23.5+3afdacb
[root@test-ocp-c1e3-osa21-bastion-0 ~]# oc get co
NAME                                       VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
authentication                             4.10.18   False       False         True       175m    OAuthServerRouteEndpointAccessibleControllerAvailable: Get "https://oauth-openshift.apps.test-ocp-c1e3.ibm.com/healthz": EOF...
baremetal                                  4.10.18   True        False         False      3h18m   
cloud-controller-manager                   4.10.18   True        False         False      3h20m   
cloud-credential                           4.10.18   True        False         False      3h22m   
cluster-autoscaler                         4.10.18   True        False         False      3h18m   
config-operator                            4.10.18   True        False         False      3h19m   
console                                    4.10.18   False       False         False      174m    RouteHealthAvailable: failed to GET route (https://console-openshift-console.apps.test-ocp-c1e3.ibm.com): Get "https://console-openshift-console.apps.test-ocp-c1e3.ibm.com": EOF
csi-snapshot-controller                    4.10.18   True        False         False      3h18m   
dns                                        4.10.18   True        False         False      3h16m   
etcd                                       4.10.18   True        False         False      3h16m   
image-registry                             4.10.18   False       True          True       178m    Available: The deployment does not have available replicas...
ingress                                    4.10.18   False       True          True       174m    The "default" ingress controller reports Available=False: IngressControllerUnavailable: One or more status conditions indicate unavailable: DeploymentAvailable=False (DeploymentUnavailable: The deployment has Available status condition set to False (reason: MinimumReplicasUnavailable) with message: Deployment does not have minimum availability.)
insights                                   4.10.18   True        False         False      3h12m   
kube-apiserver                             4.10.18   True        False         False      3h14m   
kube-controller-manager                    4.10.18   True        False         False      3h15m   
kube-scheduler                             4.10.18   True        False         False      3h15m   
kube-storage-version-migrator              4.10.18   True        False         False      3h19m   
machine-api                                4.10.18   True        False         False      3h17m   
machine-approver                           4.10.18   True        False         False      3h18m   
machine-config                             4.10.18   True        False         False      3h17m   
marketplace                                4.10.18   True        False         False      3h18m   
monitoring                                 4.10.18   False       True          True       163m    Rollout of the monitoring stack failed and is degraded. Please investigate the degraded status error.
network                                    4.10.18   True        True          False      3h19m   Deployment "openshift-network-diagnostics/network-check-source" is not available (awaiting 1 nodes)
node-tuning                                4.10.18   True        False         False      3h18m   
openshift-apiserver                        4.10.18   True        False         False      3h11m   
openshift-controller-manager               4.10.18   True        False         False      3h16m   
openshift-samples                          4.10.18   True        False         False      3h11m   
operator-lifecycle-manager                 4.10.18   True        False         False      3h18m   
operator-lifecycle-manager-catalog         4.10.18   True        False         False      3h17m   
operator-lifecycle-manager-packageserver   4.10.18   True        False         False      3h11m   
service-ca                                 4.10.18   True        False         False      3h19m   
storage                                    4.10.18   True        False         False      3h19m   
[root@test-ocp-c1e3-osa21-bastion-0 ~]#
~~~

まずは、workerノードをなんとかしようと思いました。
最初に、CSRが承認されていないのかな？と思い、CSRをみたものの、全て承認済みの状態になっていました。
次に、workerノードにsshで入ってログを見てみました。すると、大量のエラーが発生していました。なんか変な状態にはまり込んでいるように見えます。
そこで、とりあえずworkerノードを再起動してしばらく待ってみした（笑)。すると、見事workerノードが追加されました。また、クラスター・オペレーターもすべて正常になりました！

~~~
[root@test-ocp-c1e3-osa21-bastion-0 ~]# oc get nodes
NAME                                   STATUS   ROLES    AGE   VERSION
osa21-master-0.test-ocp-c1e3.ibm.com   Ready    master   4h31   v1.23.5+3afdacb
osa21-master-1.test-ocp-c1e3.ibm.com   Ready    master   4h31   v1.23.5+3afdacb
osa21-master-2.test-ocp-c1e3.ibm.com   Ready    master   4h31   v1.23.5+3afdacb
osa21-worker-0.test-ocp-c1e3.ibm.com   Ready    worker   5m48s  v1.23.5+3afdacb
osa21-worker-1.test-ocp-c1e3.ibm.com   Ready    worker   5m45s  v1.23.5+3afdacb
[root@test-ocp-c1e3-osa21-bastion-0 ~]# oc get co
NAME                                       VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
authentication                             4.10.18   True        False         False      10m
baremetal                                  4.10.18   True        False         False      3h40m
cloud-controller-manager                   4.10.18   True        False         False      3h42m
cloud-credential                           4.10.18   True        False         False      3h45m
cluster-autoscaler                         4.10.18   True        False         False      3h40m
config-operator                            4.10.18   True        False         False      3h41m
console                                    4.10.18   True        False         False      9m54s
csi-snapshot-controller                    4.10.18   True        False         False      3h41m
dns                                        4.10.18   True        False         False      3h38m
etcd                                       4.10.18   True        False         False      3h39m
image-registry                             4.10.18   True        False         False      10m
ingress                                    4.10.18   True        False         False      9m41s
insights                                   4.10.18   True        False         False      3h34m
kube-apiserver                             4.10.18   True        False         False      3h36m
kube-controller-manager                    4.10.18   True        False         False      3h37m
kube-scheduler                             4.10.18   True        False         False      3h38m
kube-storage-version-migrator              4.10.18   True        False         False      3h41m
machine-api                                4.10.18   True        False         False      3h39m
machine-approver                           4.10.18   True        False         False      3h40m
machine-config                             4.10.18   True        False         False      3h39m
marketplace                                4.10.18   True        False         False      3h40m
monitoring                                 4.10.18   True        False         False      2m5s
network                                    4.10.18   True        False         False      3h41m
node-tuning                                4.10.18   True        False         False      2m44s
openshift-apiserver                        4.10.18   True        False         False      3h34m
openshift-controller-manager               4.10.18   True        False         False      3h38m
openshift-samples                          4.10.18   True        False         False      3h34m
operator-lifecycle-manager                 4.10.18   True        False         False      3h41m
operator-lifecycle-manager-catalog         4.10.18   True        False         False      3h39m
operator-lifecycle-manager-packageserver   4.10.18   True        False         False      3h34m
service-ca                                 4.10.18   True        False         False      3h41m
storage                                    4.10.18   True        False         False      3h41m
[root@test-ocp-c1e3-osa21-bastion-0 ~]#
~~~

**(2)bootstrapノードが残っている**

terraformモジュールの実行中、以下のようなメッセージが表示されたので、bootstrapノードは自動的に削除されたんだなぁ、親切だなぁ・・・と思っていました。

~~~
[retry_terraform] Deleting the bootstrap node... please wait
~~~

が、PowerVSのコンソールの「仮想サーバー・インスタンス」を表示すると、bootstrapノードが残っていました。
削除に失敗したんですかね・・・それっぽいメッセージは出ていませんでしたが。
しかたないので、PowerVSコンソールで手動で削除しました。

**(３)デプロイをやり直すと、エラー続出**
openshift-install-powervsコマンドを使って、もういちどデプロイを試したいこともあります。
そんなとき、わたしは同じ作業ディレクトリで"var.tfvars"を削除しただけで再実行していました。が、削除したはずの(存在しない)volumeを探しに行ったり、Public Networkの作成に失敗したりと、エラー続出で進めませんでした。
どうやら、以前実行したときの状態をどこかに覚えているようです。
そこで、openshift-install-powervsコマンドを実行するたびに新たなディレクトリを作って再出発するようにしました（再利用できる場合は"var.tfvars"はコピーして使いました）。
すると、エラー続出から抜け出すことが出来ました。
もしかすると、わたしのやり方がどこか間違っていたのかもしれませんが、備忘録的に記載しておきます。

# おまけ：GUIへの簡易的なアクセス

クライアントPCからGUIにアクセスするには、bastionのDNSを参照するようにPCを設定するか、hostsにOCPクラスター関連のIPアドレス/ホスト名を追加します。
ただ、クライアントPCの設定は変えたくない・・・。
ということで、bastionにvncserverを立てて、そこのfirefoxを使ってアクセスしました。


まず、bastionにGUI環境とvncserver入れて、vncserverを起動します。

~~~
dnf -y group install "Server with GUI"
dnf -y install tigervnc-server
firewall-cmd --permanent --add-port=5901/tcp --permanent
firewall-cmd --reload
vncserver
~~~

ただし、PowerVSのインスタンスにインターネット側からアクセスできるポートには制限があるので、5901には直接つなぐことはできません。
わたしは、sshでport forwardしてつなぎました。


~~~
ssh -i ~/.ssh/pvsbastion root@<bastionの外部IP> -L 5901:<bastionのIPアドレス>:5901
~~~

これで、クライアントPCのvncviewerで"localhost:5901"を開くことで、bastionのデスクトップへアクセス出来ました。

# まとめ

いろいろトラブルは有りましたが、結局１日ほどでPowerVS上にOCPクラスターをデプロイすることができました。
今後は、PowerVS上でのOne Node OpenShiftの導入などにチャレンジしてみたいと思います。