一、 前言

之前我们有提到数据卷:emptydir ,是本地存储,pod重启,数据就不存在了,需要对数据持久化存储
对于数据持久化存储【pod重启,数据还存在】,有两种方式

  • nfs:网络存储【通过一台服务器来存储】

没有多的服务器,看个热闹!

二、 步骤

2.1 持久化服务器上操作

  • 找一台新的服务器nfs服务端,安装nfs
  • 设置挂载路径

使用命令安装nfs

  1. yum install -y nfs-utils

首先创建存放数据的目录

  1. mkdir -p /data/nfx

设置挂载路径

  1. # 打开文件
  2. vim /etc/exports
  3. # 添加如下内容
  4. /data/nfs *(rw,no_root_squash)

执行完成后,即部署完我们的持久化服务器

2.2 Node节点上操作

然后需要在k8s集群node节点上安装nfs,这里需要在 node1 和 node2节点上安装

  1. yum install -y nfs-utils

执行完成后,会自动帮我们挂载上

2.3 启动nfs服务端

下面我们回到nfs服务端,启动我们的nfs服务

  1. systemctl start nfs
  2. # 看下里面的进程
  3. ps -ef | grep nfs

Kubernetes持久化存储 - 图1

2.4 K8s集群部署应用

最后我们在k8s集群上部署应用,使用nfs持久化存储

  1. # 创建一个pv文件
  2. mkdir pv
  3. # 进入
  4. cd pv

然后创建一个yaml文件 nfs-nginx.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-dep1
  5. spec:
  6. replicas: 1
  7. selector:
  8. matchLabels:
  9. app: nginx
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx
  14. spec:
  15. containers:
  16. - name: nginx
  17. image: nginx
  18. volumeMounts:
  19. - name: wwwroot
  20. mountPath: /usr/share/nginx/html
  21. ports:
  22. - containerPort: 80
  23. volumes:
  24. - name: wwwroot
  25. nfs:
  26. # 改成自己的服务器端地址
  27. server: 10.4.104.169
  28. path: /data/nfs

通过这个方式,就挂载到了刚刚我们的nfs数据节点下的 /data/nfs 目录
最后就变成了: /usr/share/nginx/html -> 10.4.104.169 /data/nfs 内容是对应的
我们通过这个 yaml文件,创建一个pod

  1. kubectl apply -f nfs-nginx.yaml

创建完成后,我们也可以查看日志

  1. kubectl get pod
  2. kubectl describe pod nginx-dep1

Kubernetes持久化存储 - 图2
可以看到,我们的pod已经成功创建出来了,同时下图也是出于Running状态
Kubernetes持久化存储 - 图3
下面我们就可以进行测试了,比如现在nfs服务节点上添加数据,然后在看数据是否存在 pod中

  1. # 进入pod中查看
  2. kubectl exec -it nginx-dep1 bash
  3. # 到里边
  4. cd /usr/share/nginx/html

Kubernetes持久化存储 - 图4

三、 PV和PVC

对于上述的方式,我们都知道,我们的ip 和端口是直接放在我们的容器上的,这样管理起来可能不方便 自己的服务器地址被人看到了不安全!

所以这里就需要用到 pv 和 pvc的概念了,方便我们配置和管理我们的 ip 地址等元信息
PV:持久化存储,对存储的资源进行抽象,对外提供可以调用的地方【生产者】
PVC:用于调用,不需要关心内部实现细节【消费者】

PV 和 PVC 使得 K8S 集群具备了存储的逻辑抽象能力。使得在配置Pod的逻辑里可以忽略对实际后台存储 技术的配置,而把这项配置的工作交给PV的配置者,即集群的管理者。存储的PV和PVC的这种关系,跟 计算的Node和Pod的关系是非常类似的;PV和Node是资源的提供者,根据集群的基础设施变化而变 化,由K8s集群管理员配置;而PVC和Pod是资源的使用者,根据业务服务的需求变化而变化,由K8s集 群的使用者即服务的管理员来配置。

实现流程

  • PVC绑定PV
  • 定义PVC
  • 定义PV【数据卷定义,指定数据存储服务器的ip、路径、容量和匹配模式】

Kubernetes持久化存储 - 图5

举例

创建一个 pvc.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: nginx-dep1
  5. spec:
  6. replicas: 3
  7. selector:
  8. matchLabels:
  9. app: nginx
  10. template:
  11. metadata:
  12. labels:
  13. app: nginx
  14. spec:
  15. containers:
  16. - name: nginx
  17. image: nginx
  18. volumeMounts:
  19. - name: wwwroot
  20. mountPath: /usr/share/nginx/html
  21. ports:
  22. - containerPort: 80
  23. volumes:
  24. - name: wwwroot
  25. persistentVolumeClaim:
  26. claimName: my-pvc
  27. ---
  28. apiVersion: v1
  29. kind: PersistentVolumeClaim
  30. metadata:
  31. name: my-pvc
  32. spec:
  33. accessModes:
  34. - ReadWriteMany
  35. resources:
  36. requests:
  37. storage: 5Gi

第一部分是定义一个 deployment,做一个部署

  • 副本数:3
  • 挂载路径
  • 调用:是通过pvc的模式

然后定义pvc

  1. kubectl apply -f pvc.yaml

然后在创建一个 pv.yaml

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: my-pv
  5. spec:
  6. capacity:
  7. storage: 5Gi
  8. accessModes:
  9. - ReadWriteMany
  10. nfs:
  11. path: /data/nfs
  12. server: 10.4.104.169

然后就可以创建pod了

  1. kubectl apply -f pv.yaml

然后我们就可以通过下面命令,查看我们的 pv 和 pvc之间的绑定关系

  1. kubectl get pv, pvc

Kubernetes持久化存储 - 图6
到这里为止,我们就完成了我们 pv 和 pvc的绑定操作,通过之前的方式,进入pod中查看内容

  1. kubect exec -it nginx-dep1 bash

然后查看 /usr/share/nginx.html
Kubernetes持久化存储 - 图7
也同样能看到刚刚的内容,其实这种操作和之前我们的nfs是一样的,只是多了一层pvc绑定pv的操作