OCI File Storage with Lustre に OKE の Pod からアクセスする

## はじめに

OCI File Storage with Lustre がリリースされました！
Kubernetes用のCSIドライバも提供されていて、OKE用のPV/PVCも作れるようになっていますが、この記事の執筆の時点で、LustreクライアントがインストールされたOKEワーカー・ノード用のイメージが提供されていません。

ということで、LustreクライアントがインストールされたOKEワーカー・ノード用のイメージを作成して、OKEのノード・プールを作成してみたいと思います。そうすればこのノード上にデプロイされたPodはめでたくLustreをマウントできます。

## 作業手順

1. ワーカー・ノード用イメージを作成する
1. OKEのノード・プールを作成する
1. PV/PVCを作成する
1. PodからLustreファイル・システムにアクセスする


### 1. ワーカー・ノード用イメージを作成する

#### 1-1. イメージOCIDの取得

OKEのワーカー・ノード用のイメージはOracleから提供されています。
Linux 8.xのOKE用イメージのOCIDは本来はここで取得可能です。


https://docs.oracle.com/en-us/iaas/images/oke-worker-node-oracle-linux-8x/index.htm


が、しかしながら最新のOKE 1.32.1用のイメージがまだ掲載されていません！
（近日掲載されるとは思いますが...）

ということで、最新イメージのOCIDを探さないといけないのですが、1.32.1のノード・プールを作成すると、使用しているイメージが出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/d51ecbf5-b2dd-419b-b735-18b4a73faf64.png)

イメージ名のところがリンクになっているので、ここをクリックすると詳細画面に遷移して、ここでこのイメージのOCIDが取得できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/e623efe4-c28c-4a6c-971c-c09de26d4beb.png)

※ イメージのOCIDはリージョン毎に異なります。

私が検証した時点では、通常のノード・プールであれば、
`Oracle-Linux-8.10-2025.02.28-0-OKE-1.32.1-760`
GPUを搭載したノードプールを作成するのであれば、
`Oracle-Linux-8.10-Gen2-GPU-2025.02.28-0-OKE-1.32.1-760`
が選択肢となります。

#### 1-2. インスタンスの起動 ＆ Lustreクライアントのインストール

このイメージを使って、まずは通常のコンピュート・インスタンスとして起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/77e4c6a4-5fea-49bb-b4e1-5ea7289df330.png)

起動した後は、sshでログインして、Lustreクライアントをインストールします。
Lustreクライアントのインストールについては、以下のドキュメンテーションやQiitaの記事を参照して下さい。

https://docs.public.oneportal.content.oci.oraclecloud.com/ja-jp/iaas/Content/lustre/file-system-connect.htm

https://qiita.com/shirok/items/96343c9278ce31923c9b


#### 1-3. カスタム・イメージの作成

Lustreクライアントをインストールしたインスタンスからカスタム・イメージを作成します。
コンソールのインスタンス詳細画面から「アクション」「カスタム・イメージを作成」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/1ce95828-8207-484b-ac42-599cd1907fd4.png)

ここでは "oke-woker-base-1.32.1" という名前でカスタム・イメージを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/4b57612e-f94a-4a1a-a056-ab1224ec0e43.png)


カスタム・イメージの詳細画面でこのイメージのOCIDが確認できます。このOCIDを使ってこの後ノード・プールを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/4ace6514-124d-49e2-96af-8281939061a8.png)

### 2. OKEのノード・プールを作成する

コンソールからだと、先ほど作成したカスタム・イメージを選択してノード・プールを作成することができませんが、APIとしてはサポートしていますので、CLIを使ってノード・プールを作成します。

```
oci ce node-pool create \
  -c ocid1.compartment.oc1..aaaaaaaaxxxxxxxxxxx \
  --cluster-id ocid1.cluster.oc1.iad.aaaaaaaaxxxxxxxxxxxxx \
  --name Lustre_Nodepool \
  --kubernetes-version v1.32.1 \
  --node-shape VM.Standard.E5.Flex \
  --placement-configs '[{"availability-domain": "OcIE:US-ASHBURN-AD-1","subnet-id": "ocid1.subnet.oc1.iad.aaaaaaaaxxxxxxxxxxxxxxx"}]' \
  --size 2 \
  --node-image-id ocid1.image.oc1.iad.aaaaaaaauxxxxxxxxxxxx \
  --node-shape-config '{"ocpus": 1.0, "memoryInGBs": 8.0}'  \
  --ssh-public-key "ssh-rsa AAAABxxxxxxxxxxJHw== rsa-key-yyyymmdd"
```

OKEのコンソール画面から無事カスタム・イメージを使ってノード・プールが作成されていることを確認して下さい。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/e0353275-5dd6-48ee-88f4-b55c32ab7124.png)

### 3. PV/PVCを作成する

ドキュメンテーションはこちらにあります。

https://docs.oracle.com/ja-jp/iaas/Content/ContEng/Tasks/contengcreatingpersistentvolumeclaim_Provisioning_PVCs_on_Lustre.htm


#### 3-1. PersistentVolume

`volumeHandle`の部分は、File Storage with Lustre のコンソールに表示されるマウント・コマンドの情報を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544382/e32adb1c-e415-47ec-8073-a69370735f3d.png)


```yaml
# lustre-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: lustre-pv
spec:
  capacity:
    storage: 31Ti
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  csi:
    driver: lustre.csi.oraclecloud.com
    volumeHandle: "10.0.2.66@tcp:/lustrefs"
    fsType: lustre
    volumeAttributes:
      setupLnet: "true”
```

#### 3-2. PersistentVolumeClaim

```yaml
# lustre-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: lustre-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: ""
  volumeName: lustre-pv
  resources:
    requests:
      storage: 31Ti
```

### 4. PodからLustreファイル・システムにアクセスする

前述のPV/PVCをデプロイし、PVCを使ってLustreファイル・システムをマウントしたPodをデプロイします。

```yaml
# lustre-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: lustre-pod
spec:
  containers:
    - name: busybox
      image: busybox:latest
      command:
      - sleep
      - infinity
      volumeMounts:
        - name: persistent-storage
          mountPath: /data
  volumes:
  - name: persistent-storage
    persistentVolumeClaim:
      claimName: lustre-pvc
```

では、Podをデプロイして、Lustreファイル・システムにアクセスしてみましょう。

```
$ kubectl apply -f lustre-pod.yaml 
pod/lustre-pod created

$ kubectl exec lustre-pod -- touch /data/test.txt

$ kubectl exec lustre-pod -- ls -l /data/test.txt
-rw-r--r--    1 root     root             0 Apr 29 13:41 /data/test.txt

$ kubectl exec lustre-pod -- rm  /data/test.txt

$ kubectl delete pod lustre-pod
pod "lustre-pod" deleted
```

## まとめ

カスタム・イメージはエクスポートしておけば、リージョンを超えて複数のプロジェクトで使いまわせます。

OKEのノード・プールをアップグレードしてしまうと、Lustreクライアントがインストールされていないイメージに入れ替わってしまうので注意して下さい。