K8S存储管理volume、PV/PVC

一、本章概述

K8S存储管理按照发展的历程,涉及到有Volume、PV/PVC、StorageClass,Volume是最早提出的存储卷,主要解决容器和数据存储的依赖关系,抽象底层驱动以及支持不同的存储类型,使用Voume需要了解底层存储细节,因此提出了PV系统/运维,Pnginx服务器ersistent Volume是由k8s管理员定义的存储单元,应用端使用PersistentVolumeClaims声明去调用PV存储,进一步抽象了底层存储;随着PV数量的增加,系统运维工作内容管理员需要不停的定义PVlinux重启命令数量,衍生了通过StorageClass动态生成PV,StorageClass通过PVC中声明存储的容量,会调用底层的提供商生成PV。本文介绍Volume的使用,下篇文章介绍PV,PVC和StorageCnginx重启lass。

  • Volume 存储卷,独立于容器,后端和不同的存储驱动对接
  • PV Persistent Volume持久化存储卷,和node类似,是一种集群资源,由管理员定义,对接不同的存储
  • PVC Pe数据恢复rsistentVolumeClaims持久化存储声明,和pod类似,作为PV的使用者
  • St2的负二次方orageClass 动态存储类型,分为静态和动态两种类型,通过在PVC中定义存储类型,自动创建所需PV

二、存储的概述

kublinuxernetes容器中的数据是临时的nginx是干嘛用的,即当重启重启或crash后容器的数据将会丢失,此外容器之间有共享存储的需求,所以kubernetes中提供了vonginx是干嘛用的lume存储的抽象,volume后端能够支持多种不同的plugin驱动,通过.spec.volumes中定义一个存储,然后在容器中.spec.containers.volumeMounts调用,最终在容器内部以目录的形式呈现。

kubernetes内置能支持多种不同的驱动类型,大体上可以分为四种类linux虚拟机型:

  • 公/私有云驱动接口,如aws数据库ElasticBlockSto数据分析re实现与aws EBS集成
  • nginx启动命令源存储驱动接口数据分析,如ceph rbd,实现与ceph rb块存储对接
  • 本地临系统运维是干嘛的时存储,如hostPath
  • kubernetes对象API驱动接口,实现其他对象调用,如configmap,每种存储支持不同2dfan的驱动

三、本地临时linux必学的60个命令存储

本地临时存储包括hostPath、emptyDir等。


3.1、emptyDir临时存储


emptyDir是一种临时存储,pod创建的时候会在node节点上为容器申2的10次方请一个临时的目录,跟随容器的生命周期,如容器删除,emptyD数据恢复ir定义的临时存储空间也会随数据库之删除,容器发生意外nginx面试题crash则不受影响,同时如2的n次方果容器86" target="_blank">发生了迁移系统运维工程师,其上的数据也会丢失,emnginx面试题ptyDir一般用于测试,或者缓存场景。​​注意:一个容器崩溃2的大写了不会导致数据的丢失,因为容器的崩溃并不移除pod.linux

​emptyDir​​ 的一些用途:

  • 缓存空间,例如基于磁盘的归并排序。
  • 数据耗时较长的计算任务提nginx是什么意思供检查点,以便任务能方便地从崩溃前状态恢复执行。
  • 在 Web 服务器容器服务数据时,保存内容管理器容器获取2d的文件。
[root@k8s-master pv]# cat emptydir.yaml 
apiVersion: v1
kind: Pod
metadata:
name: test-pod-emptydir
spec:
containers:
- image: busybox:1.27
name: test-container
command: ["/bin/sh","-c","sleep 600"]
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {}
[root@k8s-master pv]# kubectl apply -f emptydir.yaml
pod/test-pod-emptydir created
[root@k8s-master pv]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-deploy-786f88884c-rrgkb 1/1 Running 0 9d
nginx-deployment-644898db96-dk5jj 1/1 Running 0 9d
nginx-deployment-644898db96-wjpk6 1/1 Running 0 9d
test-pod-emptydir 1/1 Running 0 2m26s
[root@k8s-master pv]# kubectl exec -it pod/test-pod-emptydir sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # df -h |grep cache
50.0G 38.6G 11.3G 77% /cache
/ # cd /cache/
/cache # ls
/cache # echo 2222222 > a.txt
/cache #
/cache # cat a.txt
2222222

创建文件的路径可linux必学的60个命令以通过如下步骤进行查2的大写找。首先查找改pod所在的node,然后登陆这台node,进行grep

1、查pod所在的node
kubectl get pod -owide
test-pod-emptydir 1/1 Running 1 14m 10.244.3.108 k8s-node1 <none> <none>
2、改node进行查找容器
[root@k8s-node1 ~]# docker ps |grep test-container
10617cb2dfc8 busybox "/bin/sh -c 'sleep 6…" 7 minutes ago Up 7 minutes k8s_test-container_test-pod-emptydir_default_e5b3fa2e-3025-4651-9ab1-16bfd8062deb_0
3、有改容器名进行搜索相关的路径
[root@k8s-node1 ~]# docker inspect k8s_test-container_test-pod-emptydir_default_e5b3fa2e-3025-4651-9ab1-16bfd8062deb_0|grep /cache
"/var/lib/kubelet/pods/e5b3fa2e-3025-4651-9ab1-16bfd8062deb/volumes/kubernetes.io~empty-dir/cache-volume:/cache",
"Source": "/var/lib/kubelet/pods/e5b3fa2e-3025-4651-9ab1-16bfd8062deb/volumes/kubernetes.io~empty-dir/cache-volume",
"Destination": "/cache",
4、查看该文件的内容
[root@k8s-node1 ~]# cat /var/lib/kubelet/pods/e5b3fa2e-3025-4651-9ab1-16bfd8062deb/volumes/kubernetes.io~empty-dir/cache-volume/a.txt
2222222

备注:当删除完这个pod时,这个文件也会自动删除的。


3.2、hostPathh主机存储


​hos系统运维工作内容tPathlinux系统​ 卷能将node宿系统运维工作内容主机节点文件系统上的文件或目录挂载到您的 Pod 中。例如,​​hostPath​​ 的一些用法有:

  • 运行一个需要访问 Docker 引擎内部机制的容器;请使用 hostPath 挂载 /var/lib/docker 路径。
  • 在容器中运行 cAdvisor 时,以 hostPath 方式挂载 /sys
  • 允许 Pod 指定给定的 hostPa2的大写th 在运行 Pod 之前是否应该存在,是否应该创建以及应该以什么方式存在。

除了必需的 ​​path​​ 属性之外,用户可以选择性地为 ​​hostPath​​ 卷指定 ​​type​​。支持的 ​​type​系统/运维​ 值如下:

无法复制加载中的内容

当使用这种类型的linux命令卷时要小心,因为:

  • 具有相同配置(例如从 podTemplate 创建)的多个 Pod 会由于节点上文件的不同而在不同节点上有不同的行为。
  • linux重启命令 Kubernetes 按照计划添加资源感知的调度时,这类调度机制将无法考虑由 hostPath 使用的资源。
  • 基础主机上创建的文件或目录只能由 root 用户写入。您需2的负一次方等于多少要在特权容器中以 root 身份运行进程,或者修改主2的大写机上的文件权限以便容器能系统/运维够写入 ho2的大写stPath 卷。
[root@k8s-master pv]# cat  hostpaty.yml 
apiVersion: v1
kind: Pod
metadata:
name: test-pod
spec:
containers:
- image: nginx:1.16
name: test-container
volumeMounts:
- mountPath: /test-pod
name: test-volume
volumes:
- name: test-volume
hostPath:
path: /data
type: Directory

创建共享本机nginx是什么意思目录

[root@k8s-master pv]# kubectl apply -f hostpaty.yml 
pod/test-pod created
[root@k8s-master pv]# kubectl exec -it pod/test-pod -- sh
# df -h |grep /test-pod
/dev/mapper/centos-root 50G 39G 12G 78% /test-pod
###进入对应的节点
[root@k8s-node1 data]# cat /data/1.log
Sat Apr 30 17:28:40 CST 2022
# echo 3333 >> 1.log
# exit
[root@k8s-master pv]# kubectl exec test-pod -ti -- cat /test-pod/1.log
Sat Apr 30 17:28:40 CST 2022
3333

删除这个pod时,文件不会删除掉linux系统,还要保存到node上。

四、PV和PVC

PV 的全称是:​​PersistentVolume(持久化卷)​​,是对底层的共享存linux必学的60个命令储的一种抽象,PV 由管理员进行创建和配置,它和具体的2的n次方底层的共享存储技术的实现方式有关,比如 Cnginx配置eph、GlusterFS、NFS 等,都是通过插件机制完成与共享存储的对接。

PVC 的全称是:​​PersistentVolumeClnginx怎么读aim(持久化卷声明)​​,PVC 是用户存储的一种声明,PVC 和 Pod 比较类似,Pod 消耗的是节点,PVC 消耗的是 PV 资源,Pod 可以请数据废土求 CPU 和内存,而2dfan PVC 可以请求特定的存储空间和访问模式。对于真正使用存储的用户不需要关心底层的存储实现细节,只需要直接使用 PVC 即可。

4.1、生命周期


PVnginx反向代理是集群中的资源。PVnginx是干嘛用的C是对这些资数据废土源的请求,也是对资源的索赔检查。 PV和PVC之间的相互作用遵循这个生命周期:​​Provisioning ——-> Binding ——–>U数据透视表sing——>Releasing——>Recycling​

4.1.1、Provisioning

这里有两种PV的提供方式:静态或者动态。

  • Sta数据分析师tic:linux集群管理员创建多个PV。 它们携带可供集群用户使用的真实存储的详细信息。 它们存在于Kubernetes API中,可用于消费。
  • Dynamic:当nginx配置管理员创建的静态PV都不匹配用户的PersistentlinuxVolumeClaim时,集群可能会linux命令尝试为PVC动态配置卷。 此配置基于StorageClas2的大写ses:PVC系统运维是干嘛的必须请求一个类,并且管理员必须已创建并配置该类才能进行动态配置。 要求该类的声明有效地为自己禁用动态配置

4.1.linux命令2、Binding绑定

在动态配置的linux虚拟机情况下,用户nginx面试题创建或已经创系统/运维建了具有特定数量的存储请求和特2d定访问模式的PersistentVolumeClaim。 主机中的控制回路监视2的10次方新的PVC,找到匹配的Plinux虚拟机V(如果可能),并将它们nginx是什么意思绑定在一起。 如果为新的PVC动态配置PV,则循环将始终将该PV绑定到数据漫游是什么意思PVC。 否则,用户总是至数据漫游是什么意思少得到他们要求的内容,但是卷可能超出了要求。 一旦绑定,PersistentVolumeClaim绑定是排他的,不管用于系统运维主要做什么绑定它们的模式。

如果匹配的卷不存在,PVC将保持无限期。 随着匹配卷变得系统运维主要做什么可用,PVC将被绑定。 例nginx如,提供许多50Gi PV的集群将不匹配要求100Gi的PVC。 当集群中添加100Gi PV时,可以绑定PVC。

PVC 保护的目的是确保由 pod 正在使用的 PVC 不会从系统中移除,因为如果被移除的话可能会导linux必学的60个命令致数据丢失 当启用PVC 保护 alpha 功能时,如果用户删除了一个 pod 正在使用的 PVC,则该 PVC 不会被立即删除。PVC 的 删除将被推迟,直到 PVC 不再被任何 pod 使用。

4.2、PV访问模式

​PersistentVolume​​可以以资源提供数据结构者支持的任何方式挂载到主机上。例如,NlinuxFS 可以支持多个linux系统安装读/写客户端,但特定的 NFS PV 可能 以只读方式导出2的n次方到服务器上。每个 PV 都有一套自己的用来描述特定功能的访问模式。

  • ReadWriteOnce——该卷可以被单个节点以读/写模式linux创建文件挂载
  • ReadOnlyMany——该卷可以被多个节点以只读模式挂载
  • ReadWriteMany——该卷可以被多个节点以读/写模式挂载
  • 在命令行中,访问模式缩写为:
  • RWO - ReadWriteOnce
  • ROX - ReadOnlyMany
  • RWX - ReadWriteMany

下表是一些常用的 Volume 插件支持的访问模式linux系统

无法复制加载中的内容

4.3、回收策略Reclaiminginx反向代理ng

  • Retain(保留):手动回收
  • Recycle(回收):基本擦除( rm -rf /thevolume/* )
  • Delete(删除):关联的存储资产(例如 AWS EBS、GCE PD、Az系统运维主要做什么ure Disk 和 Op2的10次方等于多少enStack Cinder 卷) 将被删除
  • 当前,只有 NFS 和 HostPath 支持回收策略。AWS EBS、GCE PD、Azure Disk 和 Cinder 卷支持删除策略nginx配置

4.4、状态

卷可以处于以下的某种状态:

  • Avlinux虚拟机ailable(可用):一块空闲资源还没有被任何声明绑定
  • Bound(已绑定):卷已经被声明绑定
  • Released(已释放):声明被删除,但是资源还未系统运维是干嘛的被集群重新声明
  • Failed(失败):该卷的自动回收失败 命令行会显示绑定到 PV 的 PVC 的名称

4.5、hostPath实例演示


4.5.1、创建PV

[root@k8s-master pv]# cat pv-volume.yml 
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 50Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/home/data/pv"


[root@k8s-master pv]# kubectl apply -f pv-volume.yml
persistentvolume/task-pv-volume created
[root@k8s-master pv]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
task-pv-volume 50Gi RWO Retain Available manual 8s

可以看到这个PV为50G,访问模式为RWO,回收的策略Retain,目前的STATUS为可用状态。

4.5.2nginx是什么意思、创建Pnginx是干嘛用的VC

[root@k8s-master pv]# cat pvc-volume.yml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
[root@k8s-master pv]# kubectl apply -f pvc-volume.yml
persistentvolumeclaim/pvc-claim created
[root@k8s-master pv]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-claim Bound task-pv-volume 50Gi RWO manual 11s
[root@k8s-master pv]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-claim Bound task-pv-volume 50Gi RWO manual 21s

4.5.3、创建POD

[root@k8s-master pv]# cat pv-pod.yml 
apiVersion: v1
kind: Pod
metadata:
name: task-pv-pod
spec:
volumes:
- name: pv-storage
persistentVolumeClaim:
claimName: pvc-claim
containers:
- name: task-pv-container
image: nginx:1.7.9
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: pv-storage
nodeSelector:
kubernetes.io/hostname: k8s-node2
[root@k8s-master pv]# kubectl apply -f pv-pod.yml
pod/task-pv-pod created
[root@k8s-master pv]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-deploy-786f88884c-rrgkb 1/1 Running 0 9d
nginx-deployment-644898db96-dk5jj 1/1 Running 0 9d
nginx-deployment-644898db96-wjpk6 1/1 Running 0 9d
task-pv-pod 1/1 Running 0 8s

注意,创建的PV是在master上,目录/home/data/pv下,但pod被调度到node2上,通过这样来访问下:

[root@k8s-master data]# curl 10.244.2.88
this is node2
##在node2上做如下修改
[root@k8s-node2 ~]# date >> /home/data/pv/index.html
[root@k8s-node2 ~]# cat /home/data/pv/index.html
this is node2
Sat Apr 30 18:58:06 CST 2022
###master节点这样访问
[root@k8s-master data]# kubectl exec task-pv-pod -- ls -l /usr/share/nginx/html
total 4
-rw-r--r-- 1 root root 14 Apr 30 10:54 index.html

创建成功系统/运维之后,可以看到一个curl 与 ca2dfant出现的内容不一样。POD里面的的文件内容是node2nginx服务器上面的,而不是master节点上面的。所以hostPathnginx面试题只能调度到自己的机器上。