【K8s 精选】CKA - 存储
1 了解 StorageClass、persistentVolume 和 PersistentVolumeClaim
考点:了解 StorageClass、persistentVolume
1.1 StorageClass
# 样例1:存储后端是 AWS EBS
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: standard
# provisioner 制备器,用来决定使用哪个 CSI 插件,来创建 PV
# aws-ebs 表示 AWS EBS
provisioner: kubernetes.io/aws-ebs
# parameters 是由 provisioner 制备器,至少有 1 个字段 type
parameters:
type: gp2
# reclaimPolicy 回收策略:Delete 或者 Retain,默认是 Delete
reclaimPolicy: Retain
# allowVolumeExpansion 是否支持扩展
allowVolumeExpansion: true
# mountOptions 挂载选项
mountOptions:
- debug
# volumeBindingMode 卷绑定和动态制备的时候。
# Immediate 模式表示一旦创建了 PersistentVolumeClaim 也就完成了卷绑定和动态制备
# WaitForFirstConsumer 表示延迟 PersistentVolume 的绑定和制备,直到使用该 PersistentVolumeClaim 的 Pod 被创建
volumeBindingMode: Immediate
-------
# 样例1:存储后端是本地
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
1.2 PersistentVolume 和 PersistentVolumeClaim
PersistentVolume 和 PersistentVolumeClaim 的生命周期如下:
① 创建方式:PV 有静态创建、动态创建。
静态创建:管理员创建的 PV 带有真实存储的细节信息,可供用户直接使用。
![](https://img.haomeiwen.com/i21744606/0a72368edd85a311.png)
#### Persistent Volume example
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-local
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 200Mi
local:
path: /data/pv/disk
persistentVolumeReclaimPolicy: Retain
# PV 采用静态创建
volumeMode: Filesystem
--------
#### Persistent Volume Claim example
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-local
spec:
accessModes:
- ReadWriteOnce
# PV 采用静态创建
resources:
requests:
storage: 100Mi
动态创建:所有静态 PV 无法与 PVC 匹配,集群基于 StorageClass 为 PVC 创建 PV,即属性 storageClassName
相同的 PV 和 PVC 会自动绑定。
![](https://img.haomeiwen.com/i21744606/35c0a229d8f20022.png)
② 绑定:用户创建了带有特定存储容量和特定访问模式的 PVC 对象,接着匹配 PV,并将两者绑定在一起。
③ 使用:Pod 根据 PVC 找到所绑定的 PV,并为 Pod 挂载该劵。
④ 保护使用中的存储对象:确保仍被 Pod 使用的 PVC 及其所绑定的 PV 在系统中不会被删除。
⑤ 回收:PV 的回收策略有保留(Retain)、删除(Delete)。配置字段为 persistentVolumeReclaimPolicy
⑥ 预留 PV:PV 通过设置 claimRef
,确保该 PV 只能绑定指定的 PVC。
apiVersion: v1
kind: PersistentVolume
metadata:
name: foo-pv
spec:
# 此处须显式设置空字符串,否则会被设置为默认的 StorageClass,同时相当于为自身禁止使用动态创建的卷
storageClassName: ""
claimRef:
# 确保该 PV 只能绑定指定的 PVC,即 foo-pvc
name: foo-pvc
namespace: foo
...
⑦ 扩充 PVC:将 PVC 的 allowVolumeExpansion
设置为 true,可以扩充该 PVC,即可以编辑 PVC 来设置一个更大的尺寸值。
PersistentVolume
考点:
① 了解持久卷 PersistentVolume
② 了解卷模式、访问模式和卷的回收策略
持久卷(PersistentVolume,PV)是集群中的一块存储。 PersistentVolume 的名称必须是合法的 DNS 子域名。持久卷是集群资源,就像节点也是集群资源一样
PersistentVolume 的主要配置如下:
① 容量:PV 有确定的存储容量,使用 capacity
属性来设置的。 参考 Kubernetes 资源模型(Resource Model)
② 卷模式:针对 PV 持久卷,支持两种卷模式 volumeModes
:Filesystem 和 Block,默认 Filesystem
volumeMode
属性设置为 Filesystem 的卷会被 Pod 挂载(Mount) 到某个目录。
③ 访问模式:每个 PV 卷的访问模式都会设置为对应卷所支持的模式值,例如,NFS 可以支持多个读写客户。
ReadWriteOnce:卷可以被同一个节点的多个 Pod 以读写方式访问。
ReadOnlyMany:卷可以被多个节点以只读方式挂载。
ReadWriteMany:卷可以被多个节点以读写方式挂载。
ReadWriteOncePod:卷只能被单个 Pod 以读写方式挂载。
④ 所属 storageClass:PV 属于某个类(Class),通过将其 storageClassName
属性设置为某个 StorageClass 的名称来指定。
⑤ 回收策略:通过 persistentVolumeReclaimPolicy
属性设置回收策略,Retain 表示手动回收,Recycle 表示基本擦除 (rm -rf /thevolume/*),Delete 表示直接删除。
目前,仅 NFS 和 HostPath 支持回收(Recycle)。 AWS EBS、GCE PD、Azure Disk 和 Cinder 卷都支持删除(Delete)。
⑥ 节点亲和性:使用这些卷的 Pod 只会被调度到节点亲和性规则所选择的节点上执行。 要设置节点亲和性,配置 PV 卷 .spec 中的 nodeAffinity
下面以本地存储 HostPath 为例,编辑 PersistentVolume 的配置文件:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: sc-local-host
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
--------
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-local-host
labels:
type: local
spec:
storageClassName: sc-local-host
volumeMode: Filesystem
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
hostPath:
path: "/mnt/data"
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: pv_local_host_node
operator: In
values:
- "yes"
PersistentVolumeClaim
考点:了解持久卷声明 PersistentVolumeClaim
持久卷声明(PersistentVolumeClaim,PVC)表达的是用户对存储的请求。
PersistentVolumeClaim 的主要配置如下:
① 容量:PVC 有确定的存储容量,使用 capacity
属性来设置的。 参考 Kubernetes 资源模型(Resource Model)
② 卷模式:针对 PVC,支持两种卷模式 volumeModes
:Filesystem 和 Block,默认 Filesystem
volumeMode
属性设置为 Filesystem 的卷会被 Pod 挂载(Mount) 到某个目录。
③ 访问模式:每个 PVC 的访问模式都会设置为对应 PV 所支持的模式值。
④ 所属 storageClass:PVC 属于某个类(Class),通过将其 storageClassName
属性设置为某个 StorageClass 的名称来指定。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-local-host
namespace: ns-test
spec:
storageClassName: sc-local-host
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
# 只有 PV 的 label 带有 type: local,该 PV 才能绑定到此 PVC
selector:
matchLabels:
type: local
2 配置 Pod 以使用卷进行存储
考点:了解应用程序如何配置持久化存储
#### Storage Class example
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: sc-local-host
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain
# WaitForFirstConsumer 表示延迟 PersistentVolume 的绑定和制备,直到使用该 PersistentVolumeClaim 的 Pod 被创建
volumeBindingMode: WaitForFirstConsumer
--------
#### Persistent Volume example
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-local
spec:
accessModes:
- ReadWriteOnce
capacity:
storage: 200Mi
local:
path: /data/pv/disk
persistentVolumeReclaimPolicy: Retain
# PV 采用动态创建,即通过 storageClassName 自动绑定 PV 和 PVC
storageClassName: sc-local-host
volumeMode: Filesystem
--------
#### Persistent Volume Claim example
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-local
spec:
accessModes:
- ReadWriteOnce
# PV 采用动态创建,即通过 storageClassName 自动绑定 PV 和 PVC
storageClassName: sc-local-host
resources:
requests:
storage: 100Mi
--------
#### Pod using the pvc
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
name: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: local-persistent-storage
mountPath: /var/nginx/data
volumes:
- name: local-persistent-storage
persistentVolumeClaim:
claimName: pvc-local