部署NFS版StorageClass存儲類
- NFS版PV動態供給StorageClass(存儲類)
- 基于NFS實現動態供應
- 下載`NFS存儲類資源清單`
- 部署NFS服務器
- 為StorageClass(存儲類)創建所需的RBAC
- 部署nfs-client-provisioner的deployment
- 創建StorageClass
- 使用存儲類創建PVC
NFS版PV動態供給StorageClass(存儲類)
存儲類
的好處之一便是支持PV的動態供給
,它甚至可以直接被視作為PV的創建模版,用戶用到持久性存儲時,需要通過創建PVC
來綁定匹配的PV,此類操作需求較大,或者當管理員手動創建的PV無法滿足PVC的所有需求時,系統按PVC的需求標準動態創建適配的PV會為存儲管理帶來極大的靈活性,不過僅那些屬于StorageClass
的PVC
和PV
才能產生綁定關系
,即沒有指定StorageClass
的PVC
只能綁定同類的PV
。存儲類對象
的名稱至關重要
,它是用戶調用的標識,創建存儲類對象時,除了名稱之外,還需要為其定義三個關鍵字段。provisioner(供應者)
、parameter(參數)
和reclaimPolicy(回收策略)
。- 所以kubernetes提供了一種可以
動態分配
的工作機制,可用自動創建PV
,該機制依賴于StorageClass
的API
,將某個存儲節點劃分1T給kubernetes使用,當用戶申請5Gi的PVC時,會自動從這1T的存儲空間去創建一個5Gi的PV,而后自動與之進行關聯綁定。 動態PV供給
的啟用需要事先創建一個存儲類,不同的Provisoner(供應者)
的創建方法各有不同,并非所有的存儲卷插件都由Kubernetes內建支持PV動態供給。
基于NFS實現動態供應
參考: https://www.cnblogs.com/xunweidezui/p/16930975.html
由于kubernetes
內部不包含NFS驅動
,所以需要使用外部驅動;
nfs-subdir-external-provisioner
是一個自動供應器
,它使用NFS服務端
來支持動態供應
。
NFS-subdir-external- provisioner
實例負責監視PersistentVolumeClaims(PVC)
請求StorageClass
,并自動為它們創建NFS所支持的PresistentVolumes(PV)
。
下載NFS存儲類資源清單
NFS版StorageClass插件
GitHub項目地址: https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
部署NFS Provisioner參考
免積分下載部署yaml
部署NFS服務器
https://blog.csdn.net/omaidb/article/details/120926883
為StorageClass(存儲類)創建所需的RBAC
nfs-rbac.yaml
示例
---
# 創建命名空間
apiVersion: v1
kind: Namespace
metadata:name: storage
---
# 創建服務賬號
kind: ServiceAccount
apiVersion: v1
metadata:# 服務賬號名name: nfs-client-provisioner# 替換為deployment的命名空間namespace: storage
---
# 創建集群角色
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:# 集群角色名name: nfs-client-provisioner-runner
# 添加集群角色權限
rules:- apiGroups: [""]# 向該角色增加對PV執行查看,創建,刪除 權限resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]# 向該角色增加對PVC執行查看,更新 權限resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]# 向該角色增加對動態存儲類執行查看 權限resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]# 向該角色增加對events(集群事件)進行 創建 更新 補丁 權限resources: ["events"]verbs: ["create", "update", "patch"]
---
# 創建集群角色綁定
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:# 角色綁定的名稱name: run-nfs-client-provisioner
subjects:# 綁定服務賬號- kind: ServiceAccount# 要綁定的服務賬號名--就是第一個yaml創建的saname: nfs-client-provisioner# 綁定到哪個命名空間namespace: storage
roleRef:kind: ClusterRole# 要綁定的集群角色名--就是第2個yaml創建的集群角色name: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
# 創建role
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:# 創建的角色名name: leader-locking-nfs-client-provisioner
rules:- apiGroups: [""]# 向該角色增加對endpoint 查看 創建 更新 補丁 的權限resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
# 創建role綁定
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:# 該角色綁定的名字name: leader-locking-nfs-client-provisioner
subjects:- kind: ServiceAccount# 要綁定的服務賬號名--就是第一個yaml創建的服務賬號name: nfs-client-provisioner# 替換為deployment要部署到的命名空間# 綁定到storage命名空間namespace: storage
roleRef:kind: Role# 要綁定的角色名稱,就是上一個yaml創建的rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io
# 清理rbac授權
kubectl delete -f nfs-rbac.yaml -n kube-system# 執行rbac授權
kubectl apply -f nfs-rbac.yaml
部署nfs-client-provisioner的deployment
apiVersion: apps/v1
kind: Deployment
metadata:# Deployment名name: nfs-client-provisionerlabels:app: nfs-client-provisioner# 部署到哪個命名空間namespace: storage
spec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:# 使用哪個服務賬號serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisioner# image: lizhenliang/nfs-subdir-external-provisioner:v4.0.1image: k8s.gcr.io/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_SERVER# NFS服務器地址value: 192.168.31.63- name: NFS_PATH# NFS服務器share目錄value: /ifs/kubernetesvolumes:- name: nfs-client-rootnfs:# NFS服務器地址server: 192.168.31.63# NFS服務器share目錄path: /ifs/kubernetes
創建StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-client
provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # 或選擇其他名稱,必須與部署的環境 PROVISIONER_NAME 匹配
parameters:# 啟用PV歸檔模式 true|falsearchiveOnDelete: "false"
使用存儲類創建PVC
---
# 創建pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:# pvc名稱name: pv-volume
spec:# 存儲類名稱storageClassName: nfs-clientaccessModes:- ReadWriteOnceresources:requests:storage: 10Mi # pvc容量