k8s持久化存储
▶ 基本存储
• 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