H5 滑塊拼圖驗證
阿新 • • 發佈:2021-06-28
1.什麼是StorageClass
Kubernetes提供了一套可以自動建立PV的機制,即:Dynamic Provisioning.而這個機制的核心在於:StorageClass這個API物件. StorageClass物件會定義下面兩部分內容: 1,PV的屬性.比如,儲存型別,Volume的大小等. 2,建立這種PV需要用到的儲存外掛 有了這兩個資訊之後,Kubernetes就能夠根據使用者提交的PVC,找到一個對應的StorageClass,之後Kubernetes就會呼叫該StorageClass宣告的儲存外掛,進而創建出需要的PV. 但是其實使用起來是一件很簡單的事情,你只需要根據自己的需求,編寫YAML檔案即可,然後使用kubectl create命令執行即可
2.為什麼需要StorageClass
在一個大規模的Kubernetes叢集裡,可能有成千上萬個PVC,這就意味著運維人員必須實現創建出這個多個PV,此外,隨著專案的需要,會有新的PVC不斷被提交,那麼運維人員就需要不斷的新增新的,滿足要求的PV,否則新的Pod就會因為PVC繫結不到PV而導致建立失敗.而且通過 PVC 請求到一定的儲存空間也很有可能不足以滿足應用對於儲存裝置的各種需求 而且不同的應用程式對於儲存效能的要求可能也不盡相同,比如讀寫速度、併發效能等,為了解決這一問題,Kubernetes 又為我們引入了一個新的資源物件:StorageClass,通過 StorageClass 的定義,管理員可以將儲存資源定義為某種型別的資源,比如快速儲存、慢速儲存等,使用者根據 StorageClass 的描述就可以非常直觀的知道各種儲存資源的具體特性了,這樣就可以根據應用的特性去申請合適的儲存資源了。
3.StorageClass執行原理及部署流程
要使用 StorageClass,我們就得安裝對應的自動配置程式,比如我們這裡儲存後端使用的是 nfs,那麼我們就需要使用到一個 nfs-client 的自動配置程式,我們也叫它 Provisioner,這個程式使用我們已經配置好的 nfs 伺服器,來自動建立持久卷,也就是自動幫我們建立 PV。 1.自動建立的 PV 以${namespace}-${pvcName}-${pvName}這樣的命名格式建立在 NFS 伺服器上的共享資料目錄中 2.而當這個 PV 被回收後會以archieved-${namespace}-${pvcName}-${pvName}這樣的命名格式存在 NFS 伺服器上。
4.搭建StorageClass+NFS,大致有以下幾個步驟
1.建立一個可用的NFS Serve
2.建立Service Account.這是用來管控NFS provisioner在k8s叢集中執行的許可權
3.建立StorageClass.負責建立PVC並呼叫NFS provisioner進行預定的工作,並讓PV與PVC建立管理
4.建立NFS provisioner.有兩個功能,一個是在NFS共享目錄下建立掛載點(volume),另一個則是建了PV並將PV與NFS的掛載點建立關聯
5.建立StorageClass
1.建立nfs服務(百度)
2.使用以下文件配置account及相關許可權
[root@master01 storageClass]# cat rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default #根據實際環境設定namespace,下面類同
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
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"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: leader-locking-nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default
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-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default
roleRef:
kind: Role
name: leader-locking-nfs-client-provisioner
apiGroup: rbac.authorization.k8s.io
3.建立NFS資源的StorageClass
[root@master01 storageClass]# cat nfs-StorageClass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-nfs-storage
provisioner: qgg-nfs-storage #這裡的名稱要和provisioner配置檔案中的環境變數PROVISIONER_NAME保持一致
parameters:
archiveOnDelete: "false"
4.建立NFS provisioner
[root@master01 storageClass]# cat nfs-provisioner.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
labels:
app: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default #與RBAC檔案中的namespace保持一致
spec:
replicas: 1
selector:
matchLabels:
app: nfs-client-provisioner
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: qgg-nfs-storage #provisioner名稱,請確保該名稱與 nfs-StorageClass.yaml檔案中的provisioner名稱保持一致
- name: NFS_SERVER
value: 192.168.0.120 #NFS Server IP地址
- name: NFS_PATH
value: /data/k8s #NFS掛載卷
volumes:
- name: nfs-client-root
nfs:
server: 192.168.0.120 #NFS Server IP地址
path: /data/k8s #NFS 掛載卷
5.建立測試pod,檢查是否部署成功
[root@master01 storageClass]# cat test-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: test-claim
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage" #與nfs-StorageClass.yaml metadata.name保持一致
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Mi
[root@master01 storageClass]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test-claim Bound pvc-2089e4b4-2464-4585-9775-a217ae0e341c 1Mi RWX managed-nfs-storage 17m
[root@master01 storageClass]# cat test-pod.yaml
kind: Pod
apiVersion: v1
metadata:
name: test-pod
spec:
containers:
- name: test-pod
image: busybox:1.24
command:
- "/bin/sh"
args:
- "-c"
- "touch /mnt/SUCCESS && exit 0 || exit 1" #建立一個SUCCESS檔案後退出
volumeMounts:
- name: nfs-pvc
mountPath: "/mnt"
restartPolicy: "Never"
volumes:
- name: nfs-pvc
persistentVolumeClaim:
claimName: test-claim #與PVC名稱保持一致
6.檢查結果
[root@master01 default-test-claim-pvc-2089e4b4-2464-4585-9775-a217ae0e341c]# pwd
/data/k8s/default-test-claim-pvc-2089e4b4-2464-4585-9775-a217ae0e341c
[root@master01 default-test-claim-pvc-2089e4b4-2464-4585-9775-a217ae0e341c]# ll
-rw-r--r-- 1 root root 0 Jul 1 11:57 SUCCESS