DataPower V10 の WebGUI を設定する - OpenShift 編

# はじめに
IBM DataPower Gateway V10 には以下のエディションが用意されています。

|エディション|提供形態|
|:--|--:|
|DataPower Gateway|ハードウェア・アプライアンス|
|DataPower Gateway for Docker|Docker イメージ|
|DataPower Gateway for Linux|RPM パッケージ|
|DataPower Gateway for VMware|OVA / OVF ファイル|

Docker イメージを除いた提供形態では、[IBM Docs に記載の手順](https://www.ibm.com/docs/ja/datapower-gateways/10.0.1?topic=interfaces-accessing-gui) に従うだけで製品機能による設定のみで簡単に WebGUI のユーザー・インターフェースにアクセスすることができました。

しかし、Docker 版に関してはコンテナー製品の特徴としてコンテナーにアクセスするためのエンドポイントを外部公開する設定が追加で必要になります。

DataPower Gateway for Docker は、コンテナー・オーケストレーションのランタイムでは `Kubernetes` または `OpenShift Container Platform (OCP)` 上で稼働することができます。

本記事では、`OCP` 版の WebGUI へのアクセス設定方法について記載します。

`Kubernetes` 版の設定方法については、こちらの記事が参考になります。

 - [Enabling the WebUI in DataPower in Kubernetes for APIConnect 2018](https://chrisphillips-cminion.github.io/apiconnect/2019/05/17/DataPower-WebUI.html)
 - [How to expose IBM DataPower Gateway Web interface in API Connect 2018 and v10?](https://marukhno.com/how-to-expose-datapower-web-interface-in-api-connect-2018-and-v10/#apic-v10)


# 確認環境
以下の IBM DataPower Gateway V10 for Docker OCP 版で動作確認をしています。

|コンポーネント|バージョン|
|:--|--:|:--:|
|OpenShift Container Platform|4.6.16|
|IBM DataPower Gateway|10.0.1.2-ifix2-100-eus|

また、Gateway は 3 Pod によるクラスター構成としています。

# OCP 版 WebGUI 設定方法

## 前提

 - OCP Route によるアクセスが可能になっていること (DNS や LB が設定済みでコンテナー・プラットフォームとしての準備ができていること)
 - DataPower Gateway のインストールが完了していること


## 設定のながれ

1. DataPower の `ConfigMap` で Web 管理コンソールを有効化する
2. OCP の `Service` オブジェクトを作成する 
3. OCP の `Route` オブジェクトを作成する
4. WebGUI への接続確認をおこなう

## 設定手順

### 1. DataPower の ConfigMap で Web 管理コンソールを有効化する

1.1. 以下の oc コマンドを実行し、DataPower の ConfigMap の存在確認をします。

```
oc get cm gateway-default-domain-config
```

```
NAME                            DATA   AGE
gateway-default-domain-config   2      205d
```

1.2. 以下の oc コマンドを実行し、ConfigMap を編集します。ミスした際にリカバリーできるように、`oc get cm gateway-default-domain-config -o yaml > gateway-default-domain-config_20210830.yaml` などのコマンドで ConfigMap のバックアップを取得しておくことをおすすめします。

```
oc edit cm gateway-default-domain-config
```

```yaml
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  auto-startup.cfg: |
    top; configure terminal;
    %if% available "include-config"

    include-config "auto-user-cfg"
      config-url "config:///auto-user.cfg"
      auto-execute
      no interface-detection
    exit

    exec "config:///auto-user.cfg"

    %endif%
..
```

`data.auto-startup.cfg` のセクションに、以下の定義を追加して ConfigMap を保存します。
port 番号は任意の値を設定できます。明示的に記載しない場合は、デフォルトの `9090` ポートがアクティブになります。

    web-mgmt
      admin-state enabled
      port 9090
    exit

**設定例**

```yaml
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  auto-startup.cfg: |
    top; configure terminal;
    %if% available "include-config"

    include-config "auto-user-cfg"
      config-url "config:///auto-user.cfg"
      auto-execute
      no interface-detection
    exit

    exec "config:///auto-user.cfg"

    %endif%

    # Web Management enabled
    web-mgmt
      admin-state enabled
      port 9090
    exit
..
```

1.3. DataPower の pod を再起動し、ConfigMap の設定を適用します。

```
oc delete pod gateway-0 gateway-1 gateway-2
```

```
# oc get pod -l app.kubernetes.io/instance=apic-gateway
NAME        READY   STATUS    RESTARTS   AGE
gateway-0   1/1     Running   0          12s
gateway-1   1/1     Running   0          5m24s
gateway-2   1/1     Running   0          7m59s
```

### 2. OCP の Service オブジェクトを作成する

以下のような Service オブジェクトの yaml を作成し、gateway pod と同じネームスペース上にリソースを適用します。

```yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: gateway-svc-web-mgmt
  name: gateway-0-svc-web-mgmt
  namespace: apic
spec:
  selector:
    statefulset.kubernetes.io/pod-name: gateway-0
  ports:
  - port: 9090
    protocol: TCP
    targetPort: 9090
  type: ClusterIP
```

```
oc create -f gateway-0-svc-web-mgmt.yaml
```

以上のステップを、DataPower pod 3 台分繰り返し作成、適用します。

 - `metadata.name`  は、Service オブジェクトの一意の名前を付けます。例えば、以下のようにします。
 
    - gateway-0 pod : `gateway-0-svc-web-mgmt`
    - gateway-1 pod : `gateway-1-svc-web-mgmt`
    - gateway-2 pod : `gateway-2-svc-web-mgmt`

 - `metadata.namespace` は、DataPower pod が稼働しているネームスペースを設定します。
 - `spec.selector` は、作成した Service オブジェクトに紐付く DataPower Pod 名を設定します。
 - `spec.ports.port` は、OCP クラスター外部に公開するポートを指定します。
 - `spec.ports.targetPort` は、手順1. で設定した DataPower pod がリッスンしているポートを指定します。 

以下のようなコマンドを実行し、作成した Service オブジェクトの確認をします。
`-l` は、Service オブジェクト作成時にラベリングした名前を指定して検索範囲を絞っています。

```
oc get svc -l app=gateway-svc-web-mgmt
NAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
gateway-0-svc-web-mgmt   ClusterIP   172.30.94.29   <none>        9090/TCP   16m
gateway-1-svc-web-mgmt   ClusterIP   172.30.49.164   <none>        9090/TCP   16m
gateway-2-svc-web-mgmt   ClusterIP   172.30.233.209   <none>        9090/TCP   16m
```


### 3. OCP の Route オブジェクトを作成する

以下のような Route オブジェクトの yaml を作成し、gateway pod と同じネームスペース上にリソースを適用します。

```yaml
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  labels:
    app: gateway-route-web-mgmt
  name: gateway-0-web-mgmt
  namespace: apic
spec:
  host: gateway-0.apps.example.com
  port:
    targetPort: 9090
  tls:
    insecureEdgeTerminationPolicy: None
    termination: passthrough
  to:
    kind: Service
    name: gateway-0-svc-web-mgmt
```

```
oc create -f gateway-0-web-mgmt.yaml
```

以上のステップを、DataPower pod 3 台分繰り返し作成、適用します。

 - `metadata.name`  は、Route オブジェクトの一意の名前を付けます。例えば、以下のようにします。
 
    - gateway-0 pod : `gateway-0-web-mgmt`
    - gateway-1 pod : `gateway-1-web-mgmt`
    - gateway-2 pod : `gateway-2-web-mgmt`

 - `metadata.namespace` は、DataPower pod が稼働しているネームスペースを設定します。
 - `spec.host` は、OCP Route で名前解決可能な (本記事では *.apps.example.com のワイルドカードドメインを使用) 一意のホスト FQDN を設定します。
 - `spec.port.targetPort` は、手順1. で設定した DataPower pod がリッスンしているポートを指定します。
 - `spec.tls` は、ここでは例のとおり指定しています。より詳しくは OCP の [Secured Routes](https://docs.openshift.com/container-platform/4.6/networking/routes/secured-routes.html) を参照ください。
 - `spec.to` は、`kind: Service` , `name: 手順2.で作成した Service オブジェクト名` を指定します。
 
以下のようなコマンドを実行し、作成した Route オブジェクトの確認をします。
`-l` は、Route オブジェクト作成時にラベリングした名前を指定して検索範囲を絞っています。

```
oc get svc -l app=gateway-route-web-mgmt
NAME                      HOST/PORT                    PATH   SERVICES                 PORT   TERMINATION          WILDCARD
gateway-0-web-mgmt        gateway-0.apps.example.com          gateway-0-svc-web-mgmt   9090   passthrough/None     None
gateway-1-web-mgmt        gateway-1.apps.example.com          gateway-1-svc-web-mgmt   9090   passthrough/None     None
gateway-2-web-mgmt        gateway-2.apps.example.com          gateway-2-svc-web-mgmt   9090   passthrough/None     None

```

### 4. WebGUI への接続確認をおこなう
Web ブラウザを開き、アドレスバーに `https://ホストFQDN:targetPort/login.xml` を入力します。

```
https://gateway-0.example.com:9090/login.xml
```

WebGUI にアクセスができるようになりました。
![Screenshot 2021-08-30 at 20-19-16 gateway-0 Login gateway-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1953237/dd0e42f0-8028-ef1e-2dae-128a198be6f3.png)

# おわりに
DataPower コンテナーの OCP 版における、WebGUI のアクセス設定手順について記載しました。
ハードウェア・アプライアンス版や VMware 版とは違い、コンテナー・プラットフォームは複数リソースの設定や作成が必要なことがわかりました。

# 参照
[DataPower Gateways - Deliverables](https://www.ibm.com/docs/ja/datapower-gateways/10.0.1?topic=virtual-deliverables)
[DataPower Gateways - Accessing the GUI](https://www.ibm.com/docs/ja/datapower-gateways/10.0.1?topic=interfaces-accessing-gui)
[Enabling the WebUI in DataPower in Kubernetes for APIConnect 2018](https://chrisphillips-cminion.github.io/apiconnect/2019/05/17/DataPower-WebUI.html)
[How to expose IBM DataPower Gateway Web interface in API Connect 2018 and v10?](https://marukhno.com/how-to-expose-datapower-web-interface-in-api-connect-2018-and-v10/#apic-v10)
[Red Hat OpenShift - Secured Routes](https://docs.openshift.com/container-platform/4.6/networking/routes/secured-routes.html)