[SevOne] Rapid Network Automationをセットアップしてみた

# はじめに
IBM SevOne Automated Network Observabilityの製品の中に、IBM Rapid Network Automation(IRNA)というコンポーネントが含まれる様になりました。IRNAはAPI主導のローコード・ワークフローエンジンで、iPaaS(Integration Platform as a Service)のような使い勝手を想像すると分かりやすいと思います。ただし、IRNAはSaaSでは無くオンプレミスのデプロイメントとなります。

SevOneのNMSやData Insightは仮想アプライアンス(OVA)としての提供なので仮想基盤にデプロイするだけで良いのですが、IRNAはKubernetesのHelmパッケージとしての提供となっているため、VMのOSからセットアップが必要です。本稿では、VM上にK3sを構成してIRNAをセットアップしてみたので、その手順をご紹介します。  

本手順は以下の環境で実施しています。
- VM: IBM Cloud VSI (Classic) 
- OS: RHEL 8.8
- K3s: v1.27.6 (Single Node)
- helm: v3.13.1
- IRNA: 1.1

# 本手順の対象・流れ
OSのセットアップを行い、IRNAをインストールし、Web UIにアクセスするところまでとします。
必要な要件はIRNAのイメージに同梱されているInstallation Instructionsに記載がありますが、以下の通りとなっています。
- RHEL 8.8 or Ubuntu 20.0.4 LTS
- JRE 11 (インストール時のみ)
- Kubernetes 1.24.x
- Helm 3.x

その後付属のスクリプトを使用してIRNAをインストールします。（内部的にはHelmパッケージのインストール）

# 1. K3s環境セットアップ
[K3sのドキュメント][1]と[Helmのドキュメント][2]を参照して進めていきます。

[1]:https://docs.k3s.io/quick-start
[2]:https://helm.sh/docs/intro/install/

## 1.1. firewall無効化
OSのfirewallが無効化されていることを確認します。本環境では無効化済みでした。

```bash
[root@irna-host ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor >
   Active: inactive (dead)
     Docs: man:firewalld(1)
```

:::note info
firewallを有効のまま進める必要がある場合は[ドキュメント][1-1]を参照。
:::

[1-1]:https://docs.k3s.io/advanced#red-hat-enterprise-linux--centos--fedora

## 1.2. K3sのインストール
Quick-Start Guideのワンライナーを実行します。

```bash
[root@irna-host ~]# curl -sfL https://get.k3s.io | sh -
```
インストールが成功したら、バージョンを確認します。

```bash
[root@irna-host ~]# kubectl version --short
Flag --short has been deprecated, and will be removed in the future. The --short output will become the default.
Client Version: v1.27.6+k3s1
Kustomize Version: v5.0.1
Server Version: v1.27.6+k3s1
```

## 1.3. helmのインストール
こちらも公式の手順でインストールします。
繋げてワンライナーとして、以下のコマンドを実行します。

```bash
[root@irna-host ~]# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 && chmod 700 ./get_helm.sh && bash ./get_helm.sh
```

インストールが成功したら、バージョンを確認します。

```bash
[root@irna-host ~]# helm version --short
v3.13.1+g3547a4b
```

## 1.4. JRE 11のインストール
Javaのインストール。単に`java`だとJava 8になってしまうので注意。

```bash
[root@irna-host ~]# yum -y install java-11
```

インストールが成功したら、バージョンを確認します。

```bash
[root@irna-host ~]# java -version
openjdk version "11.0.20" 2023-07-18 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.20.0.8-1) (build 11.0.20+8-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.20.0.8-1) (build 11.0.20+8-LTS, mixed mode, sharing)
```

## 1.5. K3s Traefik無効化
K3sをインストールするとデフォルトで[Traefik Ingress Controller][1-5]が動作しているようで、これがExternal-IPを掴んでいます。このままでは、IRNAでデプロイされるNginx Load Balancerとかち合ってしまうため、本手順ではTraefikを無効化します。（本来はポリシーを設定すべきなのかもしれませんが。）

[1-5]:https://docs.k3s.io/networking#traefik-ingress-controller

```bash
[root@irna-host ~]# kubectl get service -A
NAMESPACE     NAME             TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                      AGE
default       kubernetes       ClusterIP      10.43.0.1       <none>           443/TCP                      18m
kube-system   kube-dns         ClusterIP      10.43.0.10      <none>           53/UDP,53/TCP,9153/TCP       18m
kube-system   metrics-server   ClusterIP      10.43.240.228   <none>           443/TCP                      18m
kube-system   traefik          LoadBalancer   10.43.5.162     "Global IP"      80:30118/TCP,443:32338/TCP   18m
```

まずK3sを停止します。
```bash
[root@irna-host ~]# service k3s stop
Redirecting to /bin/systemctl stop k3s.service
```

Systemdのサービスファイルを編集し、末尾のサービス起動オプションに`--disable=traefik`を追記します。

```diff
[root@irna-host ~]# vi /etc/systemd/system/k3s.service
[Unit]
Description=Lightweight Kubernetes
Documentation=https://k3s.io
Wants=network-online.target
After=network-online.target

[Install]
WantedBy=multi-user.target

[Service]
Type=notify
EnvironmentFile=-/etc/default/%N
EnvironmentFile=-/etc/sysconfig/%N
EnvironmentFile=-/etc/systemd/system/k3s.service.env
KillMode=process
Delegate=yes
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
TimeoutStartSec=0
Restart=always
RestartSec=5s
ExecStartPre=/bin/sh -xc '! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service'
ExecStartPre=-/sbin/modprobe br_netfilter
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/k3s \
-    server \
+    server --disable=traefik \
```

リロードをしてから、K3sサービスを起動します。
```bash
[root@irna-host ~]# systemctl daemon-reload
[root@irna-host ~]# systemctl start k3s
```

Traefikが起動していないことを確認します。
```bash
[root@irna-host ~]# kubectl get service -A
NAMESPACE     NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                  AGE
default       kubernetes       ClusterIP   10.43.0.1       <none>        443/TCP                  45m
kube-system   kube-dns         ClusterIP   10.43.0.10      <none>        53/UDP,53/TCP,9153/TCP   45m
kube-system   metrics-server   ClusterIP   10.43.240.228   <none>        443/TCP                  45m
```


# 2. IRNAのインストール
## 2.1. KUBECONFIGの設定
HelmがKUBECONFIGを使用できるように設定します。

```bash
[root@irna-host ~]# echo "KUBECONFIG=/etc/rancher/k3s/k3s.yaml" >> ~/.bashrc
[root@irna-host ~]# export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
```
:::note warn
環境変数のexportを忘れるとhelmによるインストールが失敗しますので、お忘れなく。
:::

## 2.2. イメージを読み込み
RNAの製品イメージを解凍すると`M0DRSEN`というディレクトリが含まれており、この中にRNAのイメージが含まれています。さらに必要なものを解凍して、イメージをローカルリポジトリに読み込みます。
RNA1.1では24のコンテナ・イメージが読み込まれました。
```bash
[root@irna-host ~]# cd M0DRSEN
[root@irna-host M0DRSEN]# gzip -dk ./RNA/images/ibm-images-rna-core-*.tar.gz
[root@irna-host M0DRSEN]# ctr -n k8s.io -a /run/k3s/containerd/containerd.sock image import ./RNA/images/ibm-images-rna-core-*.tar
```

## 2.3. インストールスクリプトの実行
`install.sh`を実行します。
License AgreementにAcceptするとインストールが始まります。
```bash
[root@irna-host M0DRSEN]# ./install.sh 
```
`IBM RNA core installation is successful.`と出力されたら成功です。

## 2.4. インストールの確認
RNAは`rna-core`ネームスペースにインストールされています。
```bash
[root@irna-host M0DRSEN]# kubectl get pods -n rna-core
NAME                                                    READY   STATUS      RESTARTS      AGE
rna-core-addon-ansible-75f5cb8f69-gvcfs                 1/1     Running     0             21m
rna-core-pliant-kv-store-677d9b6f46-lx8fm               1/1     Running     0             21m
rna-core-addon-napalm-6487f6b7d8-6fpwp                  1/1     Running     0             21m
rna-core-addon-themes-7458c89cb9-x2nqg                  1/1     Running     0             21m
rna-core-addon-mqws-58c8d4fc8c-p58vf                    1/1     Running     0             21m
rna-core-rabbitmq-0                                     1/1     Running     0             21m
rna-core-pliant-proxy-7cd5685f8-sn4k9                   1/1     Running     0             21m
rna-core-pliant-compiler-6d4c476c58-m7795               1/1     Running     0             21m
rna-core-addon-textfsm-6b68c5b9c-7sscr                  1/1     Running     0             21m
rna-core-pliant-front-6d4fb4bbc5-pj228                  1/1     Running     0             21m
rna-core-pliant-front-6d4fb4bbc5-nz2n2                  1/1     Running     0             21m
rna-core-mysqldb-0                                      1/1     Running     0             21m
rna-core-object-storage-0                               1/1     Running     0             21m
rna-core-pliant-flow-converter-66798f97b-jmbgm          1/1     Running     2 (21m ago)   21m
rna-core-pliant-stats-0                                 1/1     Running     0             21m
rna-core-pliant-db-migration-cccf9dbb5-fxfdk            1/1     Running     1 (20m ago)   21m
rna-core-pliant-api-5c5f9877b6-7495l                    2/2     Running     1 (20m ago)   21m
rna-core-pliant-api-5c5f9877b6-lmjcd                    2/2     Running     1 (20m ago)   21m
rna-core-license-add-job-p97wkfjb-mdd2l                 0/1     Completed   0             21m
rna-core-configure-admin-job-k9jhz                      0/1     Completed   0             21m
rna-core-configure-ui-themes-job-b5mrl                  0/1     Completed   0             21m
rna-core-pliant-app-gateway-7c96c6559d-wdjmw            1/1     Running     5 (19m ago)   21m
rna-core-pliant-scheduler-657d7cb9cc-44t4c              1/1     Running     5 (18m ago)   21m
rna-core-install-integrations-hfk67kce-5knb8            0/1     Completed   0             21m
rna-core-pliant-worker-6cbd695bcd-zmsbv                 1/1     Running     6 (16m ago)   21m
rna-core-pliant-worker-nodejs-remote-75d5bc896d-ckhrr   1/1     Running     6 (16m ago)   21m
rna-core-pliant-worker-6cbd695bcd-pgvqj                 1/1     Running     6 (16m ago)   21m
```

```bash
[root@irna-host M0DRSEN]# kubectl get svc -n rna-core
NAME                          TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                                     AGE
rabbitmq                      ClusterIP      10.43.38.9      <none>           5672/TCP                                    23m
pliant-compiler               ClusterIP      10.43.199.4     <none>           8081/TCP                                    23m
pliant-front                  ClusterIP      10.43.160.169   <none>           8000/TCP                                    23m
pliant-flow-converter         ClusterIP      10.43.1.187     <none>           8081/TCP                                    23m
addon-textfsm                 ClusterIP      10.43.223.120   <none>           5000/TCP                                    23m
pliant-db-migration           ClusterIP      10.43.225.138   <none>           3000/TCP                                    23m
addon-ansible                 ClusterIP      10.43.64.122    <none>           5000/TCP                                    23m
pliant-api                    NodePort       10.43.164.47    <none>           8080:31455/TCP                              23m
pliant-app-gateway            ClusterIP      10.43.221.212   <none>           8083/TCP,2020/TCP                           23m
addon-mqws                    ClusterIP      10.43.134.61    <none>           8084/TCP                                    23m
pliant-worker-nodejs-config   ClusterIP      10.43.226.219   <none>           3000/TCP                                    23m
addon-themes                  ClusterIP      10.43.147.40    <none>           8084/TCP                                    23m
pliant-stats                  ClusterIP      10.43.157.118   <none>           8086/TCP                                    23m
object-storage                ClusterIP      10.43.83.245    <none>           9000/TCP                                    23m
addon-napalm                  ClusterIP      10.43.122.202   <none>           5000/TCP                                    23m
pliant-kv-store               ClusterIP      10.43.64.44     <none>           6379/TCP                                    23m
mysqldb                       ClusterIP      10.43.169.22    <none>           3306/TCP,33060/TCP                          23m
pliant-proxy                  LoadBalancer   10.43.175.11    "Global IP"      80:32544/TCP,443:31086/TCP,5671:31253/TCP   23m
```

## 2.5. Web UI へのアクセス確認

adminユーザーのデフォルトパスワードは以下のコマンドで取得します。
```bash
[root@irna-host M0DRSEN]# kubectl get secret -n rna-core rna-core-pliant-secrets -o jsonpath='{.data.admin-password}' | base64 -d; echo ""
```

ブラウザでサービスIP(VMのIP)にアクセスします。
以下のログイン画面が表示されるので、先ほど取得したパスワードでログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/6b30ae8e-ad5b-3a3d-a4b0-0bb27284bb27.png)

ログインが成功すると、以下のようなダッシュボードが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319123/a6802411-7a52-3b4e-061d-9fb91481b397.png)


# まとめ
IRNAのセットアップについて、実際にやってみた手順をまとめました。
IRNAでのワークフローの作成例については、また別の機会に。
以上、少しでも参考になれば幸いです。