はじめに
前回の記事では、Single Node構成でのOpenShift環境が構築について記載しましたが、本記事ではアプリケーションが永続データを利用できるStorage基盤の作成について記載します。
Storage基盤としてNetApp ONTAP StorageをOpenShiftから利用するための基本設定、StorageオーケストレーターであるNetApp Tridentを導入し、OpenShiftから動的にボリュームをプロビジョニングできる環境の構築についての内容になります。
何をしたい?できる?
- ONTAPでOpenShiftのPersistent Volume(PV)用のSVM作成
- NetApp Tridentの導入
- 試験用Podを作成してWriteの確認
NetApp Tridentとは
NetApp Tridentは、NetApp Storageを簡単に使えるようにするためのCSI(Container Storage Interface)対応のStorageプロビジョナーとなり、KubernetesやOpenShiftからの要求に応じて、Storage上にVoluumeを自動作成・管理します。
これにより、コンテナアプリケーションが永続ストレージを動的に利用でき、運用の自動化や管理の効率化が可能になります。
Storage Driverの選択
使用されるプロトコルとStorage上でのVolumeのプロビジョニング方法によって区別されるものになりますが、明確な要望やStorage側の各種上限(Volume数やSize)に抵触しない限りは、”ontap-nas”または”ontap-san”を選択する事になるかと思います。
詳細はマニュアルを参照頂ければと思いますが、NASのDriverでは以下の機能の違いがあります。
記事における環境情報
本記事では、以下の環境で実施した内容となります。
OSやモジュールは以下の構成としています。
- ONTAP 9.17.1
- NetApp Trident 26.02.1
- Windows Server 2025 Hyper-V環境
- Red Hat Enterprise Linux 9.8
- OpenShift 4.21.16
環境のイメージとしては以下の通りです。
設定手順
設定の流れとしては以下のような形になります。
1. PV作成用のNFS Storage用意(NFS用のSVM作成)
2. Tridentの導入+設定
1. PV作成用のNFS Storage作成
1-1. NFS用のSVM作成
本記事ではNFS用SVMを作成し、データ疎通だけでなく、TrindenとAPI疎通する経路についても合わせて172.16.21.0/24のNetworkで用意します。
まずは、SVMをNFS用途で作成します。
SVM作成の参考として過去の記事を確認頂ければと思います。
# SVMの作成
> vserver create -vserver nfs100 -subtype default
[Job 1385] Job succeeded:
Vserver creation completed.
# Volume作成時に利用するAggregateの定義
> vserver modify -vserver nfs100 -aggr-list aggr1_node1,aggr1_node2
2-2. NFS用のSVMへLIFの作成
管理用とデータ通信用のLIFを作成します。
# LIFの作成
> network interface create -vserver nfs100 -lif manage -service-policy default-management -address 10.11.100.47 -netmask 255.255.255.0 -home-node PS-A400-01 -home-port a0a
> network interface create -vserver nfs100 -lif data -service-policy default-data-files -address 10.11.100.48 -netmask 255.255.255.0 -home-node PS-A400-01 -home-port a0a
# 設定情報の確認
> network interface show -vserver nfs100
Logical Status Network Current Current Is
Vserver Interface Admin/Oper Address/Mask Node Port Home
----------- ---------- ---------- ------------------ ------------- ------- ----
nfs100
data up/up 10.11.100.48/24 PS-A400-01 a0a true
manage up/up 10.11.100.47/24 PS-A400-01 a0a true
2 entries were displayed.
2-3. NFSのSVMへの有効化
NFS設定を有効化し、SVMのroot Volumeへアクセス設定を実施します。
# SVMへのNFS有効化
> nfs create -vserver nfs100
# 状態の確認
> nfs show -vserver nfs100
Vserver: nfs100
General NFS Access: true
NFS v3: enabled
NFS v4.0: enabled
UDP Protocol: enabled
TCP Protocol: enabled
Default Windows User: -
(中略)
# Export Policyの設定
> export-policy rule create -vserver nfs100 -policyname default -clientmatch 0.0.0.0/0 -rorule any -rwrule any -anon 0
2-4. APIアクセス用のユーザ用意
本記事ではONTAP Cluster全体へアクセスでは無く、個々のSVMにAPIを投げる形で作成したいので作成したSVMでAPIアクセス用のユーザ作成が必要になります。
ここでは楽をする為に、SVM作成時に自動で作成されるvsadminユーザを利用します。
# ユーザへのPassword設定
> security login password -vserver nfs100 -username vsadmin
Enter a new password:
Enter it again:
# UserのUnlock
> security login unlock -vserver nfs100 -username vsadmin
# User情報の確認
> security login show -vserver nfs100
Vserver: nfs100
Second
User/Group Authentication Acct Authentication
Name Application Method Role Name Locked Method
-------------- ----------- ------------- ---------------- ------ --------------
vsadmin http password vsadmin no none
vsadmin ontapi password vsadmin no none
vsadmin ssh password vsadmin no none
3 entries were displayed.
3. NetApp Tridentの導入
3-1. Tridentをインストール
OpenShiftのGUI画面にアクセスし、左側の[エコシステム]から[ソフトウェアカタログ]をクリック後に表示された画面でTridentと入力し、表示される[NetApp Trident]をクリックします。
(Certifiedの方を利用)

表示された画面の下方にある[インストール]をクリックします。

Install完了後に、[Operatorの表示]をクリックします。
表示された画面で[インスタンスを作成]をクリックし、Trident Orchestratorのインスタンスを作成します。
(本記事ではiscsiを利用しないので、yamlにあるnodePrepへiscsiの追記はしていません)

踏み台サーバからInstall後の状態について確認します。
# Trident Install後の確認
> oc get pod -n trident
NAME READY STATUS RESTARTS AGE
trident-controller-555f57b76c-cws9q 6/6 Running 0 3m30s
trident-node-linux-8djv8 2/2 Running 2 (118s ago) 3m30s
3-2. SVM資格情報の設定
踏み台サーバから、Tridentが上記の[2-2. NFS用のSVMへLIFの作成]の管理LIFへ接続する際に使用する認証資格情報を登録します。
# マニフェスト
> cat trident-svm-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: ontap-svm-admin
namespace: trident
type: Opaque
stringData:
username: vsadmin
password: XXXXXXX
# 作成したファイルの適用
> oc apply -f trident-svm-secret.yaml
secret/ontap-svm-admin created
> oc get secret -n trident
NAME TYPE DATA AGE
ontap-svm-admin Opaque 2 10s
trident-csi Opaque 6 20m
trident-encryption-keys Opaque 1 20m
3-3. Trident Backendの設定
Backendの設定は、ONTAP等のStorageとTridentを接続するための定義になり、Storage管理IP、認証情報、SVM、使用するドライバなどを指定し、OpenShiftからVolumeを動的に作成できるようにします。
ここでは指定する各LIFのIPアドレスは、Storage側で構成が完了している既存の管理系とデータ通信用のものを記載します。
指定可能な内容やサンプルはマニュアルを参照してください。
踏み台サーバから操作を実施します。
# マニフェスト
> cat trident-tbc-nfs.yaml
apiVersion: trident.netapp.io/v1
kind: TridentBackendConfig
metadata:
name: ontap-nfs-backend-tbc
namespace: trident
spec:
version: 1
backendName: ontap-nas-backend
storageDriverName: ontap-nas
managementLIF: 10.11.100.47
dataLIF: 10.11.100.48
svm: nfs100
credentials:
name: ontap-svm-admin
defaults:
spaceReserve: none
exportPolicy: default
# 作成したファイルの適用
> oc apply -f trident-tbc-nfs.yaml -n trident
tridentbackendconfig.trident.netapp.io/ontap-nfs-backend-tbc created
# 作成後の確認
> oc get tridentbackend -n trident
NAME BACKEND BACKEND UUID
tbe-sfjbw ontap-nas-backend 9fb91550-de6a-4ccd-aa8f-cf2d90eff3aa
3-4. StorageClassの設定
StorageClassは、動的プロビジョニングで使用するStorageの種類やポリシーを定義する設定で、ユーザからの要求と上記で設定したBackendを関連させるためにStorageClassを設定します。
指定可能な内容はマニュアルを参照してください。
踏み台サーバから操作を実施します。
# マニフェスト
> cat storageclass-nas.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ontap-nas-class
provisioner: csi.trident.netapp.io
mountOptions:
- nfsvers=3
parameters:
backendType: "ontap-nas"
allowVolumeExpansion: true
# 作成したファイルの適用
> oc apply -f storageclass-nas.yaml
storageclass.storage.k8s.io/ontap-nas-class created
# 作成後の確認
> oc get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
ontap-nas-class csi.trident.netapp.io Delete Immediate true 13s
3-5. Persistent Volume(PV)の作成
PersistentVolumeClaim(PVC)は永続化Storageに対するユーザの要求・リクエストで、容量、アクセスモード(書き込み権限の有無など)、StorageClassを定義します。
PVCで定義されたすべての要件に一致すると、PVCはその一致したPVにバインドされ、PVからStorageを利用できるようになります。
PersistentVolumeは、管理者/TridentによりプロビジョニングされたStorageリソースでクラスタレベルで管理されます。
(クラスタのどのNameSpaceからも利用できる)
BackendのStorageとマッピングされ、Podが削除されてもPVは削除されない形になります。
(Podのライフサイクルと関係なし)
踏み台サーバから後述で作成するPod用やPersistentVolumeClaim用のNamespaceを作成します。
> oc create namespace testspace01
namespace/testspace01 created
# 作成後の確認
> oc get ns testspace01
NAME STATUS AGE
testspace01 Active 18s
Persistent Volumeの払い出しを実施します。
# PersistentVolumeClaim マニフェスト
> cat pvc.yaml
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-nas
namespace: testspace01
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 2Gi
storageClassName: ontap-nas-class
# マニフェストの適用
> oc apply -f pvc.yaml
persistentvolumeclaim/pvc-nas created
# 作成後の確認
> oc get pvc -n testspace01
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
pvc-nas Bound pvc-fcf6f7b4-cc50-430d-9013-13bbbcd596e6 2Gi RWX ontap-nas-class <unset> 112s
> oc get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
pvc-fcf6f7b4-cc50-430d-9013-13bbbcd596e6 2Gi RWX Delete Bound testspace01/pvc-nas ontap-nas-class <unset> 2m11s
ONTAP側から作成されたVolumeを確認してみます。
> vol show -vserver nfs100
Vserver Volume Aggregate State Type Size Available Used%
--------- ------------ ------------ ---------- ---- ---------- ---------- -----
nfs100 nfs100_root aggr1_node2 online RW 1GB 971.4MB 0%
nfs100 trident_pvc_fcf6f7b4_cc50_430d_9013_13bbbcd596e6
aggr1_node2 online RW 2GB 2.00GB 0%
2 entries were displayed.
3-6. テスト用のPodの作成
PVへの書き込みができるかを確認する為のPodを作成します。
- 軽量なコンテナ「Red Hat Universal Base Image (UBI)」を作成
- ONTAPに作成したPVを利用する
- 1秒毎にdateの結果を作成したPVにlogとして出力
踏み台サーバから操作を実施します。
# マニフェスト
> cat pod-test.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-test-app
namespace: testspace01
spec:
containers:
- name: logger
image: registry.access.redhat.com/ubi9/ubi-minimal:latest
command: ["/bin/sh"]
args: ["-c", "while true; do echo $(date -u) >> /mnt/storage/access.log; sleep 1; done"]
volumeMounts:
- name: data-volume
mountPath: /mnt/storage
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: pvc-nas
# マニフェストの適用
> oc apply -f pod-test.yaml
Warning: would violate PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "logger" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "logger" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "logger" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "logger" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
pod/pod-test-app created
# 作成後の確認
> oc get pod -n testspace01
NAME READY STATUS RESTARTS AGE
pod-test-app 1/1 Running 0 40s
> oc get pods -o wide -n testspace01
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-test-app 1/1 Running 0 76s 192.168.0.151 master01.ocp100.example.org <none> <none>
作成したPodに入って、PVが接続されている事と指定したlogが増えている事を確認します。
# Podに接続
> oc exec -n testspace01 --stdin --tty pod-test-app -- /bin/bash
# Pod内の操作(mount状態の確認)
[root@pod-test-app /]# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 200G 32G 168G 16% /
tmpfs 64M 0 64M 0% /dev
shm 64M 0 64M 0% /dev/shm
tmpfs 4.7G 123M 4.6G 3% /proc/acpi
10.11.100.48:/trident_pvc_fcf6f7b4_cc50_430d_9013_13bbbcd596e6 2.0G 576K 2.0G 1% /mnt/storage
/dev/sda4 200G 32G 168G 16% /etc/hosts
tmpfs 23G 20K 23G 1% /run/secrets/kubernetes.io/serviceaccount
devtmpfs 4.0M 0 4.0M 0% /proc/keys
# Pod内の操作(logが増えている事の確認)
[root@pod-test-app /]# tail -f /mnt/storage/access.log
Tue Jun 2 03:16:28 UTC 2026
Tue Jun 2 03:16:29 UTC 2026
Tue Jun 2 03:16:30 UTC 2026
Tue Jun 2 03:16:31 UTC 2026
Tue Jun 2 03:16:32 UTC 2026
Tue Jun 2 03:16:33 UTC 2026
Tue Jun 2 03:16:34 UTC 2026
ONTAP Storage側からもQoSコマンドで対象VolumeにI/Oが来ている事が確認できます。
> qos statistics volume characteristics show -vserver nfs100 -volume trident_pvc_fcf6f7b4_cc50_430d_9013_13bbbcd596e6
Workload ID IOPS Throughput Request Size Read Concurrency
--------------- ------ -------- ---------------- ------------ ---- -----------
-total- - 1 1.63KB/s 836B 0% 0
trident_pvc_f.. 43389 1 1.63KB/s 836B 0% 0
-total- - 3 1.66KB/s 566B 0% 0
trident_pvc_f.. 43389 3 1.66KB/s 566B 0% 0
-total- - 1 1.69KB/s 864B 0% 0
trident_pvc_f.. 43389 1 1.69KB/s 864B 0% 0
-total- - 3 1.71KB/s 585B 0% 0
trident_pvc_f.. 43389 3 1.71KB/s 585B 0% 0
-total- - 3 1.74KB/s 594B 0% 0
trident_pvc_f.. 43389 1 1.74KB/s 892B 0% 0
-total- - 1 1.77KB/s 906B 0% 0
trident_pvc_f.. 43389 1 1.77KB/s 906B 0% 0
参考及びリンク
Red Hat OpenShift クラスタに Trident をインストールしてストレージオブジェクトを作成する
実はかなり簡単?! NetApp Tridentを試してみる
Tridentでボリュームを払い出すプールを制御する(Storage Pool基礎編)
Tridentでボリュームを払い出すプールを制御する(Virtual Storage Pool編)










