Henry
发布于 2025-03-09 / 11 阅读
0
0

Kubernetes - 配置 NFS 数据持久化

背景简介

Kubernetes通过NFS持久化存储,允许Pod跨节点共享数据。配置NFS持久化,需创建PersistentVolume(PV)和PersistentVolumeClaim(PVC),将NFS服务器作为后端存储,实现数据的持久化存储和访问。这种方式适用于需要高可用、可扩展的数据存储场景。

环境信息

  1. Kubernetes 已安装 【Kubernetes - 安装
  2. NFS 服务已部署 【NFS - 安装】 - Kubernetes 节点无需安装 NFS Client
  3. NFS CIS 已安装 【Kubernetes - 安装 NFS CSI

示例需求

  1. 以 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


以上便是本文的全部内容,感谢您的阅读,如遇到任何问题,欢迎在评论区留言,我会通过邮件回复。



评论