前言:
在Kubernetes中,存储类(StorageClass)是一种用于定义持久卷(PersistentVolume)的动态供应的方式。它允许管理员配置不同类型的存储,以满足不同应用程序的需求,并且可以根据需要动态地创建PV。存储类为Pod提供了一种简单的方式来请求存储资源,而无需了解底层存储系统的细节。存储类定义了以下细节:
- Provisioner(供应程序):指定了存储提供商或插件,用于动态创建PV。当PVC请求与存储类绑定时,存储类会调用相应的供应程序来创建PV。常见的供应程序包括:kubernetes.io/aws-ebs、kubernetes.io/gce-pd(、kubernetes.io/azure-disk、kubernetes.io/glusterfs 等。
- Parameters (参数):可选字段,用于指定供应程序的配置参数。这些参数可以根据存储提供商的要求而变化,例如存储容量、性能配置、备份策略等。
- ReclaimPolicy(回收策略):指定了PV在被释放后的行为。常见的回收策略包括:Retain:保留PV,不进行任何操作。需要管理员手动处理释放后的PV。Delete:自动删除PV,并且清除底层存储资源。默认为Delete
StorageClass对象的名称很重要,是用户可以请求特定类的方式(Pvc请求资源时候PersistentVolumeClaim.spec.storageClassName下配置此名称)。 管理员在首次创建StorageClass对象时设置类的名称和其他参数,并且在创建对象后无法更新这些对象。管理员可以为不请求任何特定类绑定的PVC指定默认的StorageClass。
StorageClass其他字段
allowedTopologies:用于指定允许使用该存储类的节点拓扑约束。它允许管理员限制存储类可以被使用的节点的拓扑域(Topology)。在Kubernetes中,节点拓扑约束用于将 Pod 调度到特定的节点上,以满足不同的需求,例如数据本地性、可靠性、性能等。通过allowedTopologies字段,可以为存储类指定允许的节点拓扑约束,以确保存储资源被分配到特定的节点上。(指定你的存储资源只能在那些k8s节点上使用)
mountOptions:用于控制动态创建的持久卷(PersistentVolume)的挂载选项。它允许你指定一些特定的挂载选项,以满足你的需求。具体来说,mountOptions字段是一个字符串数组,其中包含要应用于动态创建的PV的挂载选项。这些选项将在PV被挂载到容器中时生效。例如,你可以指定 [“ro”, “soft”] 作为挂载选项,表示将 PV 以只读(read-only)模式挂载,并且采用软件方式(soft)进行挂载。需要注意的是,Kubernetes不会对mountOptions字段中的选项进行验证。如果指定的挂载选项无效,PV 的挂载将会失败。因此,在配置mountOptions时,请确保你提供的选项是有效的。
NFS资源的StorageClass
NFS供应商Github地址:https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
1、创建NFS的sa账户
该账户会在供应商服务中授权操作k8s资源。(不做注释以后再说)
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-stgc-delte
---
#对nfs-stgc-delete授权
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-provisioner-role
rules:
- 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"]
- apiGroups: [""]
resources: ["services", "endpoints"]
verbs: ["get"]
- apiGroups: ["extensions"]
resources: ["podsecuritypolicies"]
resourceNames: ["nfs-stgc-delte"]
verbs: ["use"]
---
#将nfs-stgc-delte用户绑定nfs-provisioner-role设置的权限
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-provisioner-binng
subjects:
- kind: ServiceAccount
name: nfs-stgc-delte
namespace: default
roleRef:
kind: ClusterRole
name: nfs-provisioner-role
apiGroup: rbac.authorization.k8s.io
---
#创建Role权限。ClusterRole适用于整个集群,而Role只适用于特定的命名空间。
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-nfs-role
rules:
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch"]
---
#将创建的Role权限绑定到nfs-stgc-delte
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-nfs-binding
subjects:
- kind: ServiceAccount
name: nfs-stgc-delte
namespace: default
roleRef:
kind: Role
name: leader-nfs-role
apiGroup: rbac.authorization.k8s.io
2、运行供应商商服务。
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
selector:
matchLabels:
app: nfs-client-provisioner
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
nodeSelector:
app: ng
serviceAccountName: nfs-stgc-delte
containers:
- name: nfs-client-provisioner
image: docker.io/eipwork/nfs-subdir-external-provisioner:v4.0.2
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: k8s-sigs.io/nfs-subdir-external-provisioner
- name: NFS_SERVER
value: 192.168.0.108
- name: NFS_PATH
value: /mnt/k8s
volumes:
- name: nfs-client-root
nfs:
server: 192.168.0.108
path: /mnt/k8s
在deployment.spec.template.spec.serviceAccountName下配置授权用户。修改镜像为docker.io/eipwork/nfs-subdir-external-provisioner:v4.0.2
运行服务查看:
[root@master yaml]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nfs-client-provisioner 1/1 1 1 84m
3、创建StorgaeClass对象
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-stgc-delete
namespace: default
allowVolumeExpansion: true
allowedTopologies:
- matchLabelExpressions:
- key: app
values:
- to
#mountOptions:
#- debug
parameters:
pathPattern: "${.PVC.namespace}/${.PVC.annotations.nfs.io/storage-path}"
onDelete: delete
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner
#官方给的NFS供应商
reclaimPolicy: Delete
volumeBindingMode: Immediate
配置节点约束,只允许资源在标签为app:to的节点上使用。配置reclaimPolicy为delete。
StorageClass回收策略:(StorageClass的回收策略优先级高。如果在PVC中也配置了回收策略在调用StorageClass资源后不生效。)
- Retain(保留):当PV被释放时,Kubernetes不会自动删除PV所关联的存储资源。PV将保留在集群中,不会被释放。这个选项适用于需要手动处理PV回收的情况,例如需要将PV再次关联到新的 PVC 上。
- Delete(删除):当PV被释放时,Kubernetes将自动删除PV所关联的存储资源。这个选项会立即释放存储资源,并且将其从集群中删除。这是最常见的回收策略,适用于大多数情况下。
- Recycle(回收):当PV被释放时,Kubernetes将尝试删除PV中的数据,但不会删除存储资源本身。这个选项通常用于一些本地存储类型,例如 HostPath,它会简单地删除 PV 中的数据,以便下次再次使用。(这个不是即将废弃的PVC回收策略)
volumeBindingMode:用于指定 PV(PersistentVolume)如何绑定到PVC。有两个参数:
- WaitForFirstConsumer:表示 PV 将等待第一个 PVC 请求并绑定到它之后才会被创建。这意味着 PV 只有在第一个 PVC 使用它之后才会被创建和绑定。这个选项通常用于动态创建的 PV,并且确保 PV 只在需要时才会被创建。
- Immediate:表示 PV 将立即被创建,无论是否有 PVC 请求。这意味着 PV 会立即被创建并且可以被任何 PVC 使用。这个选项通常用于静态创建的 PV,或者用于一些不需要等待 PVC 请求的存储系统。
- 默认情况下,如果未显式指定storageclass.volumeBindingMode 字段,它的值将是Immediate。
3、创建PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-pvc-storage
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 1Gi
storageClassName: nfs-stgc-delete
PersistentVolumeClaim.spec.storageClassName配置StorageClass.metadata.name。
查看PVC:
[root@master yaml]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nginx-pvc-storage Bound pvc-9c2fcf3c-1479-4f3d-a195-7e8aa5ff8b3d 1Gi RWX nfs-stgc-delete 37m
4、在Pod中使用PVC
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dy
labels:
web: nginx
namespace: default
annotations:
dac: " image version to v1.0"
spec:
minReadySeconds: 10
#新创建的Pod成为就绪状态之前,Deployment控制器等待的最短时间(秒数)。确保Pod中的业务程序能正常工作之前有做狗的时候完成初始化和准备工作。
paused: false
progressDeadlineSeconds: 60
#该字段用于指定部署操作的进度检查的超时时间(以秒为单位)。这个字段的作用是为了确保部署操作能够在指定的时间内完成,并在超时后进行相应的处理。
replicas: 4
revisionHistoryLimit: 5
#该用于指定要保留的 Deployment 版本历史记录的最大数量。Deployment 版本历史记录包含了过去创建的每个 Deployment 的详细信息,包括创建时间、更新时间、副本数量等。
#如果设置为 0,则不会保留任何历史记录;如果设置为负值,则表示将保留所有历史记录。
selector:
matchLabels:
ser: nginx-test
strategy:
#定义滚动更新策略
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
name: nginx
#namespeace
labels:
ser: nginx-test
spec:
nodeSelector:
app: to
hostname: nginx-dy
containers:
- image: docker.io/library/nginx:v1
name: nginx-dy
imagePullPolicy: IfNotPresent
ports:
- name: nginx-post
containerPort: 80
volumeMounts:
- name: nginx-pvc
mountPath: /home
readOnly: false
#为true为只读方式挂载
volumes:
- name: nginx-pvc
persistentVolumeClaim:
claimName: nginx-pvc-storage
修改Deployment.spec.template.spec.volumes下资源信息,创建Pod。