備忘録：OpenShift AIのCR: DataScienceClusterコンポーネントをInfra NodeにDeployする方法

# 三行まとめ
- OpenShift AIを使う為にはCustomeResource「DataScienceCluster」を作成する必要がある
- DataScienceClusterを作成する際に指定する事はできない
- 各コンポーネントがDeployされた後にNodeSelector等の設定をする


# Infra Nodeには以下のLabelとTaintsが付いているとする
```yaml
metadata:
  labels:
    node-role.kubernetes.io/infra: ''
（中略）
spec:
  taints:
    - key: node-role.kubernetes.io/infra
      effect: NoSchedule
```

# OpenShift AI OperatorをインストールしてからDataScienceClusterを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/3647d957-4674-110a-8b91-5051d11f0cbc.png)
※例ではデフォルト設定で作成している

各コンポーネントはNameSpace「redhat-ods-applications」にDeployされるので、しばし待つ。
※5,6分くらいは待つイメージ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/625a1444-74be-ca5e-cdc9-8079e7ef8955.png)


`oc`コマンドでProjectを変更する

```sh
oc project redhat-ods-applications
```
一応`oc get deployment`で各コンポーネントを確認してみる

```sh
~ % oc get deployment 
NAME                                                 READY   UP-TO-DATE   AVAILABLE   AGE
codeflare-operator-manager                           1/1     1            1           37m
data-science-pipelines-operator-controller-manager   1/1     1            1           40m
etcd                                                 1/1     1            1           40m
kserve-controller-manager                            1/1     1            1           39m
kubeflow-training-operator                           1/1     1            1           34m
kuberay-operator                                     1/1     1            1           35m
kueue-controller-manager                             1/1     1            1           39m
modelmesh-controller                                 3/3     3            3           40m
notebook-controller-deployment                       1/1     1            1           41m
odh-model-controller                                 3/3     3            3           40m
odh-notebook-controller-manager                      1/1     1            1           41m
rhods-dashboard                                      4/5     5            4           42m
trustyai-service-operator-controller-manager         1/1     1            1           34m
```

以下のコマンドを流す

```sh
for deployment in $(kubectl get deployments -o jsonpath='{.items[*].metadata.name}'); do
  kubectl patch deployment $deployment --type='json' -p='[{"op": "add", "path": "/spec/template/spec/nodeSelector", "value": {"node-role.kubernetes.io/infra": ""}}, {"op": "add", "path": "/spec/template/spec/tolerations", "value": [{"key": "node-role.kubernetes.io/infra", "operator": "Exists", "effect": "NoSchedule"}]}]'
done
```
パッチが適用された旨Logが出る。
```sh
deployment.apps/codeflare-operator-manager patched
deployment.apps/data-science-pipelines-operator-controller-manager patched
deployment.apps/etcd patched
deployment.apps/kserve-controller-manager patched
deployment.apps/kueue-controller-manager patched
deployment.apps/modelmesh-controller patched
deployment.apps/notebook-controller-deployment patched
deployment.apps/odh-model-controller patched
deployment.apps/odh-notebook-controller-manager patched
deployment.apps/rhods-dashboard patched
```

各コンポーネントがInfra Nodeにリスケジュールされ始めるのでしばらく待つ。
この操作により、例えばDeployment「rhods-dashboard」はのYAMLに以下のようなパラメータが付与される。

```rhods-dashboard.yaml
spec:
  template:
    spec:
      nodeSelector:
        node-role.kubernetes.io/infra: ''
      tolerations:
        - key: node-role.kubernetes.io/infra
          operator: Exists
          effect: NoSchedule
```

# おわり
調べてもイマイチドンピシャな情報が出てこなかったので、どこかの誰かにお役に立てば...