初心者向け Ret Hat OpenShift on IBM Cloud v4.10 クラスターを作成

# 内容
Red Hat OpenShift on IBM Cloud勉強の手始めに、こちらのチュートリアルを実施しました。（日本語訳ページはバージョンが古いようなので英語ページを参照）
学んだことの覚え書き。
<a href="https://cloud.ibm.com/docs/openshift?topic=openshift-vpc_rh_tutorial"><b>Creating an Red Hat OpenShift cluster in your Virtual Private Cloud (VPC)</b></a>


# 目標
・　VPC上にRed Hat OpenShift on IBM Cloudクラスターの作成する
・　OpenShiftプロジェクトにアプリをデプロイしてアクセスする


:::note warn
OpenShift ワーカー・ノードは、有料アカウントおよび標準クラスターでのみ使用可能です。課金が発生するようです。
:::

# 事前準備
#### 権限
　IBM Cloud 管理者権限を持つユーザ

#### 各種コマンド・ライン・ツールをインストール
　<a href="https://cloud.ibm.com/docs/openshift?topic=openshift-vpc_rh_tutorial">Tutorial</a>に記載されているリンク先の情報に従ってセットアップ
* ibmcloudコマンド
* ibmcloudコマンドのプラグイン
    * container-service(oc)
    * container-registry(cr)
    * observe-service(ob)
    * infrastructure-service(is)　※VPC操作のため
* ocコマンド および kubectlコマンド

# Step1. IBM　Cloud準備〜クラスター作成
#### IBM Cloud準備
　既存のVPC、サブネット、パブリックゲートウェイを使用。
　今回はロケーション東京2で作成。
　追加でオブジェクトストレージを作成(内部レジストリーのバックアップ先)。
* VPC : 既存(vpc-fj)
* サブネット : 既存(sn-fj-2) ※東京2
* パブリックゲートウェイ : 既存（pgw-fj-2) ※東京2、sn-fj-02に接続
* オブジェクトストレージ　: ibmcloudコマンドで作成(fj-cos)
`ibmcloud resource service-instance-create fj-cos cloud-object-storage standard global
`

#### 環境のイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648751/6798a885-238d-6196-176d-7822c7df170c.png)





#### クラスターの作成
　作成パラメータ
* クラスター名 : roks-fj-cluster
* ゾーン : 東京2(jp-tok-2)
* バージョン : 4.10(5/2時点の最新)
* ワーカーノードスペック(OpenShiftの最小値)
    * 4 cores, 16GB memory
    * 2台


　下記実行してクラスター作成。クラスターができるまでしばらくかかる。（40分くらい）
```
ibmcloud oc cluster create vpc-gen2 --name fj-cluster --zone jp-tok-2 --version 4.10_openshift --flavor bx2.4x16 --workers 2 --vpc-id <VPCのID> --subnet-id <サブネットのID> --cos-instance <オブジェクトストレージのID>
```

※オブジェクトストレージのIDは `ibmcloud resource service-instances --long` コマンドで取得できる。("crn:~"で始まる文字列を指定する)

#### 作成後確認
 `ibmcloud oc cluster get --cluster <クラスター名>`　で作成状況を確認。(クラスターの状態が「normal」になること)
 `ibmcloud oc cluster config --cluster <クラスター名> --admin`　でクラスターのコンテキスト構成をダウンロード。などなど。




# Step2. アプリケーションのデプロイ
<a href="https://cloud.ibm.com/docs/openshift?topic=openshift-vpc_rh_tutorial">Tutorial</a>に沿ってアプリのデプロイを実施。

#### プロジェクトの作成
`oc new-project hello-world`

#### コンテナの作成・デプロイ、サービスの作成
`oc new-app --name hello-world https:...`
　このコマンドにより以下が行われる。
　・　Githubリポジトリ上のDockerfileに基づきコンテナイメージを作成
　・　コンテナをデプロイしPodを起動
　・　hello-worldサービスを作成

　サービスを確認。
```
% oc get svc -n hello-world
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
hello-world   ClusterIP   172.21.194.214   <none>        8080/TCP   4s
% 
```
:::note 
EXTERNAL-IPがなくまだ外部ネットワークからサービスにアクセスできない。以降の作業で設定する。
:::

# Step3. 外部ネットワークからアクセスできるようにする
#### 方法
　<a href="https://cloud.ibm.com/docs/openshift?topic=openshift-vpc_rh_tutorial">Tutorial</a>には2つの方法が記載されている
　1. VPCロードバランサを経由してアプリケーションにアクセスする
　2. Red Hat OpenShiftのrouteを利用する（Tip)

#### 方法1. VPCロードバランサを経由してアプリケーションにアクセスする
OpenShift上でLoadbalancerタイプのサービスを作成すると、自動的にVPCにロードバランサが作成されサービスと紐付けられる。VPCロードバランサのURLにアクセスすることでサービスにアクセス可能となる。

##### 作り方
:::note warn
Tutorialのやり方ではdeploy configurationは作成されず、Tutorial通りに実行すると　"Error from server (NotFound): deploymentconfigs.apps.openshift.io "hello-world" not found"　でエラーとなる。
:::

`oc expose dc/hello-world --type=LoadBalancer...`
引数の「dc/hello-world」　を　「deployment/hello-world」に変えて実行する。

```
oc expose deployment/hello-world --type=LoadBalancer --name=hw-lb-svc  --port=8080 --target-port=8080 -n hello-world
```

この結果、VPC側に自動的にロードバランサが作成される。VPCロードバランサのURLは`oc describe service hw-lb-svc -n hello-world`の出力で「LoadBalancer Ingress」の項目で確認できる。

```
% oc describe service hw-lb-svc -n hello-world

Name:                     hw-lb-svc
Namespace:                hello-world
Labels:                   app=hello-world
                          app.kubernetes.io/component=hello-world
                          app.kubernetes.io/instance=hello-world
Annotations:              <none>
Selector:                 deployment=hello-world
Type:                     LoadBalancer
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       172.21.41.11
IPs:                      172.21.41.11
LoadBalancer Ingress:     xxxxxxxx-jp-tok.lb.appdomain.cloud
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  32647/TCP
Endpoints:                172.17.9.53:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type    Reason                Age   From                Message
  ----    ------                ----  ----                -------
  Normal  EnsuringLoadBalancer  96s   service-controller  Ensuring load balancer
  Normal  EnsuredLoadBalancer   70s   service-controller  Ensured load balancer
% 
```
##### 疎通確認
 「LoadBalancer Ingress」のURLにアクセス。
```
% curl xxxxxxxx-jp-tok.lb.appdomain.cloud:8080
Hello world from hello-world-5794dc544c-q2lsz! Your app is up and running in a cluster!
% 
```

#### 方法2. Red Hat OpenShiftのrouteを利用する（Tip)
OpenShiftのRoute機能を利用してアプリケーションにアクセスする。

##### 作り方
　公開用のサービスとして（hw-rt-svc)を作成する。
```
oc expose deployment/hello-world --name=hw-rt-svc
```

　作成したサービスを公開する。（シンプル）
```
oc expose service hw-rt-svc
```

　サービスへの経路ができたことを確認する。
```
% oc get routes
NAME        HOST/PORT                                                                             PATH   SERVICES    PORT   TERMINATION   WILDCARD
hw-rt-svc   hw-rt-svc-hello-world.roks-fj-cluster-xxxx.jp-tok.containers.appdomain.cloud          hw-rt-svc   8080                 None
%
```

##### 疎通確認
経路情報のHOST/PORTにアクセスする。
```
% curl hw-rt-svc-hello-world.roks-fj-cluster-xxxx.jp-tok.containers.appdomain.cloud
Hello world from hello-world-5794dc544c-q2lsz! Your app is up and running in a cluster!
% 
```

#### 接続イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648751/3b378b2e-1c85-b84b-0cf1-b04a76d59ed6.png)



# オプション
#### hello-worldプロジェクトの削除
削除対象のリスト
```
% oc get all -l app=hello-world -o name -n hello-world
service/hello-world
service/hw-lb-svc
service/hw-rt-svc
deployment.apps/hello-world
buildconfig.build.openshift.io/hello-world
build.build.openshift.io/hello-world-1
imagestream.image.openshift.io/hello-world
imagestream.image.openshift.io/node
route.route.openshift.io/hw-rt-svc
% 
```
全て削除
```
% oc delete all -l app=hello-world -n hello-world
service "hello-world" deleted
service "hw-lb-svc" deleted
service "hw-rt-svc" deleted
deployment.apps "hello-world" deleted
buildconfig.build.openshift.io "hello-world" deleted
imagestream.image.openshift.io "hello-world" deleted
imagestream.image.openshift.io "node" deleted
route.route.openshift.io "hw-rt-svc" deleted
%
```
※hw-lb-svcの削除によりVPCロードバランサも削除される

以上