某些应用是要持久化数据的,如果直接持久化在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. Eureka和Zookeeper区别?

    (1)Eureka取CAP的AP,注重可用性,Zookeeper取CAP的CP注重一致性. (2)Zookeeper在选举期间注册服务瘫痪,虽然服务最终会恢复,但选举期间不可用. (3)eureka的 ...

  2. JavaScript的一些实用操作(逐步添加)

    1.js代码简洁高效计时 console.time('a'); //记录时间开始 ... console.timeEnd('a'); //记录时间结束 a: 12857.81103515625ms / ...

  3. 学习Puppet(三)

    一.相关概念: 1.  puppet基于C/S架构,使用ruby编写,在类UNIX平台上集中配置管理系统,它可以管理配置文件.用户.cron任务.软件包.系统服务. 2.  puppet把系统实体称为 ...

  4. 《剑指offer》面试题4:替换空格

    面试题4:替换空格 题目:请实现一个函数,把字符串中的每个空格替换成"%20",例如输入"We are happy.",则输出"we%20are%20 ...

  5. BeeFramework:以极客的方式开发你的应用

    BeeFramework 是新一代的应用开发框架,它能使应用开发变得更简单更容易,它是由 Gavin Kwoe 和 QFish 开发并维护的.使用 BeeFramework 能像 html 和 css ...

  6. H5使用Canvas绘图

    一.什么是Canvas Canvas 是H5的一部分,允许脚本语言动态渲染图像.Canvas 定义一个区域,可以由html属性定义该区域的宽高,javascript代码可以访问该区域,通过一整套完整的 ...

  7. ES6-11学习笔记--类与继承

    ES5 中的类与继承: 类的定义: function People(name, age) { // this指向当前实例化对象 console.log(this); // 实例属性 this.name ...

  8. GoF设计模式-23大设计模式(表格)-程序员必备+必背

    在GoF经典著作<设计模式:可复用面向对象软件的基础>中一共描述了23种设计模式. <Design Patterns:Elements of Reusable Object-Orie ...

  9. 【小程序开发】 点击button按钮,引导用户授权

    一. 前言 小程序官方文档,上面说明 wx.getUserInfo(OBJECT) 注意:此接口有调整,使用该接口将不再出现授权弹窗,请使用 <button open-type="ge ...

  10. java中方法重载是什么, 实际中到底有什么意义, 用处?请举例

    7.3 方法重载(overload)  当几个方法有相同的方法名,但参数个数不同或参数类型不同时,就涉及方法重载 方法重载有什么意义呢?在公司里编程,有时候一个方法名,要用到很多次,而且每次跟每次的参 ...