05Kubernetes-持久化存储PV和PVC
Kubernetes存储介绍
容器内部的的存储在生命周期是短暂的,会随着容器环境的销毁而销毁,具有不稳定性。在k8s里将对容器应用所需的存储资源抽象为存储卷(Volume)概念来解决这些问题。
k8s目前支持的Volume类型包括k8s的内部资源对象类型,开源共享存储类型和公有云存储等。分类如下:
k8s特定的资源对象:
ConfigMap应用配置
Secret加密数据
ServiceAccountToken token数据
k8s本地存储类型:
EmptDir: 临时存储
HostPath: 宿主机目录
持久化存储(PV)和网络共享存储:
CephFS:开源共享存储系统
GlusterFS:开源共享存储系统
NFS:开源共享存储
PersistentVolumeClaim:简称Pvc,持久化存储的申请空间
NFS共享存储
创建NFS服务
yum install nfs-utils -y
cat > /etc/exports << 'EOF'
/data/nfs-volume/blog *(rw, sync,no_root_squash)
EOF
mkdir -p / data/nfs-volume/blog
systemctl restart nfs
创建NFS类型资源清单
[root@db01 nfs-nginx]# cat nginx-dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dp
spec:
replicas: 2
selector:
matchLabels:
app: nginx-nfs
template:
metadata:
name: nginx-nfs
labels:
app: nginx-nfs
spec:
volumes:
- name: nfs-data
nfs:
server: 10.0.0.51
path: /data/mysql/data
containers:
- name: nginx
image: nginx:alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: nfs-data
mountPath: /usr/share/nginx/html/
PV和PVC介绍
PV是对底层网络共享存储的抽象,将共享存储定义为—种“资源"”。
PV由管理员创建和配置
PVC则是用户对存储资源的一个“申请"。
就像Pod消费Node的资源一样,PVC能够“消费"PV资源
PVC可以申请特定的存储空间和访问模式
PV和PVC生命周期
在PV的整个生命周期中,可能会处于4种不同的阶段:
Avaliable(可用):表示可用状态,还未被任何PVC绑定
Bound(可绑定):表示PV已经被PVC绑定
Released(已释放):PVC被删除,但是资源还未被集群重新声明
Failed(失败):表示该PV的自动回收失败
创建PVC之后,k8s就会去查找满足我们声明要求的PV,比如storageClassName,accessModes以及容量这些是否满足要求,如果满足要求就将PV和PVC绑定在一起。
需要注意的是目前PV和PVC之间是一对一绑定的关系,也就是说一个PV只能被一个PVC绑定。
实验-创建nfs和mysql的pv及pvc
master节点安装nfs
yum install nfs-utils -y
mkdir /data/nfs-volume/mysql -p
vim /etc/exports
/data/nfs-volume 10.0.0.0/24(rw,async, no_root_squash,no_all_squash)
systemctl restart rpcbind nfs
showmount -e 127.8.e.1
所有node节点安装nfs
yum install nfs-utils.x86_64 -y
showmount -e 1e.e.8.11
1.编写并创建nfs-pv资源
[root@db01 pv]# vim nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv01
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /data/pv/data
server: 10.0.0.51
[root@db01 pv]# kubectl apply -f nfs-pv.yaml
persistentvolume/pv01 created
## 查看PV
[root@db01 pv]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv01 5Gi RWO Recycle Available nfs 11s
PV资源关键参数
capacity: PV存储的容量
accessModes: 访问模式,k8s支持的访问模式如下
------------------------------------------------------
ReadWriteOnce(RWO): 读写权限,并且只能被单个Node挂载
ReadOnlyMany(ROX): 只读权限,允许被多个Node挂载
ReadWriteMany(RWX): 读写权限,允许被多个Node挂载
------------------------------------------------------
persistentVolumeReclaimPolicy: 回收策略
------------------------------------------------------
Retain: 保留数据,需要手工处理
Recycle: 简单清除文件的操作(例如运行rm -rf /dada/* 命令)
Delete: 与PV相连的后端存储完成Volume的删除操作
目前只有NFS和HostPath两种类型的PV支持Recycle策略。
------------------------------------------------------
storageClassName: 存储类别
具有特定类别的PV只能与请求了该类别的PVC绑定。未指定类型的PV则只能对与不请求任何类别的PVC绑定。
2.创建PVC关联PV资源池和POD
cat >mysql-pvc.yaml <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: busybox-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nfs
EOF
POD连接PVC
cat >mysql-dp.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
volumeMounts:
- name: mysql-pvc
mountPath: /var/lib/mysql
- name: mysql-log
mountPath: /var/log/mysql
volumes:
- name: mysql-pvc
persistentVolumeClaim:
claimName: mysql-pvc
- name: mysql-log
hostPath:
path: /var/log/mysql
nodeSelector:
disktype: SSD
EOF
Comments | NOTHING