OpenShiftでIBM PowerのRMC接続をするための方法

# RMC接続とは
IBM Powerでは、LPARに割り当てられたリソースの動的変更やLPM (Live Partition Mobility)を行うために、RMC（Resource Monitoring and Control） 接続が必要となります。  
RMC接続はHMCからLPARを管理するための接続となっています。

リソースの動的変更はDLPARと呼ばれ、CPUやメモリーの増減やI/Oアダプターの接続・削除をLPARを稼働したまま行うことができます。

Linuxでも利用できるのですが、OpenShiftで使用されるCoreOSでも利用できます。
CoreOSの場合は、OS自身にRMC用のパッケージをインストールするのではなく、RMC接続用のコンテナを起動することでHMCとの通信ができるようになります。

# OpenShift環境でのRMC接続
## namespaceの作成
RMC用のコンテナを実行するためのnamespace `powervm-rmc` を作成します。

```:コマンド
oc new-project powervm-rmc
```

```:実行結果
[root@ocp-bastion ~]# oc new-project powervm-rmc
Now using project "powervm-rmc" on server "https://api.ocp.3n7.com:6443".

You can add applications to this project with the 'new-app' command. For example, try:

    oc new-app rails-postgresql-example

to build a new example application in Ruby. Or use kubectl to deploy a simple Kubernetes application:

    kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.43 -- /agnhost serve-hostname
```

## サービスアカウントの作成
RMCはコンテナが稼働するノードのOS部分に影響を与えるため、SCC(Security Context Constrains)設定が必要となります。
そのため、サービスアカウント `powervm-rmc` を作成します。

```:コマンド
oc create sa powervm-rmc
```

```:実行結果
[root@ocp-bastion ~]# oc create sa powervm-rmc
serviceaccount/powervm-rmc created
```

## SCCの適用
上記で作成したサービスアカウントに権限を付与します。
```:コマンド
oc adm policy add-scc-to-user -z powervm-rmc privileged -n powervm-rmc
```
```:実行結果
[root@ocp-bastion ~]# oc adm policy add-scc-to-user -z powervm-rmc privileged -n powervm-rmc
clusterrole.rbac.authorization.k8s.io/system:openshift:scc:privileged added: "powervm-rmc"
```

## デプロイメントの作成 
RMC接続用のコンテナを起動するためのデプロイメントを記述します。
以下の内容を含むyamlファイルを作成してください。
```yaml:powervm-rmc-deployment.yaml
kind: DaemonSet
apiVersion: apps/v1
metadata:
  name: powervm-rmc
  namespace: powervm-rmc
spec:
  selector:
    matchLabels:
      app: powervm-rmc
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: powervm-rmc
    spec:
      nodeSelector:
        kubernetes.io/arch: ppc64le
        node.openshift.io/os_id: rhcos
      restartPolicy: Always
      serviceAccountName: powervm-rmc
      hostNetwork: true
      containers:
        - name: powervm-rmc
          image: "quay.io/powercloud/rsct-ppc64le:latest"
          ports:
            - name: rmc-tcp
              hostPort: 657
              containerPort: 657
              protocol: TCP
            - name: rmc-udp
              hostPort: 657
              containerPort: 657
              protocol: UDP
          resources:
            requests:
              cpu: 100m
              memory: 500Mi
            limits:
              memory: 4Gi
          volumeMounts:
            - name: lib-modules
              mountPath: /lib/modules
              readOnly: true
          securityContext:
            privileged: true
            runAsUser: 0
      serviceAccount: powervm-rmc
      volumes:
        - name: lib-modules
          hostPath:
            path: /lib/modules
      tolerations:
        - key: node-role.kubernetes.io/master
          operator: Exists
          effect: NoSchedule
```

## デプロイメント適用

最後に、上記で作成したyamlファイルをOpenShiftクラスターに適用します。
```:コマンド
oc apply -f powervm-rmc-deployment.yaml
```
```
[root@3n7-ocp-bastion ~]# oc apply -f powervm-rmc-deployment.yaml
daemonset.apps/powervm-rmc created
```

## 起動確認
デプロイしたPodが稼働しているかを下記のコマンドで確認します。
```:コマンド
oc get pod -n powervm-rmc -o wide
```
すべてのノード (Master, Worker問わず) で稼働していることが下記のように確認できます。
```
[root@3n7-ocp-bastion ~]# oc get pod -n powervm-rmc -o wide
NAME                READY   STATUS    RESTARTS   AGE   IP             NODE                   NOMINATED NODE   READINESS GATES
powervm-rmc-2g4h2   1/1     Running   1          9d    192.168.60.3   master-2.ocp.3n7.com   <none>           <none>
powervm-rmc-56qbg   1/1     Running   1          9d    192.168.60.1   master-0.ocp.3n7.com   <none>           <none>
powervm-rmc-m5vxc   1/1     Running   2          9d    192.168.60.4   worker-0.ocp.3n7.com   <none>           <none>
powervm-rmc-nds5h   1/1     Running   1          9d    192.168.60.6   worker-2.ocp.3n7.com   <none>           <none>
powervm-rmc-tlb6q   1/1     Running   1          9d    192.168.60.5   worker-1.ocp.3n7.com   <none>           <none>
powervm-rmc-xwsgv   1/1     Running   1          9d    192.168.60.2   master-1.ocp.3n7.com   <none>           <none>
```

また、画像のようにHMC上でRMC接続がアクティブ表記になっていればHMCへの接続もできている状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/42f12bcd-ea1c-bd4d-f4e0-1f8702b8ef3a.png)

Power Virtual Serverの場合は、インスタンス一覧の一番右側 `状況` が アクティブになっていればRMC接続が確立されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242652/45fe9017-0933-a27e-8b80-d12c2f8fb555.png)