华子目录
- 存储类`storageclass`
- 存储类的作用
- 一、定义存储特性
- 二、`动态卷`供应
- 三、管理多种存储类型
- 四、抽象存储细节
- 五、支持存储扩展和回收策略
- 六、应用场景
- `StorageClass`说明
- `StorageClass`的属性
- 存储分配器`NFS Client Provisioner`
- 部署`NFS Client Provisioner`
- 创建`sa`并授权
存储类storageclass
- 官网:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
在Kubernetes
中,存储类
(StorageClass
)是一种资源对象
,它描述了集群
中的存储类型
“分类
”,并用于定义存储卷的配置模板。其作用主要体现在以下几个方面:
存储类的作用
一、定义存储特性
StorageClass
为管理员
提供了一种描述存储
的方式,允许他们定义特定
的存储提供者
(如AWS EBS
、Azure Disk
、GCE Persistent Disk
等)、预配置
的策略
(如备份策略
、加密
)、IO性能
、访问模式
等。这使得用户能够以抽象
的方式使用这些存储
,而无需关心后端
存储的具体实现细节。
二、动态卷
供应
当用户在创建持久卷声明
(PersistentVolumeClaim
,PVC
)时,只需要指定StorageClassName
,Kubernetes
即可根据这个StorageClass
自动创建持久卷
(PersistentVolume
,PV
)及底层存储
。这大大减少
了手动
创建并维护PV
的工作量
,提高
了存储管理
的灵活性
和效率
。
三、管理多种存储类型
在Kubernetes
集群中,可能需要连接到不同类型
的存储
,如SSD
和HDD
等。StorageClass
可以帮助管理这些存储选项
,通过定义不同
的StorageClass
来区分不同类型
的存储
,从而满足应用程序
对存储性能
、容量
等方面的不同需求
。
四、抽象存储细节
通过使用StorageClass
,用户不需要
了解后端
存储的具体实现细节
,只需要知道不同
的StorageClass名称
及其提供
的存储类型
和性能
。这使得存储
管理更加简单
和直观
,同时也提高了系统的可扩展性
和可维护性
。
五、支持存储扩展和回收策略
StorageClass
还支持存储卷
的扩展
和回收策略
的配置
。例如,可以设置是否允许卷扩展
,以及当PVC被删除
时PV
的回收策略
(如Delete
或Retain
)。这些配置
使得存储管理
更加灵活
和可控
。
六、应用场景
StorageClass
在Kubernetes
中的应用场景非常广泛
,特别是在需要持久化存储
的应用程序
中。例如,在部署
需要存储数据
的集群
时(如Elasticsearch
集群),每个节点
都需要存储数据
,而传统
的PV
只能挂载
到一个Pod
上。通过定义StorageClass
并配合StatefulSet控制器
,可以为每个
有状态
的Pod
自动创建PVC
并进行挂载
,从而实现数据的持久化存储
。
StorageClass
说明
StorageClass
提供了一种描述存储类
(class
)的方法
,不同的class
可能会映射
到不同的服务质量
等级和备份策略
或其他策略
等。- 每个
StorageClass
都包含provisioner
、parameters
和reclaimPolicy
字段, 这些字段
会在StorageClass
需要动态分配PersistentVolume
时会使用到
StorageClass
的属性
属性
说明:https://kubernetes.io/zh/docs/concepts/storage/storage-classes/Provisioner
(存储分配器
):用来决定
使用哪个卷
插件分配PV
,该字段
必须指定。可以指定内部分配器
,也可以指定外部分配器
。外部分配器
的代码地址
为:kubernetes-incubator/external-storage
,其中包括NFS
和Ceph
等Reclaim Policy
(回收策略
):通过reclaimPolicy
字段指定创建的Persistent Volume
的回收策略
,回收策略
包括:Delete
或者Retain
,没有指定
默认为Delete
存储分配器NFS Client Provisioner
源码地址
:https://github.com/kubernetes-sigs/nfs-subdir-external-provisionerNFS Client Provisioner
是一个automatic provisioner
,使用NFS
作为存储
,自动
创建PV
和对应
的PVC
,本身
不提供NFS存储
,需要外部
先有一套NFS存储服务
PV
以${namespace}-${pvcName}-${pvName}
的命名格式
提供(在NFS服务器上
)PV
回收的时候以archieved-${namespace}-${pvcName}-${pvName}
的命名格式
(在NFS服务器
上)
部署NFS Client Provisioner
创建sa
并授权
[root@k8s-master volume]# vim rbac.yml
apiVersion: v1
kind: Namespace
metadata:name: nfs-client-provisioner
---
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisionernamespace: nfs-client-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runner
rules:- apiGroups: [""]resources: ["nodes"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: nfs-client-provisioner
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisionernamespace: nfs-client-provisioner
rules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisionernamespace: nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: nfs-client-provisioner
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io
[root@k8s-master volume]# kubectl apply -f rbac.yml
namespace/nfs-client-provisioner created
serviceaccount/nfs-client-provisioner created
clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created
role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
[root@k8s-master volume]# kubectl -n nfs-client-provisioner get sa
NAME SECRETS AGE
default 0 27s
nfs-client-provisioner 0 27s
[root@k8s-master volume]# vim deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionerlabels:app: nfs-client-provisionernamespace: nfs-client-provisioner
spec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: sig-storage/nfs-subdir-external-provisioner:v4.0.2volumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: k8s-sigs.io/nfs-subdir-external-provisioner- name: NFS_SERVERvalue: 172.25.254.250- name: NFS_PATHvalue: /nfsdatavolumes:- name: nfs-client-rootnfs:server: 172.25.254.250path: /nfsdata
[root@k8s-master volume]# docker load -i nfs-subdir-external-provisioner-4.0.2.tar[root@k8s-master volume]# docker tag registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2 harbor.huazi.org/sig-storage/nfs-subdir-external-provisioner:v4.0.2
[root@k8s-master volume]# docker push harbor.huazi.org/sig-storage/nfs-subdir-external-provisioner:v4.0.2
[root@k8s-master volume]# kubectl apply -f deployment.yml
deployment.apps/nfs-client-provisioner created
[root@k8s-master volume]# kubectl -n nfs-client-provisioner get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
nfs-client-provisioner 1/1 1 1 27s
创建存储类
[root@k8s-master volume]# vim class.yml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
parameters:archiveOnDelete: "false"
[root@k8s-master volume]# kubectl apply -f class.yml
storageclass.storage.k8s.io/nfs-client created
[root@k8s-master volume]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-client k8s-sigs.io/nfs-subdir-external-provisioner Delete Immediate false 34s
创建pvc
[root@k8s-master volume]# vim pvc.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-claim
spec:storageClassName: nfs-clientaccessModes:- ReadWriteManyresources:requests:storage: 1G
[root@k8s-master volume]# kubectl apply -f pvc.yml
persistentvolumeclaim/test-claim created
[root@k8s-master volume]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
test-claim Bound pvc-a164d606-732f-4005-a6a6-4798fdbc75f4 1G RWX nfs-client <unset> 90s
#在nfs服务器上可以看到
[root@harbor ~]# cd /nfsdata/
[root@harbor nfsdata]# ls
default-test-claim-pvc-a164d606-732f-4005-a6a6-4798fdbc75f4
#当我们删掉pvc后
[root@k8s-master volume]# kubectl delete -f pvc.yml
persistentvolumeclaim "test-claim" deleted#再查看nfs服务器,发现pv已经被自动删除了
[root@harbor nfsdata]# ls
[root@harbor nfsdata]#
[root@k8s-master volume]# kubectl apply -f pvc.yml
persistentvolumeclaim/test-claim created
创建测试pod
[root@k8s-master volume]# vim pod.yml
kind: Pod
apiVersion: v1
metadata:name: test-pod
spec:containers:- name: test-podimage: busyboxcommand:- "/bin/sh"args:- "-c"- "touch /mnt/SUCCESS && exit 0 || exit 1"volumeMounts:- name: nfs-pvcmountPath: "/mnt"restartPolicy: "Never"volumes:- name: nfs-pvcpersistentVolumeClaim:claimName: test-claim
[root@k8s-master volume]# kubectl apply -f pod.yml
pod/test-pod created
[root@k8s-master volume]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-pod 0/1 Completed 0 38s 10.244.2.38 k8s-node2.org <none> <none>
[root@harbor nfsdata]# ls
default-test-claim-pvc-4460dd22-b4d8-4192-b249-3b687dacdf39
[root@harbor nfsdata]# cd default-test-claim-pvc-4460dd22-b4d8-4192-b249-3b687dacdf39/
[root@harbor default-test-claim-pvc-4460dd22-b4d8-4192-b249-3b687dacdf39]# ls
SUCCESS
[root@harbor default-test-claim-pvc-4460dd22-b4d8-4192-b249-3b687dacdf39]# ll
总用量 0
-rw-r--r-- 1 root root 0 11月 4 22:36 SUCCESS