KomposeでDocker-composeから変換したマニフェストをOpenShiftで使ってみる

Docker-compose.yaml付きで公開されている某アナリティクス系ライブラリの実行環境を、OpenShift4で動かしたくなり、Docker-compose.yamlをKubernetesのManufestに変換してくれるKomposeを試してみました。

サンプルを試してみただけなんですが、そのままではうまく動かず、虚を突かれた思いです。その際の問題点と解決方法を共有させて頂きたいと思います。

### [環境]
端末環境は、RHEL8 Workstationです。
OpenShift環境は、端末で立てたOpenShift Local(CRC)になります。

### [手順]
- まず、Komposeのインストールです。
RHEL7だとMinikubeベースのRed Hat Development Suiteに含まれてるようなんですが、RHEL8だとどういう扱いかよくわからない(後で要確認)＆OpenShift4だとMinikube使わないということがあり、とりあえず公式からダウンロードして使うことにしました。
https://kompose.io/installation/

``` bash
$ curl -L https://github.com/kubernetes/kompose/releases/download/v1.26.0/kompose-linux-amd64 -o kompose
$ chmod +x kompose
$ sudo mv ./kompose /usr/local/bin/kompose
```

- 新しいプロジェクトを作っておきます
```
$ oc new-project mymykomkom
```

- 公式のDocker-compose.yamlのサンプルをダウンロードして、Komposeをかけて、出来上がったmanifestをkubectl applyします、手順はとてもイージーですね
```
$ mkdir komtest && cd komtest
$ wget https://raw.githubusercontent.com/kubernetes/kompose/master/examples/docker-compose.yaml
$ kompose convert
$ kubectl apply -f frontend-tcp-service.yaml,redis-master-service.yaml,redis-slave-service.yaml,frontend-deployment.yaml,redis-master-deployment.yaml,redis-slave-deployment.yaml
```

### [事象]
Webサーバーが立ち上がらない、80番ポート使っちゃだめよと言われる
![Pasted image 20220720175129.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2854092/3aa9cb53-fec7-ac8c-e775-4d60a413a6c2.png)

```
$ oc get pods
NAME                            READY   STATUS             RESTARTS          AGE
frontend-5bfb76dc8d-27vnc       0/1     CrashLoopBackOff   213 (2m47s ago)   17h
redis-master-6795497d6c-sptc9   1/1     Running            0                 17h
redis-slave-6fc9f6d45-l6bfl     1/1     Running            0                 17h
```
### [解決方法]
1. anyuidのSCCをPodに付与する必要があった
2. デフォルトrestrictedのSCCで動かそうとするので動かない
3. 任意のSCCのPodへの付与は、サービスアカウント作って、SCC紐づけて、Podに付ける

- 当該podのリソースを作成するのに必要なSCCを確認、anyuidと分かる(OpenShiftのデフォルトSCCはrestrictedなので動かない)
```
$ oc get pod frontend-5bfb76dc8d-27vnc -o=yaml | oc adm policy scc-subject-review -f - 
RESOURCE                        ALLOWED BY   
Pod/frontend-5bfb76dc8d-27vnc   anyuid       
```
- サービスアカウントの作成(Memo、サービスアカウントはProject単位)
```
$ oc create sa test-sa
serviceaccount/test-sa created
```

- サービスアカウントにanyuidのSCCを紐付け
```
$ oc adm policy add-scc-to-user anyuid -z test-sa
clusterrole.rbac.authorization.k8s.io/system:openshift:scc:anyuid added: "test-sa"
```

- サービスアカウントをPodにセット
```
$ oc set serviceaccount deployment/frontend test-sa
deployment.apps/frontend serviceaccount updated
```

- 動きました
```
$ oc get pods
NAME                            READY   STATUS    RESTARTS   AGE
frontend-7b6b6c6fbd-gwkmd       1/1     Running   0          6m57s
redis-master-6795497d6c-sptc9   1/1     Running   0          18h
redis-slave-6fc9f6d45-l6bfl     1/1     Running   0          18h
```

### [原因]
一言で言うと、
OpenShiftはセキュリティが厳しいぜ、そこらへんで拾ってきたDockerイメージはそのままじゃ動かさせやしないぜ！
というとこかなと思っています。

>Docker Hub などのパブリックコンテナーレジストリーからダウンロードされたコンテナーイメージは、`restricted` SCC を使用すると実行できないことがあります。たとえば、特定のユーザー ID として実行する必要があるコンテナーイメージは、`restricted` SCC がランダムなユーザー ID を使用してコンテナーを実行するため、失敗する場合があります。ポート 80 またはポート 443 をリッスンするコンテナーイメージは、関連する理由により失敗することがあります。`restricted` SCC で使用されるランダムユーザー ID は、特権のあるネットワークポート (1024 未満のポート番号) をリッスンするサービスを起動できません。

Source: [RHLS SCCの説明 Red Hat OpenShift Administration II: Operating a Production Kubernetes Cluster](https://role.rhu.redhat.com/rol-rhu/app/courses/do280-4.10/pages/ch0)

Namespace（OpenShiftのプロジェクト）毎に、利用者に渡して勝手に使わせたりすると思うんですが、デフォルトがこういうセキュアな状態だと安心ですね。ユルユルな環境だとあっという間に、九龍城状態になっちゃいますからね。

### [あとがき(メモ)]
あれ、OpenShift用のOptionがあるぞ、これつければ、すんなり動くのか？（要再調査）
```
kompose convert --provider=openshift
```