k8s存储介绍(六)StorangeClass
一、Kubernetes 存储类(StorageClass)详解
1. 什么是 StorageClass?
在 Kubernetes 中,StorageClass
(存储类)是一种用于动态创建 PersistentVolume
(PV)的资源对象。它允许管理员根据不同的存储需求创建不同的存储策略,用户只需要声明 PersistentVolumeClaim
(PVC)并指定 StorageClass
,Kubernetes 就能自动分配相应的存储。
2. 为什么需要 StorageClass?
在没有 StorageClass
的情况下,管理员需要手动创建 PersistentVolume
,并与 PersistentVolumeClaim
进行匹配。这种方式适用于静态存储,但在大规模集群或云环境下,动态创建存储更加灵活。因此,StorageClass
解决了以下问题:
-
自动化存储分配:无需手动创建 PV,而是由 Kubernetes 负责创建和管理。
-
支持不同的存储后端:适用于 AWS EBS、Google Persistent Disk、Azure Disk、NFS、Ceph 等多种存储方案。
-
提供不同的存储策略:支持不同的存储性能(高 IOPS、低延迟)、快照、备份等需求。
3. StorageClass 的关键字段
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-storage
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp2
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
主要字段解析:
-
provisioner
:指定存储供应商,例如 AWS EBS(kubernetes.io/aws-ebs
)、Google Cloud Persistent Disk(kubernetes.io/gce-pd
)等。 -
parameters
:存储类的参数,例如磁盘类型、性能级别等。 -
reclaimPolicy
(回收策略):定义存储释放后的行为。-
Delete
(删除):删除 PV 和底层存储。 -
Retain
(保留):数据仍然保留,需要手动清理。 -
Recycle
(回收):(已废弃)清理数据后重新使用。
-
-
volumeBindingMode
(卷绑定模式):-
Immediate
(立即绑定):PVC 创建时立即绑定。 -
WaitForFirstConsumer
(等待首个消费者):只有 Pod 使用 PVC 时才会绑定 PV,适用于多可用区调度。
-
-
allowVolumeExpansion
(允许扩容):是否允许存储动态扩展。
4. 常见存储供应商
存储后端 | Provisioner | 适用场景 |
---|---|---|
AWS EBS | kubernetes.io/aws-ebs | AWS 云环境,块存储 |
GCE PD | kubernetes.io/gce-pd | GCP 云存储 |
Azure Disk | kubernetes.io/azure-disk | Azure 云存储 |
NFS | kubernetes.io/nfs | 共享存储 |
Ceph | ceph.com/rbd | 分布式存储 |
5. PVC 使用 StorageClass 示例
创建 PVC 时使用 StorageClass
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: example-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: fast-storage
Pod 挂载 PVC 示例
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: app-container
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: storage
volumes:
- name: storage
persistentVolumeClaim:
claimName: example-pvc
6. StorageClass 的应用场景
-
自动化存储管理:减少手动创建 PV 的复杂性,适用于云环境。
-
多种存储策略:支持不同的存储性能需求,如 SSD、高吞吐磁盘等。
-
多可用区支持:结合
WaitForFirstConsumer
模式,提高存储调度灵活性。 -
动态扩展存储:支持 PVC 扩容,提高存储弹性。
7. 总结
-
StorageClass
允许 Kubernetes 动态创建 PV,简化存储管理。 -
适用于云存储、分布式存储和本地存储等多种场景。
-
通过
reclaimPolicy
、volumeBindingMode
和allowVolumeExpansion
提供灵活的存储策略。 -
在 CI/CD、数据库存储、日志存储等场景下广泛应用。
二、在 Kubernetes 中使用 NFS 作为存储类(StorageClass)
1. 部署 NFS 服务器与客户端
在 Kubernetes 集群的某个节点上安装 NFS 服务器。(但是在每个节点都要安装NFS客户端)
安装 NFS 服务器(以 Ubuntu 为例)
sudo apt update && sudo apt install -y nfs-kernel-server
sudo mkdir -p /mnt/nfs-share
sudo chmod 777 /mnt/nfs-share
sudo echo "/mnt/nfs-share *(rw,sync,no_root_squash,no_subtree_check)" | sudo tee -a /etc/exports
sudo exportfs -rav
sudo systemctl restart nfs-kernel-server
安装 NFS 客户端
sudo apt update && sudo apt install -y nfs-common
2. 创建 NFS StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-storage
provisioner: nfs-provisioner
parameters:
archiveOnDelete: "false"
3. 部署 NFS Provisioner(Dynamic Provisioning)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-provisioner
spec:
replicas: 1
selector:
matchLabels:
app: nfs-provisioner
template:
metadata:
labels:
app: nfs-provisioner
spec:
containers:
- name: nfs-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- mountPath: /persistentvolumes
name: nfs-volume
env:
- name: NFS_SERVER
value: "<NFS服务器IP>"
- name: NFS_PATH
value: "/mnt/nfs-share"
volumes:
- name: nfs-volume
nfs:
server: "<NFS服务器IP>"
path: "/mnt/nfs-share"
4. 创建 PersistentVolumeClaim (PVC)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
storageClassName: nfs-storage
5. 在 Pod 中挂载 PVC
apiVersion: v1
kind: Pod
metadata:
name: nfs-pod
spec:
containers:
- name: app-container
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: nfs-storage
volumes:
- name: nfs-storage
persistentVolumeClaim:
claimName: nfs-pvc
6. 验证 NFS 挂载是否成功
kubectl apply -f nfs-storageclass.yaml
kubectl apply -f nfs-provisioner.yaml
kubectl apply -f nfs-pvc.yaml
kubectl apply -f nfs-pod.yaml
kubectl get pods
kubectl exec -it nfs-pod -- df -h
如果成功,Pod 内 /usr/share/nginx/html
目录将会挂载到 NFS 服务器的 /mnt/nfs-share
,多个 Pod 可以共享此存储。