k8s 集群之使用 nfs 网络存储挂载外部目录和文件

如果使用 k8s 部署 mysql、redis、minio等数据和文件存储服务,k8s 默认容器如果重建,则容器中的数据文件将会丢失,所以为了解决这些问题,通常就需要将容器中需要持久化的文件存储到其它可持久化存储目录中。
如果使用 k8s 部署 springboot 项目,那么项目的日志文件也是需要存储到其它可持久化存储目录中。
k8s存储支持多种模式,本地存储,传递网络存储,分布式网络存储,以及云存储等。
本章节是基于上一个章节 Springboot 项目通过 gitlab CI/CD 集成 k8s 自动部署,实现通过 nfs 挂载 springboot 项目的日志文件到外部目录。

安装NFS

在挂载的目标服务器上安装 nfs-utils(这里使用的 nfs 服务器ip是 192.168.1.28)

[root@node3 ~]# yum -y install nfs-utils

创建 nfs 目录并修改权限

[root@node3 ~]# mkdir -p /nfs/data/
[root@node3 ~]# chmod -R 777 /nfs/data

编辑 nfs 默认的配置文件 /etc/exports,写入如下内容

[root@node3 ~]# cat /etc/exports
/nfs/data *(rw,no_root_squash,sync)

配置生效并查看生效

[root@node3 ~]# exportfs -r
[root@node3 ~]# exportfs
/nfs/data       <world>

启动rpcbind、nfs服务

[root@node3 ~]# systemctl restart rpcbind && systemctl enable rpcbind
[root@node3 ~]# systemctl restart nfs-server && systemctl enable nfs-server

查看 RPC 服务的注册状况

[root@node3 ~]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    ... 
    ...

showmount测试

[root@node3 ~]# showmount -e 192.168.1.28
Export list for 192.168.1.28:
/nfs/data *

k8s yaml 配置 pod 日志挂载

在 k8s 的所有节点下安装 nfs-utils

[root@node1 ~]# yum -y install nfs-utils

在 master 节点服务器上新建 用于创建 pv 和 pvc 的 yaml 文件 springboot-ci-cd-demo-pv.yaml,内容如下

apiVersion: v1
kind: PersistentVolume
metadata:
  name: springboot-ci-cd-demo-pv
  labels:
    pv: springboot-ci-cd-demo-pv
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteMany
  nfs:  
    server: 192.168.1.28
    path: "/nfs/data/logs/springboot-ci-cd-demo/"   #NFS目录,需要该目录在NFS上存在,不存在需要先去创建目录
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: springboot-ci-cd-demo-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Mi  #容量

执行创建 pv 和 pvc 命令

[root@master yaml]# kubectl apply -f springboot-ci-cd-demo-pv.yaml -n demo
persistentvolume/springboot-ci-cd-demo-pv created
persistentvolumeclaim/springboot-ci-cd-demo-pvc created
[root@master yaml]# kubectl get pv -n demo
NAME                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                            STORAGECLASS   REASON   AGE
springboot-ci-cd-demo-pv   100Mi      RWX            Retain           Bound    demo/springboot-ci-cd-demo-pvc                           15s
[root@master yaml]# kubectl get pvc -n demo
NAME                        STATUS   VOLUME                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
springboot-ci-cd-demo-pvc   Bound    springboot-ci-cd-demo-pv   100Mi      RWX                           25s

pod 的 yaml 文件修改,即 gitlab variable 变量 K8S_DEMO_YAML 的内容修改如下

   ---
apiVersion: v1
kind: Service
metadata:
  name: $DEPLOYMENT_NAME
  namespace: demo
  labels:
    app: ci-cd-demo
spec:
  type: NodePort
  ports:
  - name: ci-cd-demo
    port: 8080
    protocol: TCP
    nodePort: 30080 
  selector:
    app: ci-cd-demo

---
apiVersion: apps/v1
kind: Deployment #对象类型
metadata:
  name: $DEPLOYMENT_NAME #名称
  labels:
    app: ci-cd-demo #标注
spec:
  replicas: 1 #运行容器的副本数,修改这里可以快速修改分布式节点数量
  selector:
    matchLabels:
      app: ci-cd-demo
  template:
    metadata:
      labels:
        app: ci-cd-demo
    spec:
      containers: #docker容器的配置
      - name: $DEPLOYMENT_NAME
        image: $PROJECT_IMAGE
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          protocol: TCP
        env: 
        - name: JAVA_OPTS
          value: -Xms256m -Xmx256m
        volumeMounts:
        - mountPath: /data/logs
          name: logfile
      volumes:
      - name: logfile
        persistentVolumeClaim:
          claimName: springboot-ci-cd-demo-pvc
      imagePullSecrets:
      - name: regsecret

在 springboot 项目的 yml 配置文件里指定日志输出目录

logging:
  file:
    name: /data/logs/springboot-ci-cd-demo.log

删除 pod 原来的部署,重新跑 CI 部署

[root@master ~]# kubectl delete deployment springboot-ci-cd-demo -n demo
deployment.apps "springboot-ci-cd-demo" deleted

CI 跑完之后成功部署项目之后,在挂载的 nfs 目录 /nfs/data/logs/springboot-ci-cd-demo/ 下查看日志文件

[root@node3 ~]# cd /nfs/data/logs/springboot-ci-cd-demo
[root@node3 springboot-ci-cd-demo]# ls
springboot-ci-cd-demo.log

pod 重启之后日志输出会叠加到该日志文件上

### 在 Kubernetes 中配置 NFS 挂载目录 #### 安装 NFS 服务 为了使 Kubernetes 使用 NFS 进行存储挂载,需先确保 NFS 服务器已正确设置。对于基于 Debian 的系统,可以使用如下命令来安装必要的软件包: ```bash sudo apt update && sudo apt install nfs-kernel-server -y ``` 而对于 CentOS 或其他 Red Hat 衍生版本,则应通过 `yum` 来完成相同的操作[^1]。 #### 创建共享目录与导出规则 接着定义想要分享给 Kubernetes Pod 访问的具体文件夹位置,并编辑 `/etc/exports` 文件指定该路径及其对应的访问控制选项。例如: ```plaintext /mnt/nfs_share *(rw,sync,no_subtree_check,no_root_squash) ``` 此条目表示允许所有 IP 地址对该目录拥有读写权限而不压缩根用户身份验证[^2]。 #### 启动并启用 NFS 服务 修改完成后,记得启动 NFS 及其依赖的服务(如 RPC 绑定),并且将其设为随系统自启项之一: ```bash systemctl start rpcbind && systemctl start nfs-server systemctl enable rpcbind && systemctl enable nfs-server ``` 这一步骤同样适用于大多数 Linux 发行版上的 NFS 部署环境[^3]。 #### 准备 PersistentVolume (PV) 现在转向 Kubernetes 方面的工作——创建一个名为 `nfs-pv.yaml` 的 YAML 文件用于描述 PV 对象: ```yaml apiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteMany nfs: path: /mnt/nfs_share server: <NFS_SERVER_IP> ``` 这里指定了 NFS 提供者的位置以及所期望分配的空间大小;注意替换 `<NFS_SERVER_IP>` 成实际的 NFS 服务器地址[^4]。 #### 构建 PersistentVolumeClaim (PVC) 紧接着编写另一个 YAML 文件 `nfs-pvc.yaml` ,用来声明 PVC 请求资源: ```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi ``` 上述配置请求了一个具有至少 5GB 大小且支持多实例并发读写的持久化卷。 #### 应用至集群内 最后利用 kubectl 工具提交这些对象定义到 K8s API Server 上使之生效: ```bash kubectl apply -f nfs-pv.yaml kubectl apply -f nfs-pvc.yaml ``` 此时便完成了整个过程,后续只需按照常规方式引用这个 PVC 就可以在应用中享受来自远程 NFS 存储带来的便利了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值