Turbonomic ARMをIBM Cloud Internet Service(CIS)経由で動かす

#はじめに
Turbonomic ARMはIBMが提供しているアプリケーションリソース管理ソフトウェアです。
（ソフトウェアの機能は本稿では割愛します。[こちら](https://qiita.com/daihiraoka/items/4a24bf212917b65fa583)の記事がおすすめです。）

Openshift環境にソフトウェアを導入する標準の手順と、
カスタムドメイン、証明書を用いてCIS経由でアクセスする前提での導入手順について記載します。
管理系ソフトウェアなので、インターネット経由でアクセスすることはあまりないとは思いますが、何かの参考になれば幸いです。

#環境情報
- IBM CloudのOpenshift環境(ROKS)
    - [CPUメモリ要件](https://github.com/turbonomic/t8c-install/wiki/3.-Sizing-your-Deployment#sizing-your-deployment)と[ストレージ要件](https://github.com/turbonomic/t8c-install/wiki/Storage-Class-Requirements)を満たしていること
- OCPバージョン `4.8`
- Turbonomicのバージョンは`8.3.3`(検証時のバージョン)
    - Log4jの脆弱性の問題で現在は`8.4.1`以降を推奨
- クライアント端末から`oc login`ができること

# 本手順の流れ
1. 環境設定
2. Turbonomic Platform Operatorのインストール
3. Turbonomicインスタンスの作成
4. Routeの作成

# 1. 環境設定
まずネームスペースを作成します。

```bash
#Turbonomic用Namespace
oc new-project turbonomic
```

次にクラスタロールとクラスタロールバインディングを作成します。

```bash
oc create -f https://raw.githubusercontent.com/turbonomic/t8c-install/master/operator/deploy/cluster_role.yaml
oc create -f https://raw.githubusercontent.com/turbonomic/t8c-install/master/operator/deploy/cluster_role_binding.yaml
```

SCC (Security Context Constraints)の設定を行います。

```bash
oc adm policy add-scc-to-group anyuid system:serviceaccounts:turbonomic   
```

[こちら](https://github.com/turbonomic/t8c-install/wiki/4.-Turbonomic-Multinode-Deployment-Steps#openshift-security-context)を参考に`sa.scc.uid-range`の値を確認します。

```bash
oc describe project turbonomic   
```

# 2. Turbonomic Platform Operatorのインストール
OpenshiftコンソールのOperatorHubからTurbonomic Platform Operatorをインストールします。
もしくは、以下のコマンドを実行します。

```yaml
cat << EOF | oc apply -f -
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: turbonomic-og
  namespace: turbonomic
spec:
  targetNamespaces:
  - turbonomic
---
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: t8c-certified
  namespace: turbonomic
spec:
  channel: stable
  installPlanApproval: Automatic
  name: t8c-certified
  source: certified-operators
  sourceNamespace: openshift-marketplace
  startingCSV: t8c-operator.v42.4.0
EOF
```
startingCSVは省略しても大丈夫だと思いますが、最新のOperatorのバージョンは以下で確認できます。

https://github.com/turbonomic/t8c-install/tree/master/operator

# 3. Turbonomicインスタンスの作成
OpenshiftコンソールのインストールされたOperatorからTurbonomic Platform Operatorのインスタンス（Xl-release）を作成します。
もしくは、以下のコマンドを実行します。

※必要な機能を含めるためにコンソールのフォームビューで機能確認後、
YAMLビューでパラメータを確認することをお勧めします。

```yaml
cat << EOF | oc apply -f -
apiVersion: charts.helm.k8s.io/v1
kind: Xl
metadata:
  namespace: turbonomic
  name: xl-release
spec:
  global:
    storageClassName: ibmc-vpc-block-metro-10iops-tier #1
    repository: registry.connect.redhat.com/turbonomic
    securityContext:
      fsGroup: 1000690000 #2
    externalArangoDBName: arangodb
    tag: 8.3.3 #3
    customImageNames: false
  actionscript:
    enabled: true
  aws:
    enabled: true
  instana:
    enabled: true
  kubeturbo:
    enabled: true
  nginx:
    httpsRedirect: false #4
    nginxIsPrimaryIngress: false
  nginxingress:
    enabled: true
  openshiftingress:
    enabled: false #5
EOF
```

**\#1** ストレージクラスはRWOのみでOK。ただし、Workerノードが複数のAZにまたがる場合は、`volumeBindingMode: WaitForFirstConsumer`が設定されたストレージクラスを使用する必要があります。
**\#2** 事前に確認した`sa.scc.uid-range`の値を設定します。
**\#3** `tag`でインストールするTurbonomicのバージョンを指定します。冒頭で記載した通り、現状では`8.4.1`以降を推奨します。
**\#4** デフォルトは`true`になっており、httpはhttpsにリダイレクトされます。独自の証明書を使用するなど、前段でHTTPSを終端する場合は`false`に設定する。設定しない場合、リダイレクトループが発生してしまいます。
**\#5** [こちらのWiki](https://github.com/turbonomic/t8c-install/wiki/Platform-Provided-Ingress-&-OpenShift-Routes#ocp-routes-and-turbo-832)によると、今回の環境では、`openshiftingress: enabled: true`となるが、CIS経由での通信がうまくいかなかったため、`false`としました。

# 4. Routeの作成
Turbonomicをインストールするとデフォルトでnginxという名前のサービスが作成されます。`openshiftingress: enabled: true`の場合はそこへパススルーするRouteも自動的に生成されますが、今回の設定では自動生成されないため、手動で作成します。

```bash
oc create route edge nginx \
 --service=nginx \
 --hostname='turbonomic-url.example.com' \
 --port='http-nginx' \
 --cert='cert.pem' \
 --key='cert.key' \
 --insecure-policy='Redirect' 
```
`hostname`には独自ドメインのTurbonomicのURLを指定し、`cert.pem`と`cert.key`には有効な署名済み証明書と鍵を指定します。CIS側での設定は割愛しますが、これでCIS経由でのアクセスが可能となります。

# おわりに
本手順はCLI中心でなるべくコピペでいけるようにしました。
ドキュメントの情報は色々と散在しているので最初は導入に苦労しがちですが、さっと導入して、ぜひソフトウェアの中身を知る時間を増やしてもらえたらと思います。