Desktop 用の OpenShift (CRC : Code Ready Container) を Windows 10にインストールする。


# 必要スペック

Desktop 用の `OpenShift` である `CRC (Code Ready Container)` をインストールしてみます。`OpenShift 3`で使われていた`MniniShift` の `OpenShift 4` 版の、シングルノードの`OpenShift`です。([GitHub のレポジトリへのリンク](https://github.com/code-ready/crc))

今回使用した、`CRC` `1.34` の必要スペックは、マニュアルによると以下の通りです。

```
4物理CPUコア
9 GByte Mem
35 GByte Disk
```

作成されるのは、Single Node (`Master` 兼 `Worker`) の`OpenShift` 環境になりますが、バニラ`Kubernetes` (素の`Kubernetes`) に較べると、いろいろ入って居るので結構、CPU / Memory が必要のようです。

:::note warn
この仮想マシンですが、Windowsの場合、DドライブをCRCのインストールディレクトリに指定しても、仮想マシンの本体は C:\Users\User名\.crcというディレクトリの配下に作成されるので、Cドライブの容量が必要です。
:::

また私の環境は `Windows 10 Professional`ですが、Windows としての Requirement に、`Windows 10 Fall Creators Update (version 1709) or newer`とあり、`Home Edition` はサポートされてないようです。特に記述はありませんが、`Hyper-V`が使用されます。

マニュアルの Hardware / Software Requirement ページは以下です。
https://access.redhat.com/documentation/en-us/red_hat_codeready_containers/1.34/html/getting_started_guide/installation_gsg#minimum-system-requirements_gsg

# ダウンロード

Red Hatのアカウントにログインします。(アカウントの作成は無料です）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/edef9a7b-8238-1134-6404-171dfacd9997.png)

ログイン後、メニューからダウンロードページまで辿ってもいいのですが、以下のリンクをクリックすると直接ダウンロードページに飛べます。
https://developers.redhat.com/download-manager/link/3868678

私の環境は Windows なので、Windows を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/0eac9baf-93aa-519e-2839-c00c7160da6d.png)

オレンジの枠で囲った部分をダウンロードします。`CRC`本体と`pull secret`と呼ばれるクレデンシャルのファイルです。

後は以下のマニュアルに従ってセットアップするだけです。

https://access.redhat.com/documentation/en-us/red_hat_codeready_containers/1.34

マニュアルは事、細かに手順が書いているので、この記事では上記のマニュアルを参考にしながら、必要最小限の所だけピックアップした手順にとどめます。

# インストール

前述のマニュアルを読みながらインストールを進めて行きます。

ダウンロードしたファイルを解凍すると、インストーラーが出てくるので実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/9c38bcf6-714f-c622-c426-da2442dfec2a.png)

「次へ」で完了するタイプのインストーラーです。特に難しいインストーラーではないので、細かいキャプチャーは省略します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/7a209b7f-b2af-1aeb-03d8-72ba44566267.png)

インストールの最後に、再起動を要求されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/e01c916c-13be-63f7-b945-8beacb808f04.png)

インストール自体は、Windowsの再起動で完了です。

# CRCを起動する

Windwos 再起動後は、`crc start` で `CRC`を起動する事ができます。
このコマンドを実行すると`Hyper-V`上で`CRC`の仮想マシンが起動しますが、`Hyper-V`を特に意識する必要はありません。

```
C:\Users\yuhki>crc start
<省略>
INFO Check DNS query from host...
WARN Failed to query DNS from host: lookup foo.apps-crc.testing: no such host  # このWarningが出ても動作は問題なさそう
INFO Verifying validity of the kubelet certificates...
<省略>
INFO Updating root CA cert to admin-kubeconfig-client-ca configmap...
INFO Starting OpenShift cluster... [waiting for the cluster to stabilize]
INFO Operator openshift-apiserver is degraded
INFO Operator openshift-controller-manager is progressing
INFO All operators are available. Ensuring stability...
INFO Operators are stable (2/3)...
INFO Operators are stable (3/3)...
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: UNHGv-6mXfD-FC4Mb-GgwMb

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
C:\Users\yuhki>

```

:::note info
GUIでも「crc start」と同じ操作に相当する 「start」というメニューがあります。
そちらを使った場合、pull secret (はじめの方の手順で、Red Hat のサイトからダウンロードしたクレデンシャルファイル) の入力を求められる事がありました。何度か削除、再インストールして、この手順を書いたのですが、CLIでは今の所、クレデンシャルの入力を要求された事はありませんでした。(GUIがクレデンシャルの入力を求めてきたタイミングで、クレデンシャルを入力せずGUIでの作業を止めて、CLIでの作業に切り替えてもCLIの場合はクレデンシャルを求められませんでした。)
:::

コマンド出力の最後に `kubeadmin` と `developer` というユーザーのパスワードが出力されます。

表示された `kubeadmin` とそのパスワードで、ログインしてみます。

```
C:\Users\yuhki>oc.exe login -u kubeadmin -p UNHGv-6mXfD-FC4Mb-GgwMb 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".

C:\Users\yuhki>
```

問題なさそうです。

通常の`OpenShift`では、`kubectl`も使えますが、同じように使えるか試して見ます。

```
C:\Users\yuhki>kubectl get nodes
NAME                 STATUS   ROLES           AGE   VERSION
crc-dzk9v-master-0   Ready    master,worker   11d   v1.22.0-rc.0+894a78b

C:\Users\yuhki>
```

`kubectl`も行けるようです。

次に、ブラウザを起動するには以下のコマンドを実行します。

```
crc console
```

以下のようにブラウザーが立ち上がりコンソールの URLも自動入力してくれ、ログイン画面が出てくるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/592ef76d-dc4b-2cec-54c1-b582847bd8cc.png)

# WSLからCRCにアクセスする

`kubectl` / `oc` コマンドを使用する時に Linux の `grep` 等はよく使うと思います。Windows でも同様な事ができますが、Linux の各種ツールがないと苦しいので、`WSL`から`CRC`にアクセスできるようにセットアップしてみます。


`WSL`から `Code Ready Container` にアクセスする方法については、そのままではできないようで、以下の `GitHub`の issueが上がっています。

https://github.com/code-ready/crc/issues/374
https://github.com/code-ready/crc/issues/2641

いろいろ書いているのですが、現在では当てはまらない記述もあるようです。`CRC`側でどうにかできる問題というより`Windows`側の設定を工夫してあげる必要があるようです。

`GitHub` の `issue` を参考にしつつ、いろいろ実験してみた所、`WSL`の `/etc/hosts` を編集するだけで、`WSL`から`CRC`にアクセスできるようになりました。

## WSLからCRCにアクセスできるようにするための設定

以下、手順になります。

WSLの Linux マシン上で `/etc/hosts` を開きます。

```
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateHosts = false
127.0.0.1       localhost
<省略>
127.0.0.1       api.crc.testing canary-openshift-ingress-canary.apps-crc.testing        console-openshift-console.apps-crc.testing      default-route-openshift-image-registry.apps-crc.testing downloads-openshift-console.apps-crc.testing    kubernetes.docker.internal      oauth-openshift.apps-crc.testing
<省略>
```

`127.0.0.1      api.crc.testing ....`という、`CRC`が使っているドメインのエントリーがあるので、その部分の`127.0.0.1`のループバックIPアドレスを、自分のPCのローカルIPに変更します。自分のPCのローカルIPが`192.168.11.19`の場合、以下のようになります。

```
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateHosts = false
127.0.0.1       localhost
<省略>
192.168.11.19(←これを書き替えた)       api.crc.testing canary-openshift-ingress-canary.apps-crc.testing        console-openshift-console.apps-crc.testing      default-route-openshift-image-registry.apps-crc.testing downloads-openshift-console.apps-crc.testing    kubernetes.docker.internal      oauth-openshift.apps-crc.testing
<省略>
```

のようにします。

:::note warn
このエントリーはCRCの停止のタイミングで？書き替えられて元に戻る事があるようなので、以下のように作業をシェル化しておいた方が良いでしょう。私はWSLを開き直すと書き替えが再実行されるように「~/.bash_profile」 に以下を加えました。(ただ、書き換わらない事もあり、いまいち条件が掴めてません)
:::


```~/.bash_profile
<省略>
export PASSWORD=<rootのパスワード>
echo $PASSWORD | sudo -S sed -i -e '/api.crc.testing/s/127.0.0.1/<ローカルIPアドレス>/g' /etc/hosts  > /dev/null 2>&1
```


次に、Windows のドライブにある`CRC`が生成した `kubeconfig` を `KUBECONFIG` にセットします。`kubeconfig`は、`C:\Users\<ユーザー名>\.crc\machines\crc\`の下に作られています。これも`~/.bash_profile` 等に書き加えておくと良いと思います。

```
$ export KUBECONFIG=/mnt/c/Users/<user名>/.crc/machines/crc/kubeconfig
```

`oc login` できるか確認します。

```
$ oc login -u kubeadmin -p dUL4c-LvQGC-q4nXS-6znZz 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".
```

適当にコマンドを打って動作確認してみましょう。ここでは、`oc get nodes` を実行しています。


```
$ oc get nodes
NAME                 STATUS   ROLES           AGE   VERSION
crc-dzk9v-master-0   Ready    master,worker   12d   v1.22.0-rc.0+894a78b
$
```

# 良く使うコマンド

**CRCの起動**

```
crc start
```

**CRCの停止**

```
crc stop
```

**CRCの状態の確認**

```
crc status
```


**デフォルトのブラウザでOpenShiftのコンソールを開く**

```
crc console
```

# マニア向けの情報

<details><summary>`CRC`のデフォルトで起動している`Cluster Operator`の一覧</summary><div>

```
$ oc get co
NAME                                       VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
authentication                             4.9.0     True        False         False      10h
config-operator                            4.9.0     True        False         False      12d
console                                    4.9.0     True        False         False      10h
dns                                        4.9.0     True        False         False      10h
etcd                                       4.9.0     True        False         False      12d
image-registry                             4.9.0     True        False         False      10h
ingress                                    4.9.0     True        False         False      12d
kube-apiserver                             4.9.0     True        False         False      12d
kube-controller-manager                    4.9.0     True        False         False      12d
kube-scheduler                             4.9.0     True        False         False      12d
machine-api                                4.9.0     True        False         False      12d
machine-approver                           4.9.0     True        False         False      12d
machine-config                             4.9.0     True        False         False      12d
marketplace                                4.9.0     True        False         False      12d
network                                    4.9.0     True        False         False      12d
node-tuning                                4.9.0     True        False         False      10h
openshift-apiserver                        4.9.0     True        False         False      51s
openshift-controller-manager               4.9.0     True        False         False      10h
openshift-samples                          4.9.0     True        False         False      12d
operator-lifecycle-manager                 4.9.0     True        False         False      12d
operator-lifecycle-manager-catalog         4.9.0     True        False         False      12d
operator-lifecycle-manager-packageserver   4.9.0     True        False         False      3m14s
service-ca
$
```
`VMware`上に通常インストールした `4.8.10` の `OpenShift` と比較すると以下の `Cluster Operator` がありませんでした。

```
baremetal
cloud-credential
cluster-autoscaler
insights
csi-snapshot-controller
kube-storage-version-migrator
monitoring
storage
```
</div>

<details><summary>`PV`の取り扱い</summary><div>

事前に`100Gi`の`PV`が30個作られていました。これらを`PVC`を通して使用する事になりそうです。
`PV`のうち一つは、`OpenShift`に付属しているContainer Registryに既に使用されていました。

```
$ oc get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                                                 STORAGECLASS   REASON   AGE
pv0001   100Gi      RWO,ROX,RWX    Recycle          Bound       openshift-image-registry/crc-image-registry-storage                           12d
pv0002   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0003   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0004   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0005   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0006   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0007   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0008   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0009   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0010   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0011   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0012   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0013   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0014   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0015   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0016   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0017   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0018   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0019   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0020   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0021   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0022   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0023   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0024   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0025   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0026   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0027   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0028   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0029   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
pv0030   100Gi      RWO,ROX,RWX    Recycle          Available                                                                                 12d
```

</div>



<details><summary>`Cluster Monitoring`の有効化 (Memory富豪向け)</summary><div>

仮想マシンに割り当てる Memory を 14GiB に増やす事でさらに `Cluster Monitoring` を使用する事ができます。
(14GiB以下だと設定をしても Warningで仮想マシンが起動しません) 

**Cluster Monitoring を有効化する**

```
crc config set enable-cluster-monitoring true
```

**仮想マシンへの Memory の割り当てを 14 GiB に増やす**

```
crc config set memory 14336
```

**設定の確認**

```
C:\Users\yuhki>crc config view
- consent-telemetry                     : no
- enable-cluster-monitoring             : true
- memory                                : 14336

C:\Users\yuhki>
```

仮想マシンを再起動します。

```
$ oc get co | grep monitoring
monitoring                                 4.9.0     True        False         False      12m
```

monitoring の Cluster Operator が稼働している事がわかります。
`project` 名 `openshift-monitoring` に移動して `Cluster Monitoring` 用の `Pod`が起動しているか確認します。

```
$ oc project openshift-monitoring
Now using project "openshift-monitoring" on server "https://api.crc.testing:6443".
$ oc get pods
NAME                                           READY   STATUS    RESTARTS      AGE
alertmanager-main-0                            5/5     Running   0             13m
cluster-monitoring-operator-55c84d8bc5-fgq4h   2/2     Running   2 (13m ago)   14m
grafana-7bddb8d546-xrccg                       2/2     Running   0             13m
kube-state-metrics-5f6567c8f8-vh5jc            3/3     Running   0             13m
node-exporter-szgqm                            2/2     Running   0             13m
openshift-state-metrics-8f874c588-f42mq        3/3     Running   0             13m
prometheus-adapter-69dcbc4f56-x9hdd            1/1     Running   0             13m
prometheus-k8s-0                               7/7     Running   0             13m
prometheus-operator-74dddf98cc-hdkct           2/2     Running   1 (13m ago)   13m
telemeter-client-b7f885cc4-rg5nw               3/3     Running   0             13m
thanos-querier-66957b9966-v8qbt                5/5     Running   0             13m
$
```

`Cluster Montirong`用の`Pod`が起動しています。

</div>





# 遭遇したエラーと解決した方法

## エラー・ケース1

**現象** ：CRCのVMが中々起動しない。(VMが作られない)

**原因**：Cドライブの容量不足
CRCのインストーラー起動時に、インストールディレクトリとして、`D:ドライブ`の `D:\Program Files\CodeReady Containers\` を指定したが、`C:\Users\<ユーザー名>\.crc` の下に`VM`の`crc.vhdx`ファイル等が作成される。

なので、例え`D:ドライブ` にインストールしようとしても`C:ドライブ`の容量が足りないと`VM`が作成されない。

`D:\Program Files\CodeReady Containers\`にも `crc.vhdx`は配置されるが、`Hyper-V`コンソールから作成された`CRC`の`VM`を確認すると実際に参照されている仮想マシンファイルは、`C:\Users\<ユーザー名>\.crc`配下に配置された`crc.vhdx`である。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/a0e0669e-54ed-4215-647c-29fae69faaf0.png)

`ドキュメント`や`ピクチャ`等は`Dドライブ`に移動済みで(これらはフォルダのプロパティでパスを変更するだけで簡単に移動できる)、さらにそれ以外の `C:\Users\` 配下のディレクトリを移動させるのは大変だったので、`Cドライブ`の`SSD`を大きい容量に換装する事で解決しました。

課金で解決。


## エラー・ケース2

**現象**：
`oc login` 時に「`error: converting  to : type names don't match (Unknown, RawExtension), and no conversion 'func (runtime.Unknown, runtime.RawExtension) error' registered.`」とエラーがでる。

```
C:\Users\yuhki>oc.exe login -u kubeadmin -p qCk7i-5LZGS-A87Uo-jd4Hb 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 "openshift-ingress".
error: converting  to : type names don't match (Unknown, RawExtension), and no conversion 'func (runtime.Unknown, runtime.RawExtension) error' registered.

C:\Users\yuhki>mkdir tmp
`````

**原因**：これは個人的な環境の問題だった。
ググると `kubectl` とクラスターのバージョンがマッチしていないと同じエラーが起きる事があるらしいので、別のバージョンの`oc`コマンドを参照しているのでは？と当たりをつけて検索。

丁度コマンドを実行したディレクトリに昔インストールした `oc.exe` コマンドが残っていた。古い `oc.exe`コマンドを削除(rename) する事で解決。

図: rename された oc.exe
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/36613feb-2e55-7c84-b2b2-3df8c6e77408.png)

ちなみに`CRC`によってインストールされる `oc.exe` は、`C:\Users\<ユーザー名>\.crc\bin\oc\oc.exe` とその近くの cache と名前が付いたディレクトリに存在している。CRCのインストーラーを起動した時にインストールディレクトリとして指定した `D:\Program Files\CodeReady Containers\` のディレクトリには存在していなかった。

## エラー・ケース3

**現象**：GUIの「Status and Logs」を確認すると以下のエラーがログに大量に表示されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99425/22981e59-6808-7d9d-830c-57abe3398c39.png)

**原因**：多分、問題無い?

`C:\Users\<ユーザー名>\.crc\crdc.log` を見ると同様のエラーが記録されているものの、タイムスタンプを見る限り、テンポラリーのエラーで間欠的に出る感じで、動作的には問題があるように見えない。

```
time="2021-10-25T15:32:45+09:00" level=error msg="net.Dial() = dial tcp 192.168.122.1:16509: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond."
```