Kubernetes : 動的プロビジョニング (NFS)2025/01/27 |
外部ストレージを使用している場合、ボリュームの動的プロビジョニング機能を利用することで、クラスター管理者が事前に PV (Persistent Volume) を作成することなく、ユーザーからの PVC (Persistent Volume Claim) 作成要求時に、動的に PV を作成することができます。 当例では以下のように 4 台のノードを使用して Kubernetes クラスターを構成しています。 +----------------------+ +----------------------+ | [ ctrl.srv.world ] | | [ dlp.srv.world ] | | Manager Node | | Control Plane | +-----------+----------+ +-----------+----------+ eth0|10.0.0.25 eth0|10.0.0.30 | | ------------+--------------------------+----------- | | eth0|10.0.0.51 eth0|10.0.0.52 +-----------+----------+ +-----------+----------+ | [ node01.srv.world ] | | [ node02.srv.world ] | | Worker Node#1 | | Worker Node#2 | +----------------------+ +----------------------+ |
例として、NFS サーバー [nfs.srv.world (10.0.0.35)] のストレージ領域を利用するように、NFS プロビジョナーによる動的プロビジョニングの設定をします。 |
|
[1] |
こちらを参考に NFS サーバーを設定しておきます。 |
[2] | |
[3] | Helm で NFS Client Provisioner をインストールします。 |
[cent@ctrl ~]$
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
# nfs.server = (NFS サーバーのホスト名 または IP アドレス) # nfs.path = (NFS 共有のパス) [cent@ctrl ~]$ 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: Mon Jan 27 11:22:34 2025 NAMESPACE: kube-system STATUS: deployed REVISION: 1 TEST SUITE: None[cent@ctrl ~]$ kubectl get deployment -n kube-system NAME READY UP-TO-DATE AVAILABLE AGE calico-kube-controllers 1/1 1 1 5d coredns 2/2 2 2 5d metrics-server 1/1 1 1 40m nfs-client-nfs-subdir-external-provisioner 1/1 1 1 20s |
[4] | Pod からの使用例です。 |
[cent@ctrl ~]$ kubectl get pv No resources found in default namespace. [cent@ctrl ~]$ kubectl get pvc No resources found in default namespace. [cent@ctrl ~]$ kubectl get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-client cluster.local/nfs-client-nfs-subdir-external-provisioner Delete Immediate true 73s apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-provisioner spec: accessModes: - ReadWriteOnce # StorageClass の名称を指定 storageClassName: nfs-client resources: requests: # リクエストするボリュームサイズ storage: 5Gi
[cent@ctrl ~]$
[cent@ctrl ~]$ 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-cb6e7cfc-1331-4678-b34d-7f83510c4e40 5Gi RWO nfs-client <unset> 6s # PV は自動生成される [cent@ctrl ~]$ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE pvc-cb6e7cfc-1331-4678-b34d-7f83510c4e40 5Gi RWO Delete Bound default/my-provisioner nfs-client <unset> 2m32s
[cent@ctrl ~]$
vi my-pod.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 1
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html
name: nginx-pvc
volumes:
- name: nginx-pvc
persistentVolumeClaim:
# 作成した PVC 名
claimName: my-provisioner
kubectl apply -f my-pod.yml deployment.apps/my-nginx created [cent@ctrl ~]$ kubectl get pods NAME READY STATUS RESTARTS AGE my-nginx-6b6dcc5896-h8jqv 1/1 Running 0 13s[cent@ctrl ~]$ kubectl exec my-nginx-6b6dcc5896-h8jqv -- df /usr/share/nginx/html Filesystem 1K-blocks Used Available Use% Mounted on 10.0.0.35:/home/nfsshare/default-my-provisioner-pvc-cb6e7cfc-1331-4678-b34d-7f83510c4e40 167689728 3244032 164445696 2% /usr/share/nginx/html # index ファイルを作成して動作確認 [cent@ctrl ~]$ echo "Nginx Index" > index.html [cent@ctrl ~]$ kubectl cp index.html my-nginx-6b6dcc5896-h8jqv:/usr/share/nginx/html/index.html [cent@ctrl ~]$ kubectl expose deployment my-nginx --type="NodePort" --port 80 [cent@ctrl ~]$ kubectl port-forward service/my-nginx --address 127.0.0.1 8082:80 & [cent@ctrl ~]$ curl localhost:8082 Handling connection for 8082 Nginx Index # 削除する場合は PVC を削除すると PV も削除される [cent@ctrl ~]$ kubectl delete deployment my-nginx deployment.apps "my-nginx" deleted [cent@ctrl ~]$ kubectl delete pvc my-provisioner persistentvolumeclaim "my-provisioner" deleted [cent@ctrl ~]$ kubectl get pv No resources found |
[5] | StatefulSet を使用すると [volumeClaimTemplates] が指定可能なため、PVC の作成までまとめて記述できます。 |
[cent@ctrl ~]$ kubectl get pv No resources found in default namespace. [cent@ctrl ~]$ kubectl get pvc No resources found in default namespace. [cent@ctrl ~]$ kubectl get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-client cluster.local/nfs-client-nfs-subdir-external-provisioner Delete Immediate true 8m50s
[cent@ctrl ~]$
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 [cent@ctrl ~]$ kubectl get statefulset NAME READY AGE my-mginx 1/1 7s[cent@ctrl ~]$ kubectl get pods NAME READY STATUS RESTARTS AGE my-mginx-0 1/1 Running 0 26s[cent@ctrl ~]$ kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE data-my-mginx-0 Bound pvc-30ee3e26-216f-457a-8a7e-cd68013c7045 5Gi RWO nfs-client <unset> 40s[cent@ctrl ~]$ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE pvc-30ee3e26-216f-457a-8a7e-cd68013c7045 5Gi RWO Delete Bound default/data-my-mginx-0 nfs-client <unset> 65s |
Sponsored Link |
|