なぜ、今更やるのか???と思ったが作ってみた。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が見えるはず。
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
Kubernetesのノードで以下を実行
mount | grep pv09
ノードにNFSマウントされていることがわかる。
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を使えば、こんな作業は必要はない。
ありがたみだけ知った。。。