一. 前言
卷不是独立的k8s对象,它是pod的一部分,和pod同生命周期(共享),不能单独创建和销毁,即跟随pod启动时创建,删除时销毁。当重启容器时,卷可以保持不变,新的容器可以识别上一个容器写入卷的所有文件,这样就可以卡点继续工作。所有容器使用卷的前提是将卷挂载在每个需要访问它的容器中,当然,这个操作可以在容器文件系统的任意位置挂载。不过,容器可以装载也可以选择不装载卷。
二. 卷的分类
1. emptyDir卷
当 Pod 指定到某个节点上时,首先创建的是一个 emptyDir 卷,并且只要 Pod 在该节点上运行,卷就一直存在。 就像它的名称表示的那样,卷最初是空的。 尽管Pod 中的容器挂载 emptyDir 卷的路径可能相同也可能不同,但是这些容器都可以读写 emptyDir 卷中相同的文件。 当 Pod 因为某些原因被从节点上删除时,emptyDir 卷中的数据也会永久删除 ---- emptyDir卷同pod的生命周期,pod生,emptyDir卷生,pod亡,emptyDir卷亡。
2. hostPath卷
1)hostPath卷指向节点文件系统上的特定文件或目录,某些系统级别的pod可以通过挂载hostPath卷去读取节点的文件或使用节点文件系统对节点进行访问。在同一个节点上运行并在其hostPath卷中使用相同路径的pod可以看到相同的文件。hostPath卷属于持久性存储,删除pod后,卷里面的文件继续保持,不丢失,新的pod如果使用了指向主机相同路径的hostPath卷,则新的pod就能够发现旧pod留下的文件和数据(前提,新pod能够被调度到和旧pod相同的节点)---- hostPath卷同host的生命周期,pod的生存与死亡同hostPath没有关系。
2)基于这种前提,因为卷的内容存储在特定节点的文件系统,所以pod被重新调度到其他节点时,就无法访问到原数据,hostPath卷, 不适合作为存储数据库数据的目录。hostPath卷通常用于尝试单节点集群中的持久化存储,仅当需要在节点上读取或写入系统文件时才会使用hostPath,不用做持久化跨pod的数据。
3. 持久卷PV/持久卷声明PVC
1)持久卷: pv,persistentVolume,不属于任何命名空间,和节点一样属于集群层面的资源,管理员通过k8s API Server创建pv时,需要告知k8s:容量需求、访问模式(RWO/ROX/RWX)、处理ov逻辑(pvc绑定删除后的逻辑)、存储类型、存储位置等属性。
2)持久卷声明: pvc,persistentVolumeClaim,pvc可以当做pod中的一个卷来使用,其他用户不能使用相同的持久卷pv,但可以通过删除pvc绑定来释放出pv。虽然pv不在特定的命名空间下创建,但pvc只能在特定的命名空间下创建,所以pvc和pv只能被同一个命名空间内的pod创建使用。
三. 搭建NFS
1)master上创建数据目录:/data/k8s/
mkdir -p /data/k8s/
2)master上安装配置 nfs
yum -y install nfs-utils rpcbind
3)master上设置权限共享目录
chmod 777 /data/k8s/
4)master上配置 nfs,nfs 的默认配置
vi /etc/exports
添加:
/data/k8s *(rw,sync,no_root_squash)
5)使配置生效
exportfs -a
6)master上启用 rpc 注册
systemctl start rpcbind.service
systemctl enable rpcbind
systemctl status rpcbind
执行结果:
7)master上启用nfs服务
systemctl start nfs.service
systemctl enable nfs
systemctl status nfs
执行结果:
8)master上确定rpc 和 nfs 已经关联
rpcinfo -p|grep nfs
执行结果:
9)查看挂在情况
showmount -e
四. 创建PV
1)创建nf-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /data/k8s
server: 192.168.214.132
- 执行
kubectl apply -f nf-pv.yaml
执行结果:
说明:
a. Capacity(存储能力):一个 PV 对象都要指定一个存储能力,通过 PV 的 capacity属性来设置,目前只支持存储空间的设置
b. AccessModes(访问模式):ReadWriteOnce(RWO)-- 读写权限,但是只能被单个节点挂载 ReadOnlyMany(ROX)–
只读权限,可以被多个节点挂载 ReadWriteMany(RWX)-- 读写权限,可以被多个节点挂载。
c. persistentVolumeReclaimPolicy(回收策略): PV 支持的策略有三种: Retain(保留),Recycle(回收),Delete(删除)。
目前只有 NFS 和 HostPath 两种类型支持回收策略。当然一般来说还是设置为 Retain
d. 状态: Available(可用) Bound(已绑定)Released(已释放)Failed(失败)
e. storageClassName 指定 PV 的 class 为 nfs。相当于为 PV 设置了一个分类,PVC 可以指定 class 申请相应 class 的 PV
五. 创建PVC
1) 创建nf-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-nfs
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nfs
2) 执行
kubectl apply -f nf-pvc.yaml
kubectl get pv
kubectl get pvc
六. 使用pvc
1) 创建nfs-pvc-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-pvc
spec:
selector:
matchLabels:
app: nfs-pvc
replicas: 1
template:
metadata:
labels:
app: nfs-pvc
spec:
containers:
- name: nginx
image: nginx:1.7.8
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumes:
- name: www
persistentVolumeClaim:
claimName: pvc-nfs #使用pvc
---
apiVersion: v1
kind: Service
metadata:
name: nfs-pvc
labels:
app: nfs-pvc
spec:
type: NodePort
ports:
- port: 80
targetPort: web
nodePort: 31179
selector:
app: nfs-pvc
2)页面访问
ps: 因为关联的nfs内容没有,所以直接403
3) 在nfs目录中添加index.html文件
4)访问页面
如果这时删除了PV和PVC,共享目录中的文件也同时被删除了,这跟设置的回收版本有关系,回收策略是 Recycle,PVC 给删除掉了,然后回收了数据。上次说的PV和PVC的各种策略一定要注意。不然一不小心就把数据搞丢了