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生命周期

file

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

Avaliable(可用):表示可用状态,还未被任何PVC绑定
Bound(可绑定):表示PV已经被PVC绑定
Released(已释放):PVC被删除,但是资源还未被集群重新声明
Failed(失败):表示该PV的自动回收失败

创建PVC之后,k8s就会去查找满足我们声明要求的PV,比如storageClassName,accessModes以及容量这些是否满足要求,如果满足要求就将PV和PVC绑定在一起。

需要注意的是目前PV和PVC之间是一对一绑定的关系,也就是说一个PV只能被一个PVC绑定。

file

实验-创建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

PVC资源回收机制

file


山林不向四季起誓 荣枯随缘