Kubernetes : 動的プロビジョニング (NFS)2025/11/21 |
|
外部ストレージを使用している場合、ボリュームの動的プロビジョニング機能を利用することで、クラスター管理者が事前に PV (Persistent Volume) を作成することなく、ユーザーからの PVC (Persistent Volume Claim) 作成要求時に、動的に PV を作成することができます。 当例では以下のように 3 台のノードを使用して Kubernetes クラスターを構成しています。 例として、Control Plane ノード上に NFS サーバーを起動し、NFS プロビジョナーによる動的プロビジョニングの設定をします。
-----------+---------------------------+--------------------------+------------
| | |
eth0|10.0.0.30 eth0|10.0.0.51 eth0|10.0.0.52
+----------+-----------+ +-----------+----------+ +-----------+----------+
| [ dlp.srv.world ] | | [ node01.srv.world ] | | [ node02.srv.world ] |
| Control Plane | | Worker Node | | Worker Node |
+----------------------+ +----------------------+ +----------------------+
|
| [1] |
こちらを参考に、ローカルネットワーク内に NFS サーバーを稼働させておきます。 |
| [2] | |
| [3] | NFS Client Provisioner をインストールします。 |
|
[root@dlp ~]#
dnf -y install helm
[root@dlp ~]#
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
# nfs.server = (NFS サーバーのホスト名 または IP アドレス) # nfs.path = (NFS 共有のパス) [root@dlp ~]# helm install nfs-client -n kube-system --set nfs.server=10.0.0.35 --set nfs.path=/home/nfsshare nfs-subdir-external-provisioner/nfs-subdir-external-provisioner
NAME: nfs-client LAST DEPLOYED: Fri Nov 21 11:11:35 2025 NAMESPACE: kube-system STATUS: deployed REVISION: 1 TEST SUITE: None[root@dlp ~]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-66bc5c9577-2jfqr 1/1 Running 1 19m coredns-66bc5c9577-dw6vq 1/1 Running 1 19m etcd-dlp.srv.world 1/1 Running 1 19m kube-apiserver-dlp.srv.world 1/1 Running 1 19m kube-controller-manager-dlp.srv.world 1/1 Running 1 19m kube-proxy-cwsb9 1/1 Running 1 12m kube-proxy-fpqvd 1/1 Running 1 19m kube-proxy-xmkhp 1/1 Running 1 15m kube-scheduler-dlp.srv.world 1/1 Running 1 19m nfs-client-nfs-subdir-external-provisioner-59b75b97bd-hxw7n 1/1 Running 0 43s |
| [4] | Pod からの使用例です。 |
|
[root@dlp ~]# kubectl get pv No resources found in default namespace. [root@dlp ~]# kubectl get pvc No resources found in default namespace. [root@dlp ~]# kubectl get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-client cluster.local/nfs-client-nfs-subdir-external-provisioner Delete Immediate true 72s
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-provisioner
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
# リクエストするボリュームサイズ
storage: 5Gi
# StorageClass の名称を指定
storageClassName: nfs-client
[root@dlp ~]#
[root@dlp ~]# kubectl apply -f my-pvc.yml persistentvolumeclaim/my-provisioner created kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE my-provisioner Bound pvc-c386c470-309f-4b57-bbcb-ef83d0712799 5Gi RWO nfs-client <unset> 6s # PV は自動生成される [root@dlp ~]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE pvc-c386c470-309f-4b57-bbcb-ef83d0712799 5Gi RWO Delete Bound default/my-provisioner nfs-client <unset> 38s
[root@dlp ~]#
vi my-pod.yml
apiVersion: v1
kind: Pod
metadata:
name: my-mginx
spec:
containers:
- name: my-mginx
image: nginx
ports:
- containerPort: 80
name: web
volumeMounts:
- mountPath: /usr/share/nginx/html
name: nginx-pvc
volumes:
- name: nginx-pvc
persistentVolumeClaim:
# 作成した PVC 名
claimName: my-provisioner
kubectl apply -f my-pod.yml pod/my-mginx created [root@dlp ~]# kubectl get pod my-mginx -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES my-mginx 1/1 Running 0 7s 192.168.40.198 node01.srv.world <none> <none>[root@dlp ~]# kubectl exec my-mginx -- df /usr/share/nginx/html Filesystem 1K-blocks Used Available Use% Mounted on 10.0.0.35:/home/nfsshare/default-my-provisioner-pvc-c386c470-309f-4b57-bbcb-ef83d0712799 164028416 0 155623424 0% /usr/share/nginx/html # index ファイルを作成して動作確認 [root@dlp ~]# echo "Nginx Index" > index.html [root@dlp ~]# kubectl cp index.html my-mginx:/usr/share/nginx/html/index.html [root@dlp ~]# curl 192.168.40.198 Nginx Index # 削除する場合は PVC を削除すると PV も削除される [root@dlp ~]# kubectl delete pod my-mginx pod "my-mginx" deleted [root@dlp ~]# kubectl delete pvc my-provisioner persistentvolumeclaim "my-provisioner" deleted [root@dlp ~]# kubectl get pv No resources found in default namespace. |
| [5] | StatefulSet を使用すると [volumeClaimTemplates] が指定可能なため、PVC の作成までまとめて記述できます。 |
|
[root@dlp ~]# kubectl get pv No resources found in default namespace. [root@dlp ~]# kubectl get pvc No resources found in default namespace. [root@dlp ~]# kubectl get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-client cluster.local/nfs-client-nfs-subdir-external-provisioner Delete Immediate true 5m32s
[root@dlp ~]#
vi statefulset.yml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-mginx
spec:
serviceName: my-mginx
replicas: 1
selector:
matchLabels:
app: my-mginx
template:
metadata:
labels:
app: my-mginx
spec:
containers:
- name: my-mginx
image: nginx
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: data
spec:
# StorageClass の名称を指定
storageClassName: nfs-client
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 5Gi
kubectl apply -f statefulset.yml statefulset.apps/my-mginx created [root@dlp ~]# kubectl get statefulset NAME READY AGE my-mginx 1/1 7s[root@dlp ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES my-mginx-0 1/1 Running 0 33s 192.168.241.132 node02.srv.world <none> <none>[root@dlp ~]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE data-my-mginx-0 Bound pvc-cac094f4-2d94-46ec-857b-310fc6815949 5Gi RWO nfs-client <unset> 72s[root@dlp ~]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE pvc-cac094f4-2d94-46ec-857b-310fc6815949 5Gi RWO Delete Bound default/data-my-mginx-0 nfs-client <unset> 101s |
| Sponsored Link |
|
|