概述
在 Kubernetes 中,存储管理是一个重要组成部分。本文中涉及的相关组件:
- CSI Driver NFS: 容器存储接口(CSI)的NFS实现,作为Kubernetes与NFS存储系统之间的桥梁
- StorageClass: Kubernetes中的存储类,定义了存储的”类别”,用于动态制备PersistentVolume(PV)
- PVC (PersistentVolumeClaim): 持久卷声明,是用户对存储资源的请求
- Deployment: Kubernetes中用于管理应用部署的控制器,可以包含使用PVC的Pod
它们之间的关系如下:
- CSI Driver NFS 提供了 Kubernetes 访问 NFS 存储的能力
- StorageClass 定义了如何使用 CSI Driver NFS 来动态创建存储卷
- PVC 通过指定 StorageClass 来请求特定类型的存储资源
- Deployment 中的 Pod 可以挂载 PVC 来使用持久化存储
通过这种方式,Kubernetes实现了存储的动态制备和管理,使得应用可以方便地使用NFS存储。
通过Helm3 安装CSI driver NFS
前提要求
安装
1 2 3 4 5
| helm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts
helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs --namespace kube-system
|
验证安装
1 2 3 4 5 6
| kubectl get pods -n kube-system -l app=csi-nfs-controller kubectl get pods -n kube-system -l app=csi-nfs-node
kubectl get csidriver nfs.csi.k8s.io
|
创建StorageClass
创建 StorageClass YAML 文件
1 2
| vim storageclass-nfs-csi.yaml
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: nfs-csi annotations: storageclass.kubernetes.io/is-default-class: "true" provisioner: nfs.csi.k8s.io parameters: server: 172.16.126.130 share: / onDelete: retain reclaimPolicy: Retain volumeBindingMode: Immediate allowVolumeExpansion: true mountOptions: - nfsvers=4.1 - proto=tcp - hard - retrans=5 - noac - lookupcache=none
|
参数说明
reclaimPolicy
Kubernetes 层面的 PV 回收策略,这是 StorageClass 的标准 Kubernetes 参数。
可选值:
Retain: PVC 删除后,PV 保留,需要手动清理
Delete: PVC 删除后,PV 自动删除
onDelete
NFS CSI 驱动层面的存储清理策略。
可选值:
retain: 保留 NFS 服务器上的实际数据目录
delete: 删除 NFS 服务器上的实际数据目录
archive: 归档数据目录(重命名为带时间戳的目录)
部署StorageClass
1 2 3 4 5 6 7 8
| kubectl apply -f storageclass-nfs-csi.yaml
kubectl get sc
kubectl describe sc nfs-csi
|
创建PVC
动态制备 PVC
1 2
| vim pvc-nfs-csi-myapp.yaml
|
1 2 3 4 5 6 7 8 9 10 11 12
| apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-nfs-myapp namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 10Gi storageClassName: nfs-csi
|
1 2 3
| kubectl apply -f pvc-nfs-csi-myapp.yaml kubectl get pvc
|
静态制备
略,请参考官方文档
在Deployment中使用PVC
下面是一个使用NFS PVC的Deployment示例:
1 2
| vim deployment-example.yaml
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| apiVersion: apps/v1 kind: Deployment metadata: name: deployment-nfs namespace: default spec: replicas: 1 selector: matchLabels: name: deployment-nfs template: metadata: name: deployment-nfs labels: name: deployment-nfs spec: nodeSelector: "kubernetes.io/os": linux containers: - name: deployment-nfs image: mcr.microsoft.com/oss/nginx/nginx:1.19.5 command: - "/bin/bash" - "-c" - set -euo pipefail; while true; do echo $(hostname) $(date) >> /mnt/nfs/outfile; sleep 1; done volumeMounts: - name: nfs mountPath: "/mnt/nfs" readOnly: false volumes: - name: nfs persistentVolumeClaim: claimName: pvc-nfs-myapp
|
1 2 3 4
| kubectl apply -f deployment-example.yaml kubectl get deployment kubectl get pv
|
参考文档
https://kubernetes.io/zh-cn/docs/concepts/storage/storage-classes/
https://github.com/kubernetes-csi/csi-driver-nfs
https://github.com/kubernetes-csi/csi-driver-nfs/blob/master/deploy/example/README.md