はじめに
「概要編」では、PowerVSにOCP 4.10を導入するとき、既存ガイドからどんな変更点が必要だったのか、ざっくりご説明しました。こちらの「詳細編」では、以下の3つの手順にわけて、もうちょっと詳しく実施した手順をご紹介したいと思います。
- OCP導入のためのPowerVSの準備
- RHCOSのOVAイメージを作成して、PowerVSに登録
- 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からインポートを実行しても、すぐにはブートイメージに反映されません。わたしの場合は1時間くらい経ってからリロードしたら、画面上に出てきました。あわてず、気長に待ちましょう。
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
実行完了まで1時間以上必要でした。
また、何度か以下のような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コンソールで手動で削除しました。
(3)デプロイをやり直すと、エラー続出
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のデスクトップへアクセス出来ました。
まとめ
いろいろトラブルは有りましたが、結局1日ほどでPowerVS上にOCPクラスターをデプロイすることができました。
今後は、PowerVS上でのOne Node OpenShiftの導入などにチャレンジしてみたいと思います。