背景简介
Kubernetes通过NFS持久化存储,允许Pod跨节点共享数据。配置NFS持久化,需创建PersistentVolume(PV)和PersistentVolumeClaim(PVC),将NFS服务器作为后端存储,实现数据的持久化存储和访问。这种方式适用于需要高可用、可扩展的数据存储场景。
环境信息
- Kubernetes 已安装 【Kubernetes - 安装】
- NFS 服务已部署 【NFS - 安装】 - Kubernetes 节点无需安装 NFS Client
- NFS CIS 已安装 【Kubernetes - 安装 NFS CSI】
示例需求
- 以 tomcat webapps 数据持久化为示例。
详细步骤
【官方参考】
第一步: 配置 storageclass-nfs.yaml
文件
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-csi
provisioner: nfs.csi.k8s.io
parameters:
server: 192.168.122.1
share: /sdd/k8s_nfs/
reclaimPolicy: Retain
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
- nfsvers=4.1
metadata.name: nfs-csi
: 定义 StorageClass的名称。provisioner: nfs.csi.k8s.io
: 指定了用于动态提供存储卷的CSI驱动程序名称。在这个例子中,使用的是名为nfs.csi.k8s.io的NFS CSI驱动。parameters.server: 192.168.122.1
: NFS服务器的地址。parameters.share: /sdd/k8s_nfs/
: NFS服务器上共享的目录路径。reclaimPolicy: Retain
: reclaimPolicy设置为Retain,这样即使PVC被删除,PV也会保留,从而不会自动删除数据。volumeBindingMode: Immediate
: 定义了卷绑定的模式。设置为Immediate表示在PVC创建时就立即进行卷绑定,而不是在Pod调度时。allowVolumeExpansion: true
: 允许存储卷的大小调整。设置为true表示允许通过修改PVC的存储请求来扩展卷的大小。mountOptions: - nfsvers=4.1
: 指定使用NFS版本4.1进行挂载。
创建 StorageClass
# kubectl apply -f storageclass-nfs.yaml
storageclass.storage.k8s.io/nfs-csi created
第二步: 配置 demo-nfs-tomcat-webapps-pv.yaml
文件
---
apiVersion: v1
kind: PersistentVolume
metadata:
annotations:
pv.kubernetes.io/provisioned-by: nfs.csi.k8s.io
name: demo-nfs-tomcat-webapps-pv
labels:
type: nfs
app: demo-nfs-tomcat
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: nfs-csi
mountOptions:
- nfsvers=4.1
csi:
driver: nfs.csi.k8s.io
# volumeHandle format: {nfs-server-address}#{sub-dir-name}#{share-name}
# make sure this value is unique for every share in the cluster
volumeHandle: 192.168.122.1/sdd/k8s_nfs/demo/nfs/tomcat/webapps
volumeAttributes:
server: 192.168.122.1
share: /sdd/k8s_nfs/demo/nfs/tomcat/webapps
metadata.labels.type: nfs
: 表示这个PV的类型是NFS。metadata.labels.app: demo-nfs-tomcat
: 表示这个PV是为名为 demo-nfs-tomcat 的应用程序准备的。spec.accessModes: - ReadWriteMany
: 这指定了PV的访问模式为ReadWriteMany,意味着这个PV可以被多个节点上的多个Pod以读写方式挂载。spec.nfs.path: /sdd/k8s_nfs/demo/nfs/tomcat/webapps
: 这指定了NFS服务器上用于存储数据的目录路径。spec.nfs.server: 192.168.122.1
: 这指定了NFS服务器的IP地址。spec.persistentVolumeReclaimPolicy: Retain
: 这定义了当PV被释放后(即不再绑定到任何PVC时)的处理策略。Retain表示保留数据,PV不会自动删除,管理员需要手动清理数据并删除PV。
创建 PV
# kubectl apply -f demo-nfs-tomcat-webapps-pv.yaml
persistentvolume/demo-nfs-tomcat-webapps-pv created
第三步: 配置 demo-nfs-tomcat-webapps-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: demo-nfs-tomcat-webapps-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClassName: nfs-csi
volumeName: demo-nfs-tomcat-webapps-pv
spec.accessModes: - ReadWriteMany
: 这指定了PV的访问模式为ReadWriteMany,意味着这个PV可以被多个节点上的多个Pod以读写方式挂载。spec.volumeName: demo-nfs-tomcat-webapps-pv
: 静态绑定 pv
创建 pvc
# kubectl apply -f demo-nfs-tomcat-webapps-pvc.yaml -n test-tomcat
persistentvolumeclaim/demo-nfs-tomcat-webapps-pvc created
第四步: 配置 demo-nfs-tomcat-deployment.yaml
文件
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-nfs-tomcat
spec:
replicas: 2
selector:
matchLabels:
app: demo-nfs-tomcat
template:
metadata:
labels:
app: demo-nfs-tomcat
spec:
containers:
- name: tomcat
image: tomcat:9.0.100
ports:
- containerPort: 8080
volumeMounts:
- name: webapps-storage
mountPath: /usr/local/tomcat/webapps
volumes:
- name: webapps-storage
persistentVolumeClaim:
claimName: demo-nfs-tomcat-webapps-pvc
spec.selector.matchLabels
: 这定义了Deployment如何选择Pod。它将选择标签app等于demo-nfs-tomcat的Pod。spec.template.metadata.labels
: 这为Pod设置了标签,这样Deployment就可以根据标签选择它们。spec.template.spec.containers.volumeMounts
: 这定义了Pod中的容器将名为webapps-storage的volume挂载到容器的/usr/local/tomcat/webapps目录。spec.template.spec.volumes
: 这定义了Pod中的卷。这里,它引用了一个名为demo-nfs-tomcat-webapps-pvc的PersistentVolumeClaim,并将其命名为webapps-storage,这样它就可以被容器挂载。
部署 tomcat
# kubectl apply -f demo-nfs-tomcat-deployment.yaml -n test-tomcat
deployment.apps/demo-nfs-tomcat created
第五步: 配置 demo-nfs-tomcat-svc.yaml
文件
---
apiVersion: v1
kind: Service
metadata:
name: demo-nfs-tomcat-svc
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30080
selector:
app: demo-nfs-tomcat
spec.selector
: 这定义了Service如何选择Pod。它将选择标签app等于demo-nfs-tomcat的Pod,这样Service就可以将流量路由到这些Pod。spec.type: NodePort
: 指定 service 端口映射方式为 NodePort,允许直接暴露端口访问。spec.ports.nodePort: 30080
: 指定映射的端口为 30080
部署 Service
# kubectl apply -f demo-nfs-tomcat-svc.yaml -n test-tomcat
service/demo-nfs-tomcat-svc created
第六步: 查看完整部署
$ kubectl get storageclass,pv,pvc,pod,svc -n test-tomcat
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
storageclass.storage.k8s.io/nfs-csi nfs.csi.k8s.io Retain Immediate true 42m
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS VOLUMEATTRIBUTESCLASS REASON AGE
persistentvolume/demo-nfs-tomcat-webapps-pv 10Gi RWX Retain
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
persistentvolumeclaim/demo-nfs-tomcat-webapps-pvc Bound pvc-0cda0652-aff0-4501-92cd-cf91088a171a 1Gi RWX nfs-csi <unset> 104s
NAME READY STATUS RESTARTS AGE
pod/demo-nfs-tomcat-b69b49d45-6jc59 1/1 Running 0 38m
pod/demo-nfs-tomcat-b69b49d45-t7tvt 1/1 Running 0 38m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/demo-nfs-tomcat-svc NodePort 10.102.202.6 <none> 8080:30080/TCP 36m
第步: 准备测试用的 index.html
文件,并存放在 NFS 服务的 /sdd/k8s_nfs/demo/nfs/tomcat/webapps/hello-world/
路径下
<!DOCTYPE html>
<html>
<head>
<title>Hello World</title>
</head>
<body>
<h1>Hello World</h1>
</body>
</html>
第步: 在浏览器中访问 tomcat 服务,例如我的路径是:http://192.168.122.112:30080/hello-world/index.html
以上便是本文的全部内容,感谢您的阅读,如遇到任何问题,欢迎在评论区留言,我会通过邮件回复。