某些应用是要持久化数据的,如果直接持久化在pod所在节点,当pod因为某种原因重建或被调度另外一台节点,是无法访问到之前持久化的数据,所以需要一个公共存储数据的地方,无论pod删除重建或重新调度到其他节点都能访问原来的数据,使用nfs就可以到达此目的。

一、安装nfs

1.在k8sMaster主节点上安装nfs服务端

apt install -y nfs-kernel-server
systemctl start nfs-server
systemctl enable nfs-server
systemctl status nfs-server

查看安装后的状态为active

创建目录并设置权限

mkdir -p /nfs/data
echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports

不要忘了重启nfs-server

systemctl restart nfs-server

2.在两台k8sworker节点上安装nfs客户端

apt install -y nfs-common
mkdir -p /nfs/data
# 把本地的/nfs/data挂载到主节点上
mount 192.168.59.110:/nfs/data /nfs/data

3.测试

在某台worker节点上往目录中写入测试文件数据

echo "nfs data" >> /nfs/data/test.txt

在所有节点上都能查看到写入的数据,并且是一样的

二、使用原始方式挂载pod数据目录

1.先删除之前dev名称空间下的所有资源

kubectl delete ns dev

2.把ns、deployment、svc资源的描述合并在一个yaml文件中

vi nginx-deploy-svc.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: nginxvolume
mountPath: /usr/share/nginx/html
volumes:
- name: nginxvolume
#通过nfs服务挂载
nfs:
server: 192.168.59.110
# 此处要特别注意:一定要手动创建nginx子目录,否则pod在过载的时候会报目录不存在异常
path: /nfs/data/nginx
---
apiVersion: v1
kind: Service
metadata:
labels:
app: svc-nginx
name: svc-nginx
namespace: dev
spec:
selector:
app: nginx
type: NodePort
ports:
- port: 8000
protocol: TCP
targetPort: 80

3.创建资源对象

kubectl apply -f nginx-deploy-svc.yaml

查看svc的ip与端口号

4.测试

在挂载目录中创建index.html

echo "hello,nfs" >> /nfs/data/nginx/index.html

通过ip端口访问,可以看到读取的就是nfs目录中的内容

现在你可以把dev名称空间删除,然后重新创建这些资源,再次访问的时候,发现数据还在。

三、PV

PV:持久卷(Persistent Volume),将应用需要持久化的数据保存到指定位置,与namespace无关

1.先创建nfs目录

# 在master节点执行
mkdir -p /nfs/data/01
mkdir -p /nfs/data/02
mkdir -p /nfs/data/03

2.创建基于nfs的pv对象

(1)创建pv资源文件

vi pv.yaml

(2)编写三个pv资源对象,大小分别是:10M,1G,5G

apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-10m
spec:
capacity:
storage: 10M
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/01
server: 192.168.59.110
--- apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-1gi
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/02
server: 192.168.59.110
--- apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-5gi
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
storageClassName: nfs
nfs:
path: /nfs/data/03
server: 192.168.59.110

(3)创建pv对象

kubectl apply -f pv.yaml

3.查看创建结果

kubectl get pv

pv对象列表

某个pv对象的详细信息

四、PVC

PVC:持久卷申明(Persistent Volume Claim),申明需要使用的持久卷规格

1.创建pvc

(1)创建pvc资源文件

vi pvc.yaml

(2)编写pvc资源申明信息

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginx-pvc
namespace: dev
spec:
accessModes:
- ReadWriteMany
resources:
requests:
# 申请200M的空间
storage: 200Mi
storageClassName: nfs

(3)创建pvc对象

kubectl apply -f pvc.yaml

2.查看创建结果

kubectl get pvc -owide -n dev

由于申请的是200M空间,可以看到k8s自定绑定到合适的pv对象上,即选择大小为1G的pv对象。

再回过头来查看pv对象的绑定信息,可以看到已经和刚刚创建的pvc对象绑定了。

五、绑定pod与pvc

1.创建新的yaml文件

(1)新建资源文件

vi nginx-dp-svc-pvc.yaml

(2)使用persistentVolumeClaim属性指定刚刚创建的nginx-pvc对象

apiVersion: v1
kind: Namespace
metadata:
name: dev
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
namespace: dev
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
volumeMounts:
- name: nginxvolume
mountPath: /usr/share/nginx/html
volumes:
- name: nginxvolume
# 使用pvc
persistentVolumeClaim:
claimName: nginx-pvc
---
apiVersion: v1
kind: Service
metadata:
labels:
app: svc-nginx
name: svc-nginx
namespace: dev
spec:
selector:
app: nginx
type: NodePort
ports:
- port: 8000
protocol: TCP
targetPort: 80

(3)创建pod,svc对象

kubectl apply -f nginx-dp-svc-pvc.yaml

2.测试

由于申请的是pvc是与名称为pv-1gi的pv对象绑定的,所以往/nfs/data/02文件夹中写入index.htm文件进行测试

echo "hello,pv" >> /nfs/data/02/index.html

使用ip访问服务,可以看到正确输出了内容

再次查看pv,pvc信息

3.删除pod

当删除pod,与之绑定的pvc对象也会被删除,pv对象的状态变成Released

k8s入门之PV和PVC(八)的更多相关文章

  1. 容器编排系统K8s之PV、PVC、SC资源

    前文我们聊到了k8s中给Pod添加存储卷相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14180752.html:今天我们来聊一下持久存储卷相关话题 ...

  2. Kubernetes集群PV和PVC详解

    Kubernetes集群高级存储资源PV及PVC 文章目录 Kubernetes集群高级存储资源PV及PVC 1.高级存储PV和PVC概念部分 2.PV和PVC资源的生命周期 3.PV资源介绍与案例配 ...

  3. K8S 使用NFS 创建PV和PVC的例子 学习From https://blog.csdn.net/xts_huangxin/article/details/51494472

    1. 获取资料 网址: https://blog.csdn.net/xts_huangxin/article/details/51494472  感谢原作者 这里面 按照自己的机器情况进行了学习模仿 ...

  4. k8s的pv和pvc简述

    pvc:资源需要指定:1.accessMode:访问模型:对象列表:    ReadWriteOnce – the volume can be mounted as read-write by a s ...

  5. 6.k8s.存储Volume.PV.PVC

    #Volume Volume 解决数据持久化和容器间共享数据 Kubernetes支持几十种类型的后端存储卷 #hostPath挂载实例,挂载Node节点/tmp/test-volume目录到容器/t ...

  6. 4.k8s存储之Volume、PV、PVC和StatefulSet

    3.Volume 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题.首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失--容器以干净的状态(镜像最初的 ...

  7. k8s之PV、PVC、StorageClass详解

    导读 上一篇写了共享存储的概述以及一个简单的案例演示.这一篇就写一下PV和PVC. PV是对底层网络共享存储的抽象,将共享存储定义为一种"资源",比如Node也是容器应用可以消费的 ...

  8. 7.2 k8s 基于PV、PVC搭建zookeeper 3节点集群

    1.PV,PVC介绍 1.1.StorageClass & PV & PVC关系图 Volumes 是最基础的存储抽象,其支持多种类型,包括本地存储.NFS.FC以及众多的云存储,我们 ...

  9. k8s之PV、PVC

    目录 一.PVC和PV 1.1 PV概念 1.2 PVC概念 1.3 PV与PVC之间的关系 1.4 两种PV的提供方式 二.基于nfs创建静态PV资源和PVC资源 2.1 配置nfs存储(192.1 ...

随机推荐

  1. JVM中的常量池

    在Java的内存分配中,总共3种常量池: ref:https://blog.csdn.net/zm13007310400/article/details/77534349 1.字符串常量池(Strin ...

  2. 为什么 wait 和 notify 方法要在同步块中调用?

    Java API 强制要求这样做,如果你不这么做,你的代码会抛出 IllegalMonitorStateException 异常.还有一个原因是为了避免 wait 和 notify 之间产生竞态条件.

  3. Mybatis中的分页

    Mybatis中有哪些分页方式? 数组分页:查询出全部数据,然后再list中截取需要的部分.(逻辑分页) 优点:效率高     缺点:占用内存比较高 sql分页:只从数据库中查询当前页的数据.(物理分 ...

  4. 在并发情况下,Elasticsearch 如果保证读写一致?

    1.可以通过版本号使用乐观并发控制,以确保新版本不会被旧版本覆盖,由应用 层来处理具体的冲突: 2.另外对于写操作,一致性级别支持 quorum/one/all,默认为 quorum,即只 有当大多数 ...

  5. @Required 注解有什么用?

    @Required 应用于 bean 属性 setter 方法.此注解仅指示必须在配置时使用 bean 定义中的显式属性值或使用自动装配填充受影响的 bean 属性.如果尚未 填充受影响的 bean ...

  6. 学习Tomcat(二)

    一. Java简介 JDK: 面向开发人员使用的SDK,提供Java的开发环境和运行环境 SDK: 软件开发包,包括函数库.编译程序等 JRE: Java的运行环境,面向Java的使用者,不是开发者 ...

  7. java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?重写跟重载的区别?

    java中的方法重载发生在同一个类里面两个或者多个方法的方法名相同但是参数不同的情况.与此相对,方法覆盖是说子类重新定义了父类的方法.方法覆盖必须有相同的方法名,参数列表和返回类型. 覆盖者可能不会限 ...

  8. 关于CDN那些事

    对于前端性能优化我们不得不了解的几个知识点:CDN.HTTP header信息 今天我就来谈谈我对cdn的理解 1.CDN是什么:CDN全称是Content Delivery Network,即内容分 ...

  9. 记离线缓存(manifest)一大坑,断定其只适用于静态网站或离线应用

    今天看了离线缓存(manifest)方面的资料,兴冲冲地就想给自己的网站用上.待我把代码都写好部署上服务器,并测试过OK的时候,在SegmentFault刷了一把manifest方面的问答,才发现这个 ...

  10. 编写大型项目web页面 从写web登陆页面开始

    web页面搭建需要准备什么工具 首先我们会和设计师沟通 我们需要一些检验设计的工具 ps 自动裁图 自动测量工具 (我这里安利一下一个工具 我用的cutterman) sketch 可以使用阿里的工具 ...