Red Hat OpenShift on IBM Cloudのプライベート・エンドポイントでの利用

# はじめに
これまで、IBM CloudのPower Systems Virtual ServerやVirtual Private CloudにOpenShiftをUPIインストールしてきました。この記事ではマネージドサービス「Red Hat OpenShift on IBM Cloud」をプライベート・エンドポイントで作成してざっくりと構成を見ていきます。

https://qiita.com/y-akio/items/f87f146ef44ebdee9ad3

https://qiita.com/y-akio/items/ad0093daa504be746573

# 1. Red Hat OpenShiftクラスターの作成
## 1.1 クラスター作成
IBM CloudコンソールからRed Hat OpenShiftのクラスターを作成します。

事前に以下を作成しておきます。
・クラウド・オブジェクト・ストレージ
・仮想プライベート・クラウド(VPC)とVPC内のサブネットx3
・各サブネットのパブリック・ゲートウェイ

■ インフラストラクチャー(IBM Cloudコンソールより)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413476/5cbc6145-3ea5-83f2-a307-5f26cde0cde0.png)
■ ロケーション(IBM Cloudコンソールより)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413476/13bd7b9f-2d0f-4b81-b069-9d9d61f3554f.png)
■ ワーカー・プール(IBM Cloudコンソールより)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413476/2eae7b51-4d9f-0fa0-94dc-247aa76638fc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413476/e3b85e7a-ad5f-bb80-bda7-291f9596407c.png)

インターネット側からSSL VPNで接続するためのclassicノードと、classicノードとVPC間を接続するためのTransit Gatewayを合わせて下図のような環境になりました。黄色丸はIBM Cloudコンソールの「VPCインフラストラクチャー」、「DNS Services」メニューからは確認できません。一方、赤丸は「VPCインフラストラクチャー」メニューで確認することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413476/41789616-6c0c-c712-9e30-7a3259ff47f3.png)

## 1.2. クラスターへのアクセス
サービス・エンドポイントを「プライベート・エンドポイントのみ」としたため、このままでは、IBM Cloudの「OpenShift」メニューからOpenShift Webコンソールにアクセスすることができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413476/a259dbdb-3c00-b261-fb5e-f0bb0faca844.png)

classicノードに起動したプロキシを経由することで、OpenShift Webコンソールにアクセスすることができました。但し、直接ログインすることはできず、IBM Cloudへのログインを促されます。

```bash:アクセス経路
作業端末 → classicノード(squidフォワードプロキシ:3128)
        → OpenShiftルーターPod → Openshift WebコンソールPod
```

classcノードではsquidを起動しています。デフォルトDNSでOpenShift WebコンソールのURLを名前解決できています。これはロード・バランサーのIPアドレスです。

```bash:classicノード
dig @10.0.80.11 console-openshift-console.roks-jp-tok-3-bx2-4x16-～-i000.jp-tok.containers.appdomain.cloud
### 標準出力↓
10.244.160.6
10.244.32.6
```

コマンドライン操作に必要なkubeconfigは以下のように取得しました。

```bash:classicノード
ibmcloud ks cluster config --cluster roks-jp-tok-3-bx2.4x16 --admin -output yaml > /tmp/kubeconfig
export KUBECONFIG=/tmp/kubeconfig
oc get co
### 標準出力↓
NAME                                       VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE
console                                    4.8.14    True        False         False      6d19h
csi-snapshot-controller                    4.8.14    True        False         False      6d19h
dns                                        4.8.14    True        False         False      6d19h
image-registry                             4.8.14    True        False         False      6d19h
ingress                                    4.8.14    True        False         False      6d19h
kube-apiserver                             4.8.14    True        False         False      6d19h
kube-controller-manager                    4.8.14    True        False         False      6d19h
kube-scheduler                             4.8.14    True        False         False      6d19h
kube-storage-version-migrator              4.8.14    True        False         False      6d19h
marketplace                                4.8.14    True        False         False      6d19h
monitoring                                 4.8.14    True        False         False      3d21h
network                                    4.8.14    True        False         False      6d19h
node-tuning                                4.8.14    True        False         False      6d19h
openshift-apiserver                        4.8.14    True        False         False      6d19h
openshift-controller-manager               4.8.14    True        False         False      6d19h
openshift-samples                          4.8.14    True        False         False      6d19h
operator-lifecycle-manager                 4.8.14    True        False         False      6d19h
operator-lifecycle-manager-catalog         4.8.14    True        False         False      6d19h
operator-lifecycle-manager-packageserver   4.8.14    True        False         False      2d23h
service-ca                                 4.8.14    True        False         False      6d19h
storage                                    4.8.14    True        False         False      6d19h
```

# 2. 構成確認
## 2.1. ノード
Red Hat OpenShift on IBM Cloudは、ゾーンあたり1workerノードで作成しました。ノード一覧を確認するとROLESに「master,worker」と表示されていますが、実際にはworkerノードとしてのみ機能します。

```bash:classicノード
oc get nodes
### 標準出力↓
NAME           STATUS   ROLES           AGE   VERSION
10.244.160.4   Ready    master,worker   93m   v1.21.1+a620f50
10.244.32.4    Ready    master,worker   93m   v1.21.1+a620f50
10.244.96.4    Ready    master,worker   93m   v1.21.1+a620f50
```

workerノードのOSはRHCOSでなくRHEL 7.9で、DNSサーバーは「DNS Services」インスタンスのIPアドレス、NTPサーバーはVPCで利用可能とされているNTPサーバーのIPアドレスになっていました。前述のようにIBM Cloudの「DNS Services」メニューでは何も確認できません。

```bash:classicノード
oc debug node/10.244.32.4
### 標準出力↓
Starting pod/10244324-debug ...
To use host binaries, run `chroot /host`

chroot /host
### 標準出力↓
Pod IP: 10.244.32.4
If you do not see a command prompt, try pressing enter.

cat /etc/redhat-release
### 標準出力↓
Red Hat Enterprise Linux Server release 7.9 (Maipo)

cat /etc/resolv.conf
### 標準出力↓
nameserver 161.26.0.7
nameserver 161.26.0.8

grep "^server" /etc/ntp.conf
### 標準出力↓
server time.adn.networklayer.com iburst minpoll 3 maxpoll 4
server  127.127.1.0 # local clock
server 161.26.0.6   # added by /sbin/dhclient-script
```

https://cloud.ibm.com/docs/dns-svcs?topic=dns-svcs-setting-up-your-dns-instance&interface=cli

https://cloud.ibm.com/docs/vpc?topic=vpc-service-endpoints-for-vpc

## 2.2. Pod
masterノード上のPodは表示されません。

```bash:classicノード
oc get pod -A -o wide | grep -v "10.244.32.4" | grep -v "10.244.96.4" | grep -v "10.244.160.4"
NAMESPACE                                          NAME                                                      READY   STATUS      RESTARTS   AGE     IP  NODE      NOMINATED NODE   READINESS GATES
```

ルーターPodは、LoadBalancerタイプのService経由で利用できるようになっており、Service「router-default」のNodePortの31050番ポートと32106番ポートは、VPCに作成されたロード・バランサーの負荷分散先になっていました。NodePortであるため、ルーターPodを起動していないworkerノード(10.244.96.4)でも同ポートでLISTENしてます。

```bash:classicノード
oc get svc -n openshift-ingress
### 標準出力↓
NAME                      TYPE           CLUSTER-IP      EXTERNAL-IP                          PORT(S)                      AGE
router-default            LoadBalancer   172.21.46.135   8aae851f-jp-tok.lb.appdomain.cloud   80:32106/TCP,443:31050/TCP   7d1h
router-internal-default   ClusterIP      172.21.218.93   <none>

oc describe svc router-default -n openshift-ingress
### 標準出力↓
Name:                     router-default
Namespace:                openshift-ingress
…
LoadBalancer Ingress:     8aae851f-jp-tok.lb.appdomain.cloud
Port:                     http  80/TCP
TargetPort:               http/TCP
NodePort:                 http  32106/TCP
Endpoints:                172.17.35.145:80,172.17.43.79:80
Port:                     https  443/TCP
TargetPort:               https/TCP
NodePort:                 https  31050/TCP
Endpoints:                172.17.35.145:443,172.17.43.79:443

oc get pod -n openshift-ingress -o wide
### 標準出力↓
NAME                              READY   STATUS    RESTARTS   AGE    IP              NODE           NOMINATED NODE   READINESS GATES
router-default-6bf59f86fd-ggrf2   1/1     Running   0          7d1h   172.17.43.79    10.244.160.4   <none>           <none>
router-default-6bf59f86fd-h8994   1/1     Running   0          7d1h   172.17.35.145   10.244.32.4    <none>           <none>

oc debug node/10.244.96.4
### 標準出力↓
Starting pod/10244964-debug ...
To use host binaries, run `chroot /host`

chroot /host
### 標準出力↓
Pod IP: 10.244.96.4
If you do not see a command prompt, try pressing enter.

ss -na | egrep "32106|31050"
### 標準出力↓
tcp    LISTEN     0      32768     *:31050                 *:*
tcp    LISTEN     0      32768     *:32106                 *:*
```

■ ロード・バランサー バックエンド・プール「tcp-443-31050」の負荷分散先
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413476/b28001d8-716a-c1ef-6944-bd6ce19e97e2.png)
■ ロード・バランサー バックエンド・プール「tcp-80-32106」の負荷分散先
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413476/cb774b2d-e2cf-3eb8-47ce-00a3ee010085.png)

## 2.3. Storage Class
アドオン「Block Storage for VPC」により、複数の「StorageClass」が用意されています。
「Block Storage for VPC」は、複数ゾーンに対応しないため注意が必要です。

```bash:classicノード
oc get sc
NAME                                          PROVISIONER            RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
ibmc-vpc-block-10iops-tier (default)          vpc.block.csi.ibm.io   Delete          Immediate              false                  7d1h
ibmc-vpc-block-5iops-tier                     vpc.block.csi.ibm.io   Delete          Immediate              false                  7d1h
ibmc-vpc-block-custom                         vpc.block.csi.ibm.io   Delete          Immediate              false                  7d1h
ibmc-vpc-block-general-purpose                vpc.block.csi.ibm.io   Delete          Immediate              false                  7d1h
ibmc-vpc-block-metro-10iops-tier              vpc.block.csi.ibm.io   Delete          WaitForFirstConsumer   false                  7d1h
ibmc-vpc-block-metro-5iops-tier               vpc.block.csi.ibm.io   Delete          WaitForFirstConsumer   false                  7d1h
ibmc-vpc-block-metro-custom                   vpc.block.csi.ibm.io   Delete          WaitForFirstConsumer   false                  7d1h
ibmc-vpc-block-metro-general-purpose          vpc.block.csi.ibm.io   Delete          WaitForFirstConsumer   false                  7d1h
ibmc-vpc-block-metro-retain-10iops-tier       vpc.block.csi.ibm.io   Retain          WaitForFirstConsumer   false                  7d1h
ibmc-vpc-block-metro-retain-5iops-tier        vpc.block.csi.ibm.io   Retain          WaitForFirstConsumer   false                  7d1h
ibmc-vpc-block-metro-retain-custom            vpc.block.csi.ibm.io   Retain          WaitForFirstConsumer   false                  7d1h
ibmc-vpc-block-metro-retain-general-purpose   vpc.block.csi.ibm.io   Retain          WaitForFirstConsumer   false                  7d1h
ibmc-vpc-block-retain-10iops-tier             vpc.block.csi.ibm.io   Retain          Immediate              false                  7d1h
ibmc-vpc-block-retain-5iops-tier              vpc.block.csi.ibm.io   Retain          Immediate              false                  7d1h
ibmc-vpc-block-retain-custom                  vpc.block.csi.ibm.io   Retain          Immediate              false                  7d1h
ibmc-vpc-block-retain-general-purpose         vpc.block.csi.ibm.io   Retain          Immediate              false                  7d1h
ibmc-vpcblock-odf-10iops                      vpc.block.csi.ibm.io   Delete          WaitForFirstConsumer   false                  7d1h
ibmc-vpcblock-odf-5iops                       vpc.block.csi.ibm.io   Delete          WaitForFirstConsumer   false                  7d1h
ibmc-vpcblock-odf-custom                      vpc.block.csi.ibm.io   Delete          WaitForFirstConsumer   false                  7d1h
ibmc-vpcblock-odf-general                     vpc.block.csi.ibm.io   Delete          WaitForFirstConsumer   false                  7d1h
ibmc-vpcblock-odf-ret-10iops                  vpc.block.csi.ibm.io   Retain          WaitForFirstConsumer   false                  7d1h
ibmc-vpcblock-odf-ret-5iops                   vpc.block.csi.ibm.io   Retain          WaitForFirstConsumer   false                  7d1h
ibmc-vpcblock-odf-ret-custom                  vpc.block.csi.ibm.io   Retain          WaitForFirstConsumer   false                  7d1h
ibmc-vpcblock-odf-ret-general                 vpc.block.csi.ibm.io   Retain          WaitForFirstConsumer   false                  7d1h
```

https://cloud.ibm.com/docs/containers?topic=containers-storage_planning#choose_storage_solution

https://cloud.ibm.com/docs/containers?topic=containers-vpc-block#vpc-block-reference

## 2.4. その他
ノードは「machinesets」として管理されていないため、OpenShift側からworkerノードをスケールさせることはできません。IBM Cloudコンソールからであればスケール可能です。

```bash:classicノード
oc get machinesets -n openshift-machine-api
### 標準出力↓
error: the server doesn't have a resource type "machinesets"
```

workerノードのOSがRHELであるためか、OpenShift Webコンソールからのバージョンアップはできないようです。IBM Cloudコンソールからであればバージョンアップ可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1413476/7d97dcb1-6812-74f3-e38f-056c3929283d.png)

# 3. 参考

https://rheb.hatenablog.com/entry/2021/07/01/Red_Hat_OpenShift_on_IBM_Cloud_%28ROKS%29_