https://www.cnblogs.com/caodan01/p/15136217.html

一、emptDir

emptyDir类型的volume在pod分配到node上时被创建,kubernetes会在node上自动分配 一个目录,因此无需指定宿主机node上对应的目录文件。这个目录的初始内容为空,当Pod从node上移除时,emptyDir中的数据会被永久删除。emptyDir Volume主要用于某些应用程序无需永久保存的临时目录。

不是为了存储数据,是为了实现多个Pod之间的临时数据共享,一般用来共享日志文件,当Pod删除时,emptydir立即删除

kind: Deployment
apiVersion: apps/v1
metadata:
name: emptydir
spec:
selector:
matchLabels:
app: emptydir
template:
metadata:
labels:
app: emptydir
spec:
containers:
- name: nginx
image: nginx
volumeMounts: # 引用存储卷
- mountPath: /data/
name: emptydir-name # 引用的存储卷名称
- name: php
image: registry.cn-hangzhou.aliyuncs.com/alivnos/
volumeMounts: # 引用存储卷
- mountPath: /opt
name: emptydir-name
volumes: # 定义空的存储卷,与containers同级
- name: emptydir-name # 存储卷的名称
emptyDir: {}

二、hostPath

hostPath 类型则是映射 node 文件系统中的文件或者目录到 pod 里。在使用 hostPath 类型的存储卷时,也可以设置 type 字段,支持的类型有文件、目录、File、Socket、CharDevice 和 BlockDevice。

hostPath是挂载node 主机上的(当pod运行在那台主机上,hostPtah就相当于docker挂载到当前系统)

支持的类型:
DirectoryOrCreate:如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 kubelet 相同的组和属主信息。
Directory 在给定路径上必须存在的目录。
FileOrCreate 如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 kubelet 相同的组和所有权。
File 在给定路径上必须存在的文件。
Socket 在给定路径上必须存在的 UNIX 套接字。
CharDevice 在给定路径上必须存在的字符设备。
BlockDevice 在给定路径上必须存在的块设备。
[root@k8s-m-01 ~]# kubectl explain pod.spec.volumes.hostPath

kind: Deployment
apiVersion: apps/v1
metadata:
name: emptydir
spec:
selector:
matchLabels:
app: emptydir
template:
metadata:
labels:
app: emptydir
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /opt
name: hostpath-name
volumes:
- name: hostpath-name
hostPath:
path: /opt #主机挂载的目录
type: DirectoryOrCreate # 没有的话自动创建,权限默认755
# type: Directory # 目录必须要存在
# type: FileOrCreate # 文件没有的话自动创建,权限默认644
# type: File # 文件必须存在
# type: Socket # 给定路径上必须有套接字文件

三、pv 和 pvc

PersistentVolume(PV)是集群中已由管理员配置的一段网络存储。 集群中的资源就像一个节点是一个集群资源。 PV是诸如卷之类的卷插件,但是具有独立于使用PV的任何单个pod的生命周期。 该API对象捕获存储的实现细节,即NFS,iSCSI或云提供商特定的存储系统。

PersistentVolumeClaim(PVC)是用户存储的请求。PVC的使用逻辑:在pod中定义一个存储卷(该存储卷类型为PVC),定义的时候直接指定大小,pvc必须与对应的pv建立关系,pvc会根据定义去pv申请,而pv是由存储空间创建出来的。pv和pvc是kubernetes抽象出来的一种存储资源。

pod的生命周期不会影响pv的生命周期,是把磁盘编程kubernetes的资源

pv是集群级资源,pvc是命名空间级资源-->使用要绑定命名空间

1.环境准备

# 每个节点都安装nfs
yum install nfs-utils -y # 创建存储目录
[root@m01 wordpress]# mkdir -p /nfs/v{1..9}
[root@m01 wordpress]# cd /nfs/
[root@m01 nfs]# ls
v1 v2 v3 v4 v5 v6 v7 v8 v9 /vim /etc/exports
/v1 192.168.15.0/24(rw,sync,all_squash)
/nfs/v2 192.168.15.0/24(rw,sync,all_squash)
/nfs/v3 192.168.15.0/24(rw,sync,all_squash)
/nfs/v4 192.168.15.0/24(rw,sync,all_squash)
/nfs/v5 192.168.15.0/24(rw,sync,all_squash)
/nfs/v6 192.168.15.0/24(rw,sync,all_squash)
/nfs/v7 192.168.15.0/24(rw,sync,all_squash)
/nfs/v8 192.168.15.0/24(rw,sync,all_squash)
/nfs/v9 192.168.15.0/24(rw,sync,all_squash) # 启动nfs
[root@m01 nfs]# systemctl enable --now rpcbind nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service. # 验证配置
[root@m01 nfs]# showmount -e
Export list for m01:
/nfs/v9 192.168.15.0/24
/nfs/v8 192.168.15.0/24
/nfs/v7 192.168.15.0/24
/nfs/v6 192.168.15.0/24
/nfs/v5 192.168.15.0/24
/nfs/v4 192.168.15.0/24
/nfs/v3 192.168.15.0/24
/nfs/v2 192.168.15.0/24
/nfs/v1 192.168.15.0/24

2.创建pv

详解

# pv 创建
# 不需要指定命名空间,pv是集群级资源 apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
labels:
app: pv001
spec:
nfs: # 存储类型
path: /nfs/v1 # 存储的目录
server: 192.168.15.51 # server的ip
accessModes: # 访问模式
- "ReadWriteMany" # RWX,多路可读可写(常用)
# - "ReadOnlyMany" # ROX,只读,可多节点挂载
# - "ReadWriteOnce" # RWO,可读可写,只支持单个模式的挂载
persistentVolumeReclaimPolicy: Retain # 解绑pvc的回收策略-->不清理(常用)
# persistentVolumeReclaimPolicy: Recycle # 删除,只有NFS,hostPath支持
# persistentVolumeReclaimPolicy: Delete # 其他模式的清除
capacity:
storage: 2Gi # 创建的大小

部署

apiVersion: v1
kind: PersistentVolume
metadata:
name: pv001
spec:
nfs:
path: /nfs/v1
server: 192.168.15.51
accessModes:
- "ReadWriteMany"
persistentVolumeReclaimPolicy: Retain
capacity:
storage: 2Gi

查看

[root@m01 pv]# kubectl apply -f pv.yaml
persistentvolume/pv001 created
[root@m01 pv]# kubectl get -f pv.yaml
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv001 2Gi RWX Retain Available 7s

3.创建pvc

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc001
namespace: xxx # pvc是命名空间级别资源,需要定义命名空间
spec:
accessModes:
- "ReadWriteMany" # 访问模式要与创建的pv一致
resources:
requests:
storage: "2Gi" # 选择适配的pv去进行匹配

4.使用

# 创建应用使用
kind: Deployment
apiVersion: apps/v1
metadata:
name: test-rwo
spec:
selector:
matchLabels:
app: rwo
template:
metadata:
labels:
app: rwo
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /opt
name: pvc001 # 使用的volumes
volumes:
- name: pvc001
persistentVolumeClaim: # 定义存储卷的类型是pvc
claimName: pvc001 # 存储卷的名字

5.综合案例

使用存储卷部署discuz,实现代码共享存储

# 创建数据库的命名空间
apiVersion: v1
kind: Namespace
metadata:
name: mysql
---
# 创建数据库
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: mysql
spec:
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
imagePullPolicy: Always
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
- name: MYSQL_DATABASE
value: discuz
--- # 创建数据库的Service
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: mysql
spec:
selector:
app: mysql
ports:
- port: 3306
targetPort: 3306
type: NodePort ---
# 创建discuz命名空间
apiVersion: v1
kind: Namespace
metadata:
name: discuz ---
# 创建discuz的pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: discuz
spec:
nfs:
path: /nfs/v1
server: 192.168.15.51
accessModes:
- "ReadWriteMany"
persistentVolumeReclaimPolicy: Retain
capacity:
storage: "2Gi" ---
# 创建discuz的pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: discuz
namespace: discuz
spec:
accessModes:
- "ReadWriteMany"
resources:
requests:
storage: "2Gi" --- # 创建discuz控制器
apiVersion: apps/v1
kind: Deployment
metadata:
name: discuz
namespace: discuz
spec:
selector:
matchLabels:
app: discuz
template:
metadata:
labels:
app: discuz
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/k8sos/web:discuz-php-v1
name: php
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /usr/share/nginx/html
name: discuz - name: nginx
image: registry.cn-hangzhou.aliyuncs.com/k8sos/web:discuz-v1
imagePullPolicy: IfNotPresent
livenessProbe:
exec:
command:
- "/bin/bash"
- "-c"
- "cat /etc/nginx/nginx.conf"
initialDelaySeconds: 0
periodSeconds: 3
timeoutSeconds: 1
successThreshold: 1
failureThreshold: 1
readinessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 10
periodSeconds: 1
timeoutSeconds: 1
successThreshold: 3
failureThreshold: 1
volumeMounts:
- mountPath: /usr/share/nginx/html
name: discuz volumes:
- name: discuz
persistentVolumeClaim:
claimName: discuz ---
# 创建discuz的Service
apiVersion: v1
kind: Service
metadata:
name: discuz
namespace: discuz
spec:
selector:
app: discuz
ports:
- port: 80
targetPort: 80
name: http
type: ClusterIP
---
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: ingress-discuz
namespace: discuz
spec:
rules:
- host: www.discuz.com
http:
paths:
- path: /
backend:
serviceName: discuz
servicePort: 80

 
分类: Kubernetes

[转帖]10--k8s之数据持久化的更多相关文章

  1. k8s部署mysql数据持久化

    在这里我部署mysql的目的是为了后面将上一篇博客docker打包的el-admin镜像部署到k8s上,所以本文主要是部署mysql并实现持久化. 1.将我们的应用都部署到 el-admin 这个命名 ...

  2. Kubernetes使用GlusterFS实现数据持久化

    k8s中部署有状态应用等需要持久化数据的应用,必不可少得用存储,k8s支持很多中存储方案,我司目前使用的存储有glusterfs(分为容器化和裸机方式).nfs供应用选用,本次就简单实战下gluste ...

  3. Redis学习总结(1)——数据持久化

    以前研究Redis的时候,很多东西都不太明白,理解得也不太深,现在有时间重新拾起来看看,将一些心得记录下来,希望和大家一起探讨. 一.简介 Redis是一个单线程高可用的Key-Value存储系统,和 ...

  4. iOS数据持久化-OC

    沙盒详解 1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文 ...

  5. iOS 数据持久化(扩展知识:模糊背景效果和密码保护功能)

    本篇随笔除了介绍 iOS 数据持久化知识之外,还贯穿了以下内容: (1)自定义 TableView,结合 block 从 ViewController 中分离出 View,轻 ViewControll ...

  6. iOS数据持久化

    在iOS中,实现数据持久化一般分为4大种: 1.属性列表 2.对象归档 3.SQLite 4.Core Data 一.属性列表 NSUserDefaults类的使用和NSKeyedArchiver有很 ...

  7. 数据持久化-Plist文件写入

    数据持久化,常见4种:归档,plist文件,sqlite,coreData.今天复习的是plist文件读写. // // ViewController.m // Test_Plist // // Cr ...

  8. 漫游Kafka设计篇之数据持久化

    Kafka大量依赖文件系统去存储和缓存消息.对于硬盘有个传统的观念是硬盘总是很慢,这使很多人怀疑基于文件系统的架构能否提供优异的性能.实际上硬盘的快慢完全取决于使用它的方式.设计良好的硬盘架构可以和内 ...

  9. 转载 -- iOS数据持久化存储

    作者:@翁呀伟呀 授权本站转载 概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方 ...

  10. 四种数据持久化方式(下) :SQLite3 和 Core Data

    在上文,我们介绍了iOS开发中的其中2种数据持久化方式:属性列表.归档解档. 本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运用: 在本节,将通过对4个文 ...

随机推荐

  1. 手动实现BERT

      本文重点介绍了如何从零训练一个BERT模型的过程,包括整体上BERT模型架构.数据集如何做预处理.MASK替换策略.训练模型和保存.加载模型和测试等. 一.BERT架构   BERT设计初衷是作为 ...

  2. 【新春特辑】发压岁钱、看贺岁片、AI写春联……华为云社区给大家拜年了

    摘要:充电团聚云上见,顺便攒攒压岁钱. 春!节!倒!计!时!啦! 农历新年即将到来,热闹的过年氛围逐渐弥漫,华为云社区先给大家拜个早年,祝所有小伙伴们新春快乐,牛年大吉! 回望2020年,社区涌现了许 ...

  3. 《低代码发展白皮书(2022年)》&《2022低代码·无代码应用案例汇编》,发布了

    摘要:信息通信研究院云计算与大数据研究所副所长栗蔚发布了<低代码发展白皮书(2022年)>&<2022低代码·无代码应用案例汇编>. 本文分享自华为云社区<华为参 ...

  4. 华为云GuassDB(for Redis)发布全新版本推出:Lua脚本和SSL连接加密

    摘要:9月8日,华为云GuassDB(for Redis)正式推出全新版本.新版本内核带来性能提升.无损升级.慢日志统计等多维度产品体验,同时推出Lua脚本和SSL连接加密两大重要功能,让业务设计更加 ...

  5. 带你了解 HBase 数据模型和 HBase 架构

    摘要:HBase 是一个面向列的 NoSQL 数据库. 本文分享自华为云社区<HBase 架构:HBase 数据模型 & HBase 读/写机制>,作者: Donglian Lin ...

  6. 云图说|初识数据库和应用迁移UGO

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:数据库和应用迁移 ...

  7. 联合枚举类型:从C语言看枚举与联合类型到TypeScript/Python

    枚举,还是从hello world 开奖,大部分的人应该是从C开始的,比如我.当然,这部分也可以跳过. 详说枚举类型: C语言中的enum 计算机入门时候有点印象: enum是C语言中的一个关键字,e ...

  8. 揭露ROI提升5倍的秘密!火山引擎A/B测试白皮书重磅发布(内附下载链接)

    - 文末立即下载白皮书原文 -  近期,<火山引擎A/B测试总体经济影响白皮书>正式发布.这份白皮书由市场研究公司Forrester调研撰写,揭示了A/B测试对于企业营收增长.运营成本.生 ...

  9. Runnable接口的 run() 方法和start()方法

    1.start()方法来启动线程,真正实现了多线程运行.这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码:通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就 ...

  10. Unable to open debugger port (127.0.0.1:53471): java.net.SocketException "Socket closed"

    21:59 Error running 'Vipsoft': Cannot run program "/Users/jimmy/Java/apache-tomcat-9.0.14/bin/c ...