Red Hat OpenShift Local(CodeReady Container) は HDD 環境では構成できない．それでも HDD 環境で運用したい

## TL;DR
話が長くなるので最初にサマリーします。

前提には明記してありませんが、Red Hat OpenShift Local(CodeReady Container) は HDD 環境では構成できません。
SSD 環境を用意してください。
どうしても HDD 環境で運用したい場合、SSD 環境で正常に構築し、フォルダーを丸ごと 導入済み・構築に失敗した HDD 環境コピーすれば動きます。


## X230 + HDDで挑戦

OpenShift の学習をしようと思いたち Red Hat OpenShift Local(CodeReady Container) の導入を試みました。

前提は「[スタートガイド](https://access.redhat.com/documentation/ja-jp/red_hat_codeready_containers/2.0/html/getting_started_guide/installation_gsg)」によれば、こうなっています。

> 2.1.1.1. OpenShift Container Platform の場合
物理 CPU コア 4 個
空きメモリー 9 GB
ストレージ領域の 35 GB

空きメモリーが 9 GB ということは、実メモリーが 16GB いりそうです。
手元にある 16GB のメモリーが使えるテスト環境は Lenovo ThinkPad X230 しかありませんでした。
どれだけ重いか不明ですが、とりあえず、ここに入れようと思いました。
Windows 10 が出てた当時に Windows 10 Pro のライセンスを認証済みです。

## 「crc start」 が「Error waiting for apiserver」で失敗
導入手順は検索するといろ出てくるので省略します。
「crc start」を実行するとが「Error waiting for apiserver」で失敗してしまいました。

```
C:\Users\User01>crc start -p Downloads\pull-secret.txt
INFO Checking if running in a shell with administrator rights
INFO Checking Windows 10 release
INFO Checking Windows edition
INFO Checking if Hyper-V is installed and operational
INFO Checking if crc-users group exists
INFO Checking if current user is in Hyper-V Admins group
INFO Checking if Hyper-V service is enabled
INFO Checking if vsock is correctly configured
INFO Checking if daemon task is installed
INFO Checking if daemon task is running
INFO Checking admin helper service is running
INFO Loading bundle: crc_hyperv_4.10.12_amd64...
INFO Creating CRC VM for OpenShift 4.10.12...
INFO Generating new SSH Key pair...
INFO Generating new password for the kubeadmin user
INFO Starting CRC VM for OpenShift 4.10.12...
INFO CRC instance is running with IP 127.0.0.1
INFO CRC VM is running
INFO Updating authorized keys...
INFO Check internal and public DNS query...
INFO Check DNS query from host...
WARN Failed to query DNS from host: lookup foo.apps-crc.testing: no such host
INFO Verifying validity of the kubelet certificates...
INFO Starting OpenShift kubelet service
INFO Waiting for kube-apiserver availability... [takes around 2min]
Error waiting for apiserver: Temporary error: ssh command error:
command : timeout 5s oc get nodes --context admin --cluster crc --kubeconfig /opt/kubeconfig
err     : Process exited with status 124
 (x5)
Temporary error: ssh command error:
command : timeout 5s oc get nodes --context admin --cluster crc --kubeconfig /opt/kubeconfig
err     : Process exited with status 1
 (x19)
Temporary error: ssh command error:
command : timeout 5s oc get nodes --context admin --cluster crc --kubeconfig /opt/kubeconfig
err     : Process exited with status 124
 (x30)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/ad3fcaf6-3a87-806e-e7ba-5685e5bad78e.png)

「**WARN Failed to query DNS from host: lookup foo.apps-crc.testing: no such host**」で名前解決の警告が出た後「**Error waiting for apiserver: Temporary error: ssh command error:**」で apiserver 待ちでエラーです。

だた、この状態でも「Red Hat Open ShiftLocal」のアイコンから確認すると「Running」です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/d0b1bd9a-32bc-c89e-40b0-1e1d6e785383.png)

「crc status」の「OpenShift:」が「Unreachable」なのは気になりますが、何もできないわけではありません。

```
C:\Users\User01>crc status
CRC VM:          Running
OpenShift:       Unreachable (v4.10.12)
Podman:
Disk Usage:      12.47GB of 32.74GB (Inside the CRC VM)
Cache Usage:     18.12GB
Cache Directory: C:\Users\User01\.crc\cache
```

「developer」ではログインできます。
(oc.exe が .crc の深いところに導入されPATHが通っていないのに注意です)

```
C:\Users\User01>crc console --credentials
To login as a regular user, run 'oc login -u developer -p developer https://api.crc.testing:6443'.
To login as an admin, run 'oc login -u kubeadmin -p QZEiU-6qXPx-qiYKN-sEuSS https://api.crc.testing:6443'

C:\Users\User01>.crc\bin\oc\oc.exe login -u developer -p developer https://api.crc.testing:6443
The server uses a certificate signed by an unknown authority.
You can bypass the certificate check, but any data you send to the server could be intercepted by others.
Use insecure connections? (y/n): y

Login successful.

You don't have any projects. You can try to create a new project, by running

    oc new-project <projectname>

Welcome! See 'oc help' to get started.
```

Web Console 「https://console-openshift-console.apps-crc.testing/」にも 「developer」ならログインできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/e1650bca-6e92-b748-a56c-e1a53b1c35ba.png)

出来ないのは「kubeadmin」でのログインです。
「kubeadmin」のパスワードを確認してログインしてみますが、401 でログインできません。

```
C:\Users\User01>crc console --credentials
To login as a regular user, run 'oc login -u developer -p developer https://api.crc.testing:6443'.
To login as an admin, run 'oc login -u kubeadmin -p QZEiU-6qXPx-qiYKN-sEuSS https://api.crc.testing:6443'

C:\Users\User01>.crc\bin\oc\oc.exe login -u kubeadmin -p QZEiU-6qXPx-qiYKN-sEuSS https://api.crc.testing:6443
Login failed (401 Unauthorized)
Verify you have provided correct credentials.
```

## エラーは DNS の警告のせい? Hyper-V の仮想スイッチの構成で直る? 

気になるのは「**WARN Failed to query DNS from host: lookup foo.apps-crc.testing: no such host**」です。
Windows Hyper-V 環境の CodeReady Containers のトラブルシューティングの情報を見ると、Hyper-V の Default Switch の DNS 設定が正しくされないので PowerShell で修正するようにという情報が多数見られます。
まだ「crc」という名前のスイッチを作れば、そちらが使われるから DNS の問題は起きないという情報もありました。

ただ、私の考えではこの情報は**現在**の Hyper-V 上の CodeReady Containers には当てはまりません。
は**現在**の Hyper-V 上の CodeReady Containers VM「crc」は NIC を持たず、Hyper-V のスイッチに接続されていないからです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/282d1cb3-bbbd-047d-ac01-fa019baf536d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/bd985c57-9b1c-7ae3-03cf-89b71de7a7d7.png)

**現在**の Hyper-V 上の CodeReady Containers は「127.0.0.1」で稼働していますが、これまでの情報を見ると「172.x.x.x」で稼働しているのが見て取れます。
これは、その時点の構成が Hyper-V の Default Switch に接続されていたからでしょう。

## Windows をやめて Linux なら ?
Windows 環境および Hyper-V の問題である可能性を捨てられなかったので X230 の OS を Linux に変更してテストしてみました。
(気軽に OS をスクラッチできるのがテスト機のいいところです。古臭いマシンですが…)

結果は下記のとおりです。

* DNS の警告は出ない
* しかし apiserver の起動待ちのタイムアウトは同じく発生する
* developer ではログインできるが kubeadmin ではログインできない
* 仮想環境にネットワーク「crc」は作成される

DNS の警告が出なくでも、結局 kubeadmin ではログインできません。
やはり、名前解決の問題ではないようです。

## 発見! 理由は HDD 環境だから。SSD 環境ならうまくいく

Hyper-V の仮想スイッチの問題ではないのが明確になったので、視点を変えて Web 検索をしました。
ありました。**HDD だったのがいけなくで SSD に載せ替えたらうまくいった!!**

https://www.chadduffey.com/2022/01/OpenShift1.html

何それ!!!!!!!!

## SDD　のPCでやってみる

テスト用ではないのですが、16GB のメモリーを積んだ Toshiba の PC があったので、そちらで構築してみます。
(実利用環境なのと SSD の空き容量が少なく、今回のテスト用には使いたくないのですが、確認のために我慢します)

```
C:\Users\User01>crc start -p Downloads\pull-secret.txt
INFO Checking if running in a shell with administrator rights
INFO Checking Windows 10 release
INFO Checking Windows edition
INFO Checking if Hyper-V is installed and operational
INFO Checking if crc-users group exists
INFO Checking if current user is in Hyper-V Admins group
INFO Checking if Hyper-V service is enabled
INFO Checking if vsock is correctly configured
INFO Checking if daemon task is installed
INFO Checking if daemon task is running
INFO Checking admin helper service is running
INFO Loading bundle: crc_hyperv_4.10.12_amd64...
INFO Creating CRC VM for OpenShift 4.10.12...
INFO Generating new SSH Key pair...
INFO Generating new password for the kubeadmin user
INFO Starting CRC VM for OpenShift 4.10.12...
INFO CRC instance is running with IP 127.0.0.1
INFO CRC VM is running
INFO Updating authorized keys...
INFO Check internal and public DNS query...
INFO Check DNS query from host...
WARN Failed to query DNS from host: lookup foo.apps-crc.testing: no such host
INFO Verifying validity of the kubelet certificates...
INFO Starting OpenShift kubelet service
INFO Waiting for kube-apiserver availability... [takes around 2min]
INFO Adding user's pull secret to the cluster...
INFO Updating SSH key to machine config resource...
INFO Waiting for user's pull secret part of instance disk...
INFO Changing the password for the kubeadmin user
INFO Updating cluster ID...
INFO Updating root CA cert to admin-kubeconfig-client-ca configmap...
INFO Starting OpenShift cluster... [waiting for the cluster to stabilize]
INFO 3 operators are progressing: image-registry, openshift-controller-manager, service-ca
INFO 3 operators are progressing: image-registry, openshift-controller-manager, service-ca
INFO 3 operators are progressing: image-registry, openshift-controller-manager, service-ca
INFO 3 operators are progressing: image-registry, openshift-controller-manager, service-ca
INFO 3 operators are progressing: image-registry, openshift-controller-manager, service-ca
INFO 2 operators are progressing: image-registry, openshift-controller-manager
INFO Operator openshift-controller-manager is progressing
INFO Operator openshift-controller-manager is progressing
INFO 2 operators are progressing: kube-apiserver, openshift-controller-manager
INFO 3 operators are progressing: authentication, kube-apiserver, openshift-controller-manager
INFO Operator openshift-controller-manager is progressing
INFO Operator openshift-controller-manager is progressing
INFO Operator openshift-controller-manager is progressing
INFO Operator openshift-controller-manager is progressing
INFO Operator openshift-controller-manager is progressing
ERRO Cluster is not ready: cluster operators are still not stable after 10m3.4118663s
INFO Adding crc-admin and crc-developer contexts to kubeconfig...
Started the OpenShift cluster.

The server is accessible via web console at:
  https://console-openshift-console.apps-crc.testing

Log in as administrator:
  Username: kubeadmin
  Password: UPBcm-gbnF4-n24i4-daNfm

Log in as user:
  Username: developer
  Password: developer

Use the 'oc' command line interface:
  > @FOR /f "tokens=*" %i IN ('crc oc-env') DO @call %i
  > oc login -u developer https://api.crc.testing:6443
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/1c31e15b-0085-4430-b5c4-05f7de820525.png)

**構成できました!!!**

「**WARN Failed to query DNS from host: lookup foo.apps-crc.testing: no such host**」は、相変わらずでていますね。

ただし「**INFO Waiting for kube-apiserver availability... [takes around 2min]**」は失敗していません。

「**INFO Changing the password for the kubeadmin user**」が出ているので  kubeadmin のパスワードを予定したものに設定できたのでしょう。
HDD の場合はこれ以前のステップで異常終了したので、kubeadmin のパスワードを予定したものに設定しなかったのでしょう。予定していたもの(表示されるもの)とは違うのでログインできなかったのは当然ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/9e9288ae-c78b-2a80-857a-d65287db526b.png)

「**ERRO Cluster is not ready: cluster operators are still not stable after 10m3.4118663s**」が出ています。
起動に時間がかかっているだけのようなので、しばらく待ちます。

「crc status」も問題ないようです。

```
C:\Users\User01>crc status
CRC VM:          Running
OpenShift:       Running (v4.10.12)
Podman:
Disk Usage:      14.71GB of 32.74GB (Inside the CRC VM)
Cache Usage:     18.12GB
Cache Directory: C:\Users\User01\.crc\cache
```

「crc console --credentials」でパスワードを含めたログインパラメーターを確認します。

```
C:\Users\User01>crc console --credentials
To login as a regular user, run 'oc login -u developer -p developer https://api.crc.testing:6443'.
To login as an admin, run 'oc login -u kubeadmin -p UPBcm-gbnF4-n24i4-daNfm https://api.crc.testing:6443'
```

oc.exe の場所に注意してログインします。

```
C:\Users\User01>C:\Users\User01\.crc\bin\oc\oc.exe login -u kubeadmin -p UPBcm-gbnF4-n24i4-daNfm https://api.crc.testing:6443
Login successful.

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

Using project "default".
```

**問題なくログイン出来ました!!**
HDD が遅すぎだったのです。これまでの時間を返せ！つまり、貧乏は敵です。

## それでも HDD 環境の X230 にテスト環境を作りたい
X230 のテスト環境を HDD から SATA の SSD に載せ替えれば、OK なのかもしれません。数千円程度の出費で済むでしょう。

でももう少しあがきます。
SSD 機にはセットアップ済みの VM があります。
これを HDD の X230 にコピーしてきたらどうなるでしょうか？

ユーザーディレクトリの下に「.crc」「.kube」「.redhat」のディレクトリが出来ています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/ff57ffae-0b59-6a05-659a-9b2c4a89ef8b.png)

crc VM の仮想ディスクは「.crc」の下のこちらにあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/465e5e5e-3338-9880-a196-f96e24e4a49a.png)

crc VM の構成情報も「.crc」の下のこちらにあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/c7e3147e-a3a6-663c-b5cf-939091c1a9e0.png)

X230 とToshiba の両方で VM を停止します。

```
C:\Users\User01>crc stop
INFO Stopping kubelet and all containers...
INFO Stopping the instance, this may take a few minutes...
Stopped the instance
```

X230 で crc VMを削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/1587a97b-10b4-9f9a-8dc0-d5d032fca205.png)


コピー先の「.crc」「.kube」「.redhat」を削除します。
ログファイルが削除できませんでした。

「.crc」「.kube」「.redhat」を正常に構成できた Toshiba から X230にコピーします。
削除できなかったログファイルはコピー時にスキップします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/e01dcee0-627e-2b98-14ff-a09964446af7.png)

hyper-V マネージャー でコピーした crc VM をインポートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/8423082b-dca1-4523-8fee-e4a9ee74ba88.png)

VM のホルダーは「C:\Users\User01\.crc\machines\crc\crc\Virtual Machines\」です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/ea784043-53fc-8acb-c322-f1f8df950c40.png)

名前には「crc」を指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/946e1d9a-b3ad-30d0-dc6c-b5ae7f8842fd.png)

インプレースで登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/c091648c-b7e9-cfdc-a4e1-298f8f72bd7f.png)

仮想ディスクのフォルダーを指定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/056cfc21-4dbc-6f18-3f85-c37e0f004e06.png)


インポートが終わったら「crc start」で開始します。

```
C:\Users\User01>crc start
INFO Checking if running in a shell with administrator rights
INFO Checking Windows 10 release
INFO Checking Windows edition
INFO Checking if Hyper-V is installed and operational
INFO Checking if crc-users group exists
INFO Checking if current user is in Hyper-V Admins group
INFO Checking if Hyper-V service is enabled
INFO Checking if vsock is correctly configured
INFO Checking if daemon task is installed
INFO Checking if daemon task is running
INFO Checking admin helper service is running
INFO Loading bundle: crc_hyperv_4.10.12_amd64...
INFO Starting CRC VM for OpenShift 4.10.12...
INFO CRC instance is running with IP 127.0.0.1
INFO CRC VM is running
INFO Check internal and public DNS query...
INFO Check DNS query from host...
WARN Failed to query DNS from host: lookup foo.apps-crc.testing: no such host
INFO Verifying validity of the kubelet certificates...
INFO Starting OpenShift kubelet service
INFO Waiting for kube-apiserver availability... [takes around 2min]
Error waiting for apiserver: Temporary error: ssh command error:
command : timeout 5s oc get nodes --context admin --cluster crc --kubeconfig /opt/kubeconfig
err     : Process exited with status 124
 (x6)
Temporary error: ssh command error:
command : timeout 5s oc get nodes --context admin --cluster crc --kubeconfig /opt/kubeconfig
err     : Process exited with status 1
 (x9)
Temporary error: ssh command error:
command : timeout 5s oc get nodes --context admin --cluster crc --kubeconfig /opt/kubeconfig
err     : Process exited with status 124
 (x29)
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/82434bda-97da-354b-125d-1e0ead24b85f.png)

「Error waiting for apiserver」のエラーは相変わらず出ますが、kubeadmin のパスワードセットなどは終わっているので、これで利用できるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/539819ed-6a78-1aa8-5b36-8aa43a34d4ca.png)


「OpenShift:       Running (v4.10.12)」になっています。

```
C:\Users\User01>crc status
CRC VM:          Running
OpenShift:       Running (v4.10.12)
Podman:
Disk Usage:      15.05GB of 32.74GB (Inside the CRC VM)
Cache Usage:     18.12GB
Cache Directory: C:\Users\User01\.crc\cache
```



kubeadmin で oc.exe login できました。

```
C:\Users\User01>crc console --credentials
To login as a regular user, run 'oc login -u developer -p developer https://api.crc.testing:6443'.
To login as an admin, run 'oc login -u kubeadmin -p UPBcm-gbnF4-n24i4-daNfm https://api.crc.testing:6443'

C:\Users\User01>.crc\bin\oc\oc.exe login -u kubeadmin -p UPBcm-gbnF4-n24i4-daNfm https://api.crc.testing:6443
Login successful.

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

Using project "default".
```

web console 「https://console-openshift-console.apps-crc.testing/」にも kubeadmin でアクセスできました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/9cdd769c-0692-7874-4909-ce36cd767044.png)


環境のリセットが必要な時は、再構築ではなく vdisk のコピーですね。

## crc start ではなくHyper-V マネージャー からの vm の開始では?

crc start で、異常終了するのを毎回期待するのも気持ちが悪いので、Hyper-V マネージャー からの vm の開始で運用出来ないか検証します。


「crc stop」で停止して「crc status」で止まったことを確認します。

```
C:\Users\User01>crc stop
INFO Stopping kubelet and all containers...
INFO Stopping the instance, this may take a few minutes...
Stopped the instance

C:\Users\User01>crc status
CRC VM:          Stopped
OpenShift:       Stopped (v4.10.12)
Podman:
Disk Usage:      0B of 0B (Inside the CRC VM)
Cache Usage:     18.12GB
Cache Directory: C:\Users\User01\.crc\cache
```

Hyper-V マネージャー からの crc vm を開始します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/a3d9fa13-9bb3-59f9-2450-cd23d481134d.png)


VM は Running ですが、OpenShift は Unreachable です。

```
C:\Users\User01>crc status
CRC VM:          Running
OpenShift:       Unreachable (v4.10.12)
Podman:
Disk Usage:      15.64GB of 32.74GB (Inside the CRC VM)
Cache Usage:     18.12GB
Cache Directory: C:\Users\User01\.crc\cache
```

さらに待つとアクセスエラーが出るようになりました。
ポートへの接続はできるが、正常に応答を返していないようです。
すこし進みましたね。

```
C:\Users\User01>crc status
E0530 09:41:38.149055    4640 request.go:1085] Unexpected error when reading response body: net/http: request canceled (Client.Timeout or context cancellation while reading body)
CRC VM:          Running
OpenShift:       Unreachable (v4.10.12)
Podman:
Disk Usage:      17.13GB of 32.74GB (Inside the CRC VM)
Cache Usage:     18.12GB
Cache Directory: C:\Users\User01\.crc\cache
```

さらに待つと「Starting」になりました。

```
C:\Users\User01>crc status
CRC VM:          Running
OpenShift:       Starting (v4.10.12)
Podman:
Disk Usage:      17.16GB of 32.74GB (Inside the CRC VM)
Cache Usage:     18.12GB
Cache Directory: C:\Users\User01\.crc\cache
```

kubeadmin でログインしてみます。
しばらくはエラーが出ました。

```
C:\Users\User01>.crc\bin\oc\oc.exe login -u kubeadmin -p UPBcm-gbnF4-n24i4-daNfm https://api.crc.testing:6443
Unable to connect to the server: read tcp 127.0.0.1:65357->127.0.0.1:443: wsarecv: An existing connection was forcibly closed by the remote host.
```

しかし、十分にまってからアクセスるするとログインできました。

```
C:\Users\User01>.crc\bin\oc\oc.exe login -u kubeadmin -p UPBcm-gbnF4-n24i4-daNfm https://api.crc.testing:6443
Login successful.

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

Using project "default".
```

Webコンソールもログインもできました。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/14b204e5-15a1-d8b3-1e61-52cef4caf57f.png)

ただ結局「running」にはなりません。Unreachable と Starting の繰り返しです。

```
C:\Users\User01>crc status
CRC VM:          Running
OpenShift:       Unreachable (v4.10.12)
Podman:
Disk Usage:      0B of 0B (Inside the CRC VM)
Cache Usage:     18.12GB
Cache Directory: C:\Users\User01\.crc\cache
```

oc login も不安定です。

```
C:\Users\User01>.crc\bin\oc\oc.exe login -u kubeadmin -p UPBcm-gbnF4-n24i4-daNfm https://api.crc.testing:6443
error: server_error The authorization server encountered an unexpected condition that prevented it from fulfilling the request.
```
やはり、VM の直接起動には無理があるようです。

まあ、SSD に積み替えればこんな苦労もしなくていいのですが。
無理に HDD 環境を使ってレスポンスが悪くてイライラする必要もありません。

---
このサイトにおける掲載内容はあくまで私自身の見解であり、必ずしも私の所属団体・企業における立場、戦略、意見を代表するものではありません。 記載内容に関し団体・企業へのお問い合わせは、ご遠慮ください。