【云原生 • Kubernetes】kubernetes 核心技术 - 持久化存储
本文导读
-
- 一、nfs 网络存储
-
- 1. master 节点部署 nfs(nfs 服务端)
- 2. node 节点部署 nfs
- 3. 网络存储验证演示
- 二、PV 和 PVC
-
- 1. PV、PVC 介绍
- 2. 实现流程
在以往的数据卷存储形式中,存储是本地存储,也就是说当我们的节点 pod 重启过后,数据便会清空,这仅仅适合临时存储。而要让数据长久的存储下来,就需要引入持久化存储。
一、nfs 网络存储
1. master 节点部署 nfs(nfs 服务端)
首先我们需要将一台虚拟机/服务器作为 nfs服务器
,并安装 nfs、设置挂载路径。在这里我使用 master 节点虚拟机 【k8s_master】 作为 nfs 服务器,IP 地址为 192.168.200.132;
第一步:安装 nfs;
yum install -y nfs-utils
第二步:设置挂载路径,vi /etc/exports
进入文件,在该文件中加入以下内容;
我这里挂载的是 /data/nfs 目录(可自定),* 代表所有内容,rw 代表授予读写权限;
第三步:创建要挂载的目录 /data/nfs,如果不创建目录后面会报错找不到该目录;
[root@master ~]# mkdir data[root@master ~]# cd data[root@master data]# mkdir nfs[root@master data]# lsnfs[root@master data]#
此时,nfs 服务端部署完成。
2. node 节点部署 nfs
在 k8s 集群中代表 node 节点的虚拟机/服务器中也安装 nfs;
提示:k8s 集群的完整搭建过程均已在往期文章讲述,文章之间内容环环相扣,详情请参见专栏 云原生 - 入门到实战。
在这里我使用 node 节点虚拟机【k8s_node1】和【k8s_node2】,IP 地址分别为 192.168.200.133、192.168.200.134;
3. 网络存储验证演示
第一步:在 nfs 服务端(master 节点)启动 nfs;
systemctl start nfs
启动之后可以使用命令 ps -ef | grep nfs
查看 nfs 进程;
第二步:新建一个目录 pv 和 yaml 文件 nfs-nginx.yaml;
[root@master ~]# mkdir pv[root@master ~]# cd pv[root@master pv]# vi nfs-nginx.yaml
yaml 文件中写入以下内容:
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-dep1spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx volumeMounts: - name: wwwroot mountPath: /usr/share/nginx/html ports: - containerPort: 80 volumes: - name: wwwroot nfs: server: 192.168.200.132path: /data/nfs
第三步:在 yaml 文件创建成功后执行该文件;
[root@master pv]# kubectl apply -f nfs-nginx.yaml deployment.apps/nginx-dep1 created[root@master pv]#
如果启动文件时报错请先关闭系统的防火墙
service iptables stop
。
此时查看 pods 可以看到我们创建的 nginx-dep1,为 running 状态即创建成功;
第四步:进入 nginx-dep1
kubectl exec -it nginx-dep1-6f58f9944b-zz25r bash
接下来就可以使用我们在 yaml 文件中挂载的目录 /usr/share/nginx/html
了;开始查看该目录一定是为空的,当我们 nfs 目录下创建任何文件时,文件都会存储在此挂载目录,且是持久化存储。
二、PV 和 PVC
1. PV、PVC 介绍
在网络存储的方式中,我们必须要知道 nfs 服务器的 IP 地址,那么如若 IP 地址泄露,安全则不能被保障,所以该方法弊端明显。而 PV 和 PVC 则可以解决该弊端:
PV
:PersistentVolume 持久化存储,对存储资源进行抽象,可以对外提供一个专门用于调用的接口(生产者)。PVC
:PersistentVolumeClaim 持久化存储调用,用户调用无需关系内部实现细节,直接调用即可(消费/调用者)。
2. 实现流程
第一步:在 pv 目录下创建 pv.yaml 文件,写入以下内容;
apiVersion: v1kind: PersistentVolumemetadata: name: my-pvspec: capacity: storage: 5Gi accessModes: - ReadWriteMany nfs: path: /k8s/nfs server: 192.168.200.132
第二步:在 pv 目录下创建 pvc.yaml 文件,写入以下内容;
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-dep1spec: replicas: 3 selector: matchLabels:app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx volumeMounts: - name: wwwroot mountPath: /usr/share/nginx/html ports: - containerPort: 80 volumes: - name: wwwroot persistentVolumeClaim: claimName: my-pvcapiVersion: v1kind: PersistentVolumeClaimmetadata: name: my-pvcspec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi
第三步:执行 yaml 文件;
kubectl apply -f pv.yamlkubectl apply -f pvc.yaml
之后的操作则与 nfs 相同,区别在于此方法多了一层 PVC。