avatar

Wz Blog

运维学习・持续更新

  • 首页
  • 文章
  • 登录/注册
  • 管理后台
主页 k8s持久化存储
文章

k8s持久化存储

发表于 2026-10-11 更新于 2026-10- 11
作者 Administrator
11~14 分钟 阅读

▶ 基本存储

• EmptyDir

EmptyDir是最基础的Volume类型,一个EmptyDir就是Host上的一个空目录。

pod销毁时,EmptyDir中的数据也会被永久删除。只起到一个共享目录的作用。

▪ yaml文件:

apiVerson: v1


kind: Pod
metadata:
name: volume-emptudir
namespace: demo
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- containerPort: 80
volumeMounts:
- name: logs-volume
mountPath: /var/log/nginx #挂载到容器中/var/log/nginx下
- name: busybox
image: busybox:1.30
volumeMounts:
- name: logs-volume
mountPath: /logs
volumes:
- name: logs-volume
emptyDir: {}

此时busybox就可以访问nginx的log文件了

• HostPath

emptydir中数据不会被持久化,hostpath简单地将数据持久化到主机中。

▪ yaml文件:

………………

………………


volumes:
- name: logs-volume
hostPath:
path: /data #本地持久化目录
type: DirectoryOrCreate
### ▪ type取值:
DirectoryOrCreate:目录存在就使用,不存在就先创建后使用
Directory:目录必须存在
FileOrCreate:文件存在就使用,不存在就先创建后使用
File:文件必须存在
Socket:unix套接字必须存在 (本机进程之间通信的文件)
CharDevice:字符设备必须存在 (流式硬件,按字节顺序读写)
BlockDevice:块设备必须存在 (存储硬件,按固定块随机读写)
####  • NFS

hostpath可以解决数据持久化的问题,但是一旦Node节点故障了,Pod如果转移到了别的节点,数据找不到。

NFS是一个网络文件系统,可以搭载一台NFS服务器,然后将Pod中的存储直接连接到NFS系统上,这样无论Pod在节点上怎么转移,只要Node跟NFS的对接没问题,数据就可以成功访问

▪ 准备NFS服务器(可以是另一台服务器,也可以是集群内的master节点)

1.集群每个节点安装nfs服务


yum install -y nfs-utils

2.准备一个共享目录


mkdir /data -pv

3.将共享目录以读写权限暴露给网段中所有的主机


vim /etc/exports

/data 网段地址/xx(rw,no_root_squash.sync)

rw:读写

no_root_squash:当用户以root身份挂载的时候,不要去掉root的特殊权限

sync:客户那边写数据了,马上刷盘到服务器上

tips:网段地址写*,代表任何一个网段都可以访问

4.启动nfs服务,验证


systemctl enable --now nfs

showmount -e nfs节点ip #验证节点是否能挂载目录

exportfs -rav #重载共享

exportfs -v #验证是否全部加载成功

▪ yaml文件

………………

………………


volumes:
- name: logs-volume
nfs:
server: xxx.xxx.xx.xx #nfs服务器地址
path: /data #共享文件路径
### ▶ 高级存储
####  • PV

pv是持久化卷的意思

▪ 资源清单


apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
nfs: #存储类型,与底层真正存储对应
capacity: #存储能力,目前只支持存储空间的设置
storage: 2Gi
accessModes: #访问模式
storageClassName: #存储类别
persistantVolumeReclaimPolicy: #回收策略
### ▪ pv的关键配置参数说明
1.存储类型:

底层实际存储的类型,k8s支持多种存储类型,每种存储类型的配置都有所差异

2.存储能力(capacity):

目前只支持存储空间的设置(storage=1Gi),不过未来可能会加入IOPS、吞吐量等指标的配置

3.访问模式(accessModes):

用于描述用户对存储资源的访问权限,访问权限包括下面几种:

(1)ReadWriteOnce(RWO):读写,只能被单节点挂载

(2)ReadOnlyMany(ROX):只读,可以被多节点挂载

(3)ReadWriteMany(RWX):读写,可以被多节点挂载

4.回收策略:

当pv不再被使用了之后,对其的处理方式,目前支持三种策略:

(1)Retain:保留数据,需要管理员手工清理数据

(2)Recycle:回收,清除PV中的数据

(3)Delete:与PV相连的后端存储完成volume的删除操作,常见于云服务商的存储服务

5.存储类别:

pv可以通过StorageClassName参数指定一个存储类别:

(1)具有特定类别的PV只能与请求了该类别的PVC绑定

(2)未设定类别的PV则只能与不请求任何类别的PVC绑定

6.状态(status):

一个PV的生命周期中,可能会处于4种不通的阶段:

(1)Available:表示可用状态,还未被任何PVC绑定

(2)Bound:表示PV已经被PVC绑定

(3)Released:表示PVC被删除,当前已释放状态

(4)Failed:表示该PV的自动回收失败

▪ yaml文件


apiVersion: v1
kind: PersistentVolume
metadata:
name: pv1
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
nfs:
path: /root/data/pv1 #容器内挂载地址
server: xxx.xxx.xx.xx #nfs服务器IP地址
####  • PVC
### ▪ 资源清单
apiVersion: v1
kind: PetsistentVolumeClaim
metadata:
name: pvc
namespace: demo
spec:
accessModes: #访问模式
selector: #标签选择
storageClassName: #存储类别
resources: #请求空间
requests:
storage: 5Gi
### ▪ 创建pvc.yaml,申请pv
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc1
namespace: demo
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
### ▪ 创建pod.yaml,使用pvc
………………
………………
spec:
containers:
- name: busybox
………………
………………
volumeMounts:
- mountPath: /root/
volumes:
- name: volume
persistantVolumeClain:
claimName: pvc1
readOnly: false
####  • 生命周期
1.资源供应:管理员手动创建底层存储和PV。
2.资源绑定:用户创建PVC,k8s负责根据PVC的声明去寻找PV,绑定。
3.资源使用:用户创建pod,使用PVC。
4.资源释放:用户删除PVC,与该PVC绑定的PV会被标记为“已释放”,但还不能立刻与其他PVC进行绑定。
5.资源回收:k8s根据PV设置的回收策略进行资源的回收。只有PV的存储空间完成回收, 才能供新的PVC绑定和使用。
### ▶ 配置存储
####  • ConfigMap

configmap是一种比较特殊的存储卷,它的主要作用是用来存储配置信息的

▪ yaml文件:


apiVersion: v1
kind: ConfigMap
metadata:
name: configmap01
namespace: demo
data:
username: "admin"
password: "123456"
exports: | #多行
xxxxxxxxxxxx
xxxxxxxx
xxxxxxxxx
### ▪ 创建一个pod使用这个configmap
……………………
……………………
spec:
…………
…………
volumeMounts:
- name: config
mountPath: /configmap/config
volumes:
- name: config
configMap:
name: configmap01
####  • Secret

secret主要用于存储敏感信息,例如密码、秘钥、证书等等。

1.使用base64对数据进行编码


echo -n 'admin' | base64
YWRTaW4=
echo -n '123456' | base64
MTIzNDU2

2.编写secret.yaml,创建Secret


apiVersion: v1
kind: Secret
matadata:
name: secret
namespace: dev
type: Opaque #该类型的secret不会自动加密,而是以明文的形式存储在集群中
data:
username: YWRtaW4=
password: MTIzNDU2
### 3.创建pod,挂载secret
………………
………………
spec:
………………
………………
volumeMounts:
- name: config
mountPath: /secret/config
volumes:
- name: config
secret:
secretName: secret
容器与云原生
笔记 Kubernetes
许可协议:  CC BY 4.0
分享

相关文章

10月 17, 2026

Kubernetes v1.28.2 双Master堆叠etcd + Haproxy/Keepalived 高可用部署 SOP(Docker + cri-dockerd)

架构一句话:3 台阿里云 ECS,2 台跑 kube-apiserver + etcd 堆叠控制平面,同时在这 2 台上混部 Haproxy + Keepalived 提供 VIP 172.26.127.62:6443;第 3 台做 Worker。所有 kubelet / kubectl 一律连 V

10月 11, 2026

使用Docker方式部署Harbor镜像仓库

1.下载离线安装包 wget https://github.com/goharbor/harbor/releases/download/v2.13.1/harbor-offline-installer-v2.13.1.tgz 2.解压到/opt目录下 tar xvzf harbor-offli

10月 11, 2026

kubernetes概念

▶ k8s简介以及主要功能(优势) • k8s简介 k8s的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化。 • 主要功能 ▪ 自我修复:RS deployment 一旦某一个容器崩溃,能够在1秒左右迅速启动新的容器 ▪ 弹性伸缩:

下一篇

k8s资源管理

上一篇

k8s实战操作

最近更新

  • Kubernetes v1.28.2 双Master堆叠etcd + Haproxy/Keepalived 高可用部署 SOP(Docker + cri-dockerd)
  • 名词解释
  • ECS 实例反复冻结 —— 故障根因分析报告
  • 运维六大工作内容
  • 磁盘相关命令

热门标签

监控 Linux 数据库 Docker 笔记 CI/CD Kubernetes Nginx

目录

©2026 Wz Blog. 保留部分权利。

使用 Halo 主题 Chirpy