Provisonerがないnfsを作ってみる。

投稿者: | 9月 22, 2023

なぜ、今更やるのか???と思ったが作ってみた。Provisonerのないnfsストレージ。もう2度とやらないと思う。これ。

 

閑話休題

 

調べてみるとなかなかいいページがない。

 

事前準備

以下の環境で作る。nfsのオプションはいろいろな目的で使っていて設定しまくったので、何がなんだかという感じだが。

NFSサーバ 192.168.16.2

exportパス /disk/nfs_local (rw,async,no_root_squash,no_subtree_check)

 

NFSサーバにて

NFSサーバに個別のPVのフォルダをとりあえずPV10個分を作る。

mkdir -p /disk/nfs_local/pv{01..10}
chmod -R 1777 /disk/nfs_local/pv{01..10}

 

Kubernetes側にて

StorageClassの定義

StorageClassの定義をしている記述が他で見当たらないのだが、アプリによってはStorageClassを指定して作る場合があるのでちゃんとStorageClassを定義してみた。

reclaimPolicyは、Retainにしておく。Recycledがサポートされているが、非推奨。また、Deleteにしても動作はRetainになるので。

cat <<EOF | kubectl create -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: Immediate
reclaimPolicy: Retain
EOF

 

StorageClassの確認

kubectl get sc nfs
kubectl describe sc nfs

nfsというStorageClassが見えるはず。

UntitledImage

 

PVの作成

取り急ぎ、25GBのPVを10個つくる。PVを10個作るためにSHELLで回している。また、accessModeは、ReadWriteOnce,ReadWriteMany, ReadOnlyManyを指定している。PVCを呼び出すときにこれが合っていないと利用されない。

NFSSHOST=192.168.16.2
NFSLOCALPATH=/disk/nfs_local

for i in $(seq -w 10); do
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv$i
annotations:
  volume.beta.kubernetes.io/storage-class: "nfs"
spec:
capacity:
  storage: 25Gi
volumeMode: Filesystem
accessModes:
  - ReadWriteOnce
  - ReadWriteMany
  - ReadOnlyMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs
mountOptions:
   - hard
   - nfsvers=4.1
nfs:
  server: $NFSSHOST
  path: $NFSLOCALPATH/pv$i
EOF
done

 

PVの確認

kubectl get pv -o wide

作成したPVが10個見えるはず。これで、25GBまでのReadWriteOnceのPVCができるようになる。

ただし、PVCはサイズを10GBと指定しても25GBになる。

 

PodとPVCを作成

動作確認目的で作ってみた。

NAMESPACE=test1
kubectl create namespace ${NAMESPACE}
cat <<EOF | kubectl --namespace=${NAMESPACE} create -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: task-pv-claim
spec:
storageClassName: nfs
accessModes:
  - ReadWriteOnce
resources:
  requests:
    storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
name: task-pv-pod
spec:
volumes:
  - name: task-pv-storage
    persistentVolumeClaim:
      claimName: task-pv-claim
containers:
  - name: task-pv-container
    image: nginx
    ports:
      - containerPort: 80
        name: "http-server"
    volumeMounts:
      - mountPath: "/usr/share/nginx/html"
        name: task-pv-storage
EOF

kubectl -n ${NAMESPACE} get pod,pvc -o wide

UntitledImage

Kubernetesのノードで以下を実行

mount | grep pv09

ノードにNFSマウントされていることがわかる。

UntitledImage

NFSサーバにて、Volumeの実態のフォルダにコンテンツを作る。上記のVOLUMEがnfs-pv09なので

echo "test pod" >/disk/nfs_local/pv09/index.html

Kubernetesにて、

curl http://10.0.0.84/

test podと表示されるはず。

 

テストを終了する場合は

kubectl delete ns test1

NFSサーバにて、利用したPVの中身を削除する。reclaimPolicyがRetainなので、手動でデータを削除する。

rm /disk/nfs_local/pv09/index.html

で終わり。

 

Provisonerがないとこんなに大変!

  • PVを事前に作っておく必要がある。
  • PVCを削除した場合、実データを手動で消す必要がある。

というめんどくさい作業が毎度発生する。NFS-SUBあるいはNFS-CSIを使えば、こんな作業は必要はない。

ありがたみだけ知った。。。

 

コメントを残す