Red Hat OpenShift on IBM CloudがGAしたので早速使ってみた

# 0. この投稿がきっかけで記事を書きました。(2019年10月27日追記)
最速で評価して書いたこのQiitaの記事をきっかけに、アットマークITに記事を書く機会をいただきました。
この記事では、Tok02だけのシングルサイトですが、記事では3つのデーターセンターを使った構成になってます。よかったら、記事の方もご一読頂けたら嬉しいです。

IBMのRed Hat買収の成果「Red Hat OpenShift on IBM Cloud」によって、複雑なマルチゾーンのOpenShiftクラスタの構築はどれほど簡単になるのか？
https://www.atmarkit.co.jp/ait/articles/1910/21/news003.html
# 1. はじめに
2019年8月1日に IBM Cloudの 「 Red Hat OpenShift on IBM Cloud　」がサービスインしました。
早いもの好きの１ユーザーとして、早速、OpenShiftのクラスターを作成してみます。

# 2. Red Hat OpenShift on IBM Cloud　クラスター の作成

## IBM Cloudポータルから「 Red Hat OpenShift Cluster 」を作成する
1. IBM Cloudポータルから「 カタログ 」、　「 コンテナ 」、「 Red Hat OpenShift Cluster 」、「作成」の順番に遷移します。

1. 「 Create a new OpenShift cluster 」が表示されます。
<img width="1148" alt="スクリーンショット 2019-08-01 23.24.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/7634b408-adb0-8161-8d7d-89213335810e.png">

- 「クラスタ名」を入力
- 「リージョン」、「ロケーション」、OpenShiftのワーカーノードを展開する「ワーカーゾーン」を選択  
      今回は、評価目的なので、ロケーションはtokyoで、ワーカーゾーンはtok02のみにしました。
- デーフォルトのワーカープールで使用するフレーバを選択する。   
      今回は最小の4vCPU,16GB RAM  RHELを選択
- ゾーンごとに作成するワーカーノード数を設定します。（デフォルト３）   
- 「クラスターの作成」をクリックしてクラスターの作成開始

**「クラスターの作成」をクリックしてから約３０分から４５分でOpenShiftのクラスターが起動します。**
       
リソースの一覧の中から気になったところは主に以下の４つです。

- OpenShiftのバージョンは3.11
- このサービスはAZ(アベイラビリティーゾーン)対応のロケーションでサービスインされていてる。
  例えば、ロケーションをtokyoを選択すると、ワーカーゾーンは tok02, tok04, tok05の３つ利用できる。
- ワーカーノードで選択できるマシンは、仮想・共有、仮想・専用、ベア・メタル(物理サーバ）と用途に合わせて選択できて便利
　オンプレミスと違って、後から、ユースケースに合わせてワーカーノードを追加・削除できる
- GPUのマシンも選べる

## OpenShiftのCLI環境の準備
OpenShift clusterデプロイ中に、CLIの環境を準備します。

1. IBM Cloud Developer Tools をインストールします。

```console
$ curl -sL https://ibm.biz/idt-installer | bash
[main] --==[ IBM Cloud Developer Tools for Linux/MacOS - Installer, v1.2.3 ]==--
```

2. oc clientを[ダウンロード](https://www.okd.io/download.html)して設置します。

```console
$ curl -LO https://github.com/openshift/origin/releases/download/v3.11.0/openshift-origin-client-tools-v3.11.0-0cbc58b-mac.zip
$ unzip openshift-origin-client-tools-v3.11.0-0cbc58b-mac.zip
Archive:  openshift-origin-client-tools-v3.11.0-0cbc58b-mac.zip
  inflating: oc                      
  inflating: kubectl                 
  inflating: README.md               
  inflating: LICENSE                 
$ cp oc /usr/local/bin/
$ cp kubectl /usr/local/bin/
$ which oc
/usr/local/bin/oc
```

# 3. OpenShift Clusterデプロイ後の確認

## OpenShift Webコンソールへのアクセス

1. OpenShift clusterのデプロイ終了後、「 OpenShift Webコンソール　」をクリックすることで　「 OpenShift Webコンソール　」が表示されます。
<img width="1033" alt="スクリーンショット 2019-08-02 0.29.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/80179752-2e22-f16c-59ea-4dc20b34d265.png">


- 「 OpenShift Webコンソール　」画面  
![スクリーンショット 2019-08-02 1.15.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/bef272ad-5ab2-44bf-f8a9-3aa78575e490.png)


## OpenShiftへのCLIでのログイン

1. OpenShiftのCLI操作をするために、まずは上記、 「 OpenShift Webコンソール　」画面の右上のユーザ名をクリックして表示された「Copy Login Command」をクリックして、クリップボードにコピーします。

2. コピーしたコマンド「oc login https://c100-e.jp-tok.containers.cloud.ibm.com:31532 --token=<< ログイン用のAPI token >>」をターミナルで実行してログインします。

```console
$ oc login https://c100-e.jp-tok.containers.cloud.ibm.com:31532 --token=<< ログイン用のAPI token >>

Logged into "https://c100-e.jp-tok.containers.cloud.ibm.com:31532" as "IAM#kjchingu@gmail.com" using the token provided.

You have access to the following projects and can switch between them with 'oc project <projectname>':

  * default
    ibm-cert-store
    ibm-system
    kube-proxy-and-dns
    kube-public
    kube-service-catalog
    kube-system
    openshift
    openshift-ansible-service-broker
    openshift-console
    openshift-infra
    openshift-monitoring
    openshift-node
    openshift-template-service-broker
    openshift-web-console

Using project "default".

```

# 4. 初めてのアプリケーションの作成

１. 「　oc new-project <<プロジェクト名>>でOpenShiftのプロジェクトを作成します。


```console
$ oc new-project sample
Now using project "sample" on server "https://c100-e.jp-tok.containers.cloud.ibm.com:31532".

You can add applications to this project with the 'new-app' command. For example, try:

    oc new-app centos/ruby-25-centos7~https://github.com/sclorg/ruby-ex.git

to build a new example application in Ruby.

```

２. oc new-appコマンドを使って、プロジェクト作成時に出力されたRubyのサンプルアプリケーションを作成します。 今回は、centos/ruby-25というイメージを使用してアプリケーション[ https://github.com/sclorg/ruby-ex.git ]をビルドします。

```console
$ oc new-app centos/ruby-25-centos7~https://github.com/sclorg/ruby-ex.git
--> Found Docker image cb490f3 (4 months old) from Docker Hub for "centos/ruby-25-centos7"
--> Creating resources ...
    imagestream.image.openshift.io "ruby-25-centos7" created
    imagestream.image.openshift.io "ruby-ex" created
    buildconfig.build.openshift.io "ruby-ex" created
    deploymentconfig.apps.openshift.io "ruby-ex" created
    service "ruby-ex" created
--> Success
    Build scheduled, use 'oc logs -f bc/ruby-ex' to track its progress.
    Application is not exposed. You can expose services to the outside world by executing one or more of the commands below:
     'oc expose svc/ruby-ex' 
    Run 'oc status' to view your app.
```

３. oc get allコマンド実行してデプロイの結果を確認します。 -o wide オプションをつけると ノード名が表示されます。　　　
　 pod/ruby-ex-1-q4jmbのSTATUSがRunningになっているのでデプロイは正常に終了しています。

```console
$ oc get all -o wide
NAME                  READY     STATUS      RESTARTS   AGE       IP              NODE            NOMINATED NODE
pod/ruby-ex-1-build   0/1       Completed   0          12m       172.30.152.71   10.129.139.47   <none>
pod/ruby-ex-1-q4jmb   1/1       Running     0          9m        172.30.152.72   10.129.139.47   <none>

NAME                              DESIRED   CURRENT   READY     AGE       CONTAINERS   IMAGES                                                                                                       SELECTOR
replicationcontroller/ruby-ex-1   1         1         1         9m        ruby-ex      172.21.210.124:5000/sample/ruby-ex@sha256:c2c95649aa6624cce585cf09ad7c0b52d0e35ace9ff0c2eff69011c17854cdc1   app=ruby-ex,deployment=ruby-ex-1,deploymentconfig=ruby-ex

NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE       SELECTOR
service/ruby-ex   ClusterIP   172.21.180.60   <none>        8080/TCP   12m       app=ruby-ex,deploymentconfig=ruby-ex

NAME                                         REVISION   DESIRED   CURRENT   TRIGGERED BY
deploymentconfig.apps.openshift.io/ruby-ex   1          1         1         config,image(ruby-ex:latest)

NAME                                     TYPE      FROM      LATEST
buildconfig.build.openshift.io/ruby-ex   Source    Git       1

NAME                                 TYPE      FROM          STATUS     STARTED          DURATION
build.build.openshift.io/ruby-ex-1   Source    Git@c00ecd7   Complete   12 minutes ago   3m7s

NAME                                             DOCKER REPO                                               TAGS      UPDATED
imagestream.image.openshift.io/ruby-25-centos7   docker-registry.default.svc:5000/sample/ruby-25-centos7   latest    12 minutes ago
imagestream.image.openshift.io/ruby-ex           docker-registry.default.svc:5000/sample/ruby-ex           latest    9 minutes ago
```


４. oc new-appコマンドでは、外部アクセス用のrouteは作成されないので、作成してアクセスします。

```console
$ oc expose svc ruby-ex
route.route.openshift.io/ruby-ex exposed

$ oc get route
NAME      HOST/PORT                                                                                                 PATH      SERVICES   PORT       TERMINATION   WILDCARD
ruby-ex   ruby-ex-sample.mycluster-980608-148bd19a50ab440a3dbebb29a6cc6e69-0001.jp-tok.containers.appdomain.cloud             ruby-ex    8080-tcp                 None

$ curl http://ruby-ex-sample.mycluster-980608-148bd19a50ab440a3dbebb29a6cc6e69-0001.jp-tok.containers.appdomain.cloud
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>Welcome to OpenShift</title>
 [以下省略]
```
HTMLのタイトル「Welcome to OpenShift」が出力されました。

デフォルトのホストネームのフォーマットは'< service_name>-< namespace>.< cluster_name>-< random_ID>.< region>.containers.appdomain.cloud'　と、とても長いのですが、 oc exposeをする際に --hostname=<hostname> オプションを使うと独自ドメインを使用することもできます。

５. 外部アクセス用のrouteを削除して、独自ドメインでアクセスできるrouteを作成してアクセスします。

(前提)下図の様に独自ドメインのDNS設定に　 Ingresssサブドメインをポイントするcloudapps(任意の名前) のワイルドカード DNS エントリーを作成します。
<img width="493" alt="スクリーンショット 2019-08-03 3.09.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209170/ae578608-a377-dad3-81de-51e25e7f39f2.png">

```console
$ oc delete route ruby-ex
route.route.openshift.io "ruby-ex" deleted

$ oc expose svc ruby-ex --hostname ruby-ex-sample.cloudapps.example.com
route.route.openshift.io/ruby-ex exposed

$ oc get route
NAME      HOST/PORT                                  PATH      SERVICES   PORT       TERMINATION   WILDCARD
ruby-ex   ruby-ex-sample.cloudapps.example.com                 ruby-ex    8080-tcp                 None

$ curl http://ruby-ex-sample.cloudapps.example.com
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title>Welcome to OpenShift</title>
 [以下省略]
```
独自ドメインでも、HTMLのタイトル「Welcome to OpenShift」が出力されました。

- 2019年8月3日時点で Ingressサブドメインのフォーマットが、tutorialのドキュメント、IBMCloudポータルのOpenShiftの概要、OpenShiftからの返却値が、一致してなくて混乱しますが、 いずれ改修されるはずですが、現時点では、oc get routeコマンドで出力される Ingressサブドメインが正しいです。

# 5.最後に
サポートがあると言ってもオンプレミスでOpenShiftを運用することは大変でした。

例）

- 3ヶ月に1回のペースでバージョンがあがっていくのを追っかけなければならない
- 何でもできるエンジニアがいつもいるわけでないので、メンバーの育成しないといけないけど、難しいとか

今回、IBM CloudのフルマネージドのOpenShiftを使うことによって、インフラの部分の負担は軽減されて、アプリケーションのリリースにリソースを割くことができることでしょう♪　今後の展開をとっても期待してます！