OpenShift on IBM Cloud から Red Hat Container Catalog のイメージを利用する方法

IBMのRed Hat買収に伴って、従来からのIBMのお客様に、Red Hatの**OpenShift**を利用する価値を説明して、お勧めしなければならない。そこで IBM Cloud の OpenShiftクラスタや、これからリリースされる OpenShift を Kubernetes のコアとして利用する IBM Cloud Pak での OpenShift の利用価値について簡単であるが紹介したい。

この出だしは、ちょっと、生々しいかな。

まぁ、こんな背景はあるけど、ここからは、IT技術スキルのノウハウですから、幅広くITエンジニアに知って欲しいので、Qiitaに投稿する。


## Red Hat Container Catalog の特徴

[Red Hat Container Catalog](https://access.redhat.com/containers/)は、言語ランタイム、ミドルウェア、データベースなど多数の**認定済みイメージ**が登録されている。Red Hat 認定コンテナは、ベアメタル、仮想マシン、そして、クラウドまで、RHELが動作するあらゆる場所で実行できる。**認定コンテナ**は、Red Hatとパートナーによってサポートされ、既知のソースコードからパッケージ化され、セキュリティ監視も提供する。

![Container_Catalog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/0f05797d-f6eb-44c3-e651-1ccc594cb039.png)

上記に表示される[Health Index](https://access.redhat.com/articles/2803031)は、セキュリティリスクが簡単に識別できるようにグレードを表示する。このグレードはA〜Fまでの6段階評価で表し、専門家以外の人でも直感的にリスクを理解できるように考えられている。

![Container_Health_Index.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/8fa6b516-ec2f-52b1-8a00-899c0ff90f5f.png)

Red Hat セキュリティ・アドバイザリーは、**認定コンテナイメージ**で新しく発見された問題を警告し、最新のイメージにユーザーを誘導する。それによりユーザーは、そのイメージを使用するアプリケーションを更新できる。

Red Hatが提供していないコンテナ・イメージでは、継続的に更新される脆弱性データベースを利用するコンテナ・スキャン・ツールを使用して、既知の脆弱性に関する最新情報を常に取得するべきである。(Docker Hub と IBM Cloud Registry の脆弱性スキャンの例について後述する。)

Red Hatは、プラガブルなAPIをRHELで提供することで、[OpenSCAP](https://qiita.com/bezeklik/items/8bf7d0ccf5cf916d778c)、[Black Duck Hub](https://github.com/blackducksoftware)、[JFrog Xray](https://jfrog.com/xray/)、[Twistlock](https://www.twistlock.com/) など複数のスキャナーをサポートする。Red Hat [CloudForms](https://www.redhat.com/en/technologies/management/cloudforms) を OpenSCAP と共に使用して、セキュリティ問題がないかコンテナイメージをスキャンすることもできる。また、Red Hat OpenShift では、継続的インテグレーション(CI)と継続的デリバリー(CD)のプロセスでスキャナーを使用できる。

## IBM Cloud OpenShift から Red Hat 認定コンテナの利用方法

一通りの流れをつかめるように、Red Hat 認定のApache Httpd 2.4 のコンテナ・イメージをデプロイするまでの流れを箇条書きに示す。

1. [IBM Cloud の OpenShift](https://cloud.ibm.com/catalog) で、クラスタを起動して、oc login までを実施
1. [Red Hat アカウントを作成](https://www.redhat.com/wapps/ugc/register.html)
1. [Red Hat アカウントにログイン](https://sso.redhat.com/auth/realms/redhat-external/protocol/saml/clients/legacy-idp-servlets)
1. [Red Hat Container Catalog に移動](https://access.redhat.com/containers/)
1. カタログのメニューバーの [Service Accounts](https://access.redhat.com/terms-based-registry/) をクリック
1. **New Service Account** をクリックして、サービスアカウントを作成
1. 作成応答画面のタブ **OpenShift Secret** をクリック
1. 画面のStep 1 に従って、シークレットをK8sの名前空間に保存するYAMLファイルをダウンロード
1. Step 2に従って、ダウンロードしたYAMLを kubectl apply -f YAMLファイル名 または oc apply -f YAMLファイル名
1. Step 3 の imagePullSecrets: 以下をコピーしておく
1. [Red Hat Container Catalog の例として、[Apache httpd 2.4]( https://access.redhat.com/containers/?tab=images#/registry.access.redhat.com/rhscl/httpd-24-rhel7) へ移動
1. 表示されている httpd ポッドのYAMLファイルをコピペして、シークレットの名前を置き換える編集を実行
1. 編集済み ポッドのYAML を oc apply -f httpdポッドYAMLファイル名 でデプロイ実行


## 実行例

IBM Cloud の OpenShift クラスタをデプロイして、ログインする。

~~~
$ oc login https://c100-e.jp-tok.containers.cloud.ibm.com...
<中略>

$ oc get node
NAME           STATUS    ROLES           AGE       VERSION
10.193.10.50   Ready     compute,infra   25m       v1.11.0+d4cacc0
~~~

Red Hat サービスアカウントのシークレットをデプロイする。シークレットのYAML取得方法は前述の箇条書きを参照のこと。

~~~
$ oc apply -f 7078819_takara1-secret.yaml 
<中略>

$ kubectl get secret
NAME                                           TYPE                                  DATA   AGE
7078819-takara1-pull-secret                    kubernetes.io/dockerconfigjson        1      32s
~~~

Apache httpd 2.4 のポッドをデプロイするYAMLを編集する。

~~~
$ vi apache-httpd.yaml
$ cat apache-httpd.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-web      ## <<--- 識別できるように名前を設定
  namespace: default  ## <<--- 簡単に確認できる defaultを利用
spec:
  containers:
  - name: web
    image: registry.redhat.io/rhscl/httpd-24-rhel7  ## <<--- Red Hat 認定イメージ
  imagePullSecrets:
  - name: 7078819-takara1-pull-secret  ## <<--- シークレット名に置き換える
~~~

OpenShiftのクラスタへデプロイ

~~~
$ oc apply -f apache-httpd.yaml
pod/test-web created

$ kubectl get pod
NAME                               READY   STATUS              RESTARTS   AGE
docker-registry-775bc74474-9hnnq   1/1     Running             0          42m
docker-registry-775bc74474-nbm45   1/1     Running             0          42m
registry-console-7f689b5f9-2mp8c   1/1     Running             0          26m
router-76cf9c9df8-jf7n8            1/1     Running             0          31m
router-76cf9c9df8-p6mjl            1/1     Running             0          32m
test-web                           0/1     ContainerCreating   0          45s

$ kubectl get pod
NAME                               READY   STATUS    RESTARTS   AGE
docker-registry-775bc74474-9hnnq   1/1     Running   0          42m
docker-registry-775bc74474-nbm45   1/1     Running   0          42m
registry-console-7f689b5f9-2mp8c   1/1     Running   0          27m
router-76cf9c9df8-jf7n8            1/1     Running   0          32m
router-76cf9c9df8-p6mjl            1/1     Running   0          32m
test-web                           1/1     Running   0          1m
~~~

Red Hat Container Catalog の　Red Hat 認定 コンテナ・イメージをデプロイすることができた。


# まとめ

Red Hat Container Catalog は。Red Hat Linux のOSパッケージの最新化と yum による配布のように、定期的にスキャンと際ビルドされ、レジストリに登録されている。 これは Red Hat および パートナー企業によって実施され、セキュリティーが保たれている。

IBM Cloud の OpneShift は ライセンス料金の上乗せがあるが、セキュリティを重要視する企業用途には、最適なサービスと言える。認定カタログには、IBM Watson 関連をはじめ、定番の WAS, MQ, Db2のコンテナ・イメージも登録されている。 もちろん、ソフトウェア製品である IBM Cloud Pak for Applicationなどを含めて、これらプロプライエタリな企業向けソフトウェアは、パスポートアドバンテージの契約があれば利用することができる、お客様企業担当のIBMセールスから[契約内容](https://www.ibm.com/software/jp/passportadvantage/index.html)について案内を請求してもらいたい。


# おまけ

Docker Hub と IBM Cloud Registry Service の脆弱性スキャンのレポートを添付しておく。

## Docker Hub の場合

DockerHubでは、タグ情報のタブで脆弱性スキャンの結果を把握できる。

![DockerHub_Scanner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/01085020-90c3-74e3-6d13-efbfbce450bb.png)


## IBM Cloud Redistry Service の場合
  
JavaEEのアプリケーションのイメージをビルドして、400日間放置すると、どんどん脆弱性が発見され、真っ赤な状態になってしまう。Javaのパッケージが大半なので、IDEツールのEclipse を使って不要なモジュールを識別、削減しても、これはユーザーの力では避けられないので、定期的にイメージをビルドし直して、モジュールを最新化するのが良い。

![IBM_Cloud_Reg_Scan_results.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/79118315-c57a-7673-ec30-2aa2e53775dc.png)