食品包裝設(shè)計(jì)公司哪家好網(wǎng)站搜索引擎優(yōu)化工具
存儲(chǔ)類StorageClass
- 一、StorageClass介紹
- 二、安裝nfs provisioner,用于配合存儲(chǔ)類動(dòng)態(tài)生成pv
- 2.1、創(chuàng)建運(yùn)行nfs-provisioner需要的sa賬號(hào)
- 2.2、對(duì)sa授權(quán)
- 2.3、安裝nfs-provisioner程序
- 三、創(chuàng)建storageclass,動(dòng)態(tài)供給pv
- 四、創(chuàng)建pvc,通過storageclass動(dòng)態(tài)生成pv
- 五、創(chuàng)建pod,掛載storageclass動(dòng)態(tài)生成的pvc
一、StorageClass介紹
之前介紹的PV和PVC模式都是需要先創(chuàng)建好PV,然后定義好PVC和pv進(jìn)行一對(duì)一的Bond,但是如果PVC請(qǐng)求成千上萬,那么就需要?jiǎng)?chuàng)建成千上萬的PV,對(duì)于運(yùn)維人員來說維護(hù)成本很高,
Kubernetes提供一種自動(dòng)創(chuàng)建PV的機(jī)制,叫StorageClass
,它的作用就是創(chuàng)建PV的模板。k8s集群管理員通過創(chuàng)建storageclass可以動(dòng)態(tài)生成一個(gè)存儲(chǔ)卷pv供k8s pvc使用。
具體來說,StorageClass會(huì)定義以下兩部分:
=========
1、PV的屬性 ,比如存儲(chǔ)的大小、類型等;
2、創(chuàng)建這種PV需要使用到的存儲(chǔ)插件,比如Ceph、NFS等
=========
有了這兩部分信息,Kubernetes就能夠根據(jù)用戶提交的PVC,找到對(duì)應(yīng)的StorageClass,然后Kubernetes就會(huì)調(diào)用 StorageClass聲明的存儲(chǔ)插件,創(chuàng)建出需要的PV。
查看定義的storageclass需要的字段:kubectl explain storageclass
每個(gè)StorageClass都包含字段provisioner,parameters和reclaimPolicy
[root@master 10]# kubectl explain storageclass
KIND: StorageClass
VERSION: storage.k8s.io/v1
DESCRIPTION:StorageClass describes the parameters for a class of storage for whichPersistentVolumes can be dynamically provisioned.StorageClasses are non-namespaced; the name of the storage class accordingto etcd is in ObjectMeta.Name.
FIELDS:allowVolumeExpansion <boolean>allowedTopologies <[]Object>apiVersion <string>kind <string>metadata <Object>mountOptions <[]string>parameters <map[string]string> # 鍵值對(duì)類型provisioner <string> -required- # 供應(yīng)商reclaimPolicy <string> # 回收策略volumeBindingMode <string>
provisioner:供應(yīng)商,storageclass需要有一個(gè)供應(yīng)者,用來確定我們使用什么樣的存儲(chǔ)來創(chuàng)建pv,常見的provisioner:(https://kubernetes.io/zh/docs/concepts/storage/storage-classes/)
provisioner既可以由內(nèi)部供應(yīng)商提供,也可以由外部供應(yīng)商提供,如果是外部供應(yīng)商可以參考https://github.com/kubernetes-incubator/external-storage/下提供的方法創(chuàng)建。
https://github.com/kubernetes-sigs/sig-storage-lib-external-provisioner
以NFS為例,要想使用NFS,我們需要一個(gè)nfs-client的自動(dòng)裝載程序,稱之為provisioner,這個(gè)程序會(huì)使用我們已經(jīng)配置好的NFS服務(wù)器自動(dòng)創(chuàng)建持久卷,也就是自動(dòng)幫我們創(chuàng)建PV。
allowVolumeExpansion:允許卷擴(kuò)展,PersistentVolume 可以配置成可擴(kuò)展。將此功能設(shè)置為true時(shí),允許用戶通過編輯相應(yīng)的 PVC 對(duì)象來調(diào)整卷大小。當(dāng)基礎(chǔ)存儲(chǔ)類的allowVolumeExpansion字段設(shè)置為 true 時(shí),以下類型的卷支持卷擴(kuò)展。
注意:此功能僅用于擴(kuò)容卷,不能用于縮小卷。
二、安裝nfs provisioner,用于配合存儲(chǔ)類動(dòng)態(tài)生成pv
將nfs-subdir-external-provisioner.tar.gz上傳到工作節(jié)點(diǎn)node01和node02上,然后手動(dòng)解壓。
[root@node01 ~]# ctr -n=k8s.io images import nfs-subdir-external-provisioner.tar.gz
unpacking registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0 (sha256:69b08b256d7e9f5823cf09dece7eabf025cc60c652e4ae08201978bb2862a276)...done
You have new mail in /var/spool/mail/root
[root@node02 ~]# ctr -n=k8s.io images import nfs-subdir-external-provisioner.tar.gz
unpacking registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0 (sha256:69b08b256d7e9f5823cf09dece7eabf025cc60c652e4ae08201978bb2862a276)...done
You have new mail in /var/spool/mail/root
2.1、創(chuàng)建運(yùn)行nfs-provisioner需要的sa賬號(hào)
[root@master 11]# cat serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-provisioner
[root@master 11]# kubectl apply -f serviceaccount.yaml
serviceaccount/nfs-provisioner created
[root@master 11]# kubectl get sa
NAME SECRETS AGE
default 0 5d13h
nfs-provisioner 0 21s
擴(kuò)展:什么是sa?
sa的全稱是serviceaccount。
serviceaccount是為了方便Pod里面的進(jìn)程調(diào)用Kubernetes API或其他外部服務(wù)而設(shè)計(jì)的。
指定了serviceaccount之后,我們把pod創(chuàng)建出來了,我們?cè)谑褂眠@個(gè)pod時(shí),這個(gè)pod就有了我們指定的賬戶的權(quán)限了。
2.2、對(duì)sa授權(quán)
[root@master 11]# kubectl create clusterrolebinding nfs-provisioner-clusterrolebinding --clusterrole=cluster-admin --serviceaccount=default:nfs-provisioner
clusterrolebinding.rbac.authorization.k8s.io/nfs-provisioner-clusterrolebinding created
2.3、安裝nfs-provisioner程序
[root@master 11]# cat /etc/exports
/data/volumes 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v1 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v2 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v3 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v4 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v5 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v6 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v7 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v8 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v9 10.32.1.147/24(rw,no_root_squash)
/data/volume_test/v10 10.32.1.147/24(rw,no_root_squash)
/data/nfs_pro 10.32.1.147/24(rw,no_root_squash)
[root@master 11]# exportfs -arv
exporting 10.32.1.147/24:/data/nfs_pro
exporting 10.32.1.147/24:/data/volume_test/v10
exporting 10.32.1.147/24:/data/volume_test/v9
exporting 10.32.1.147/24:/data/volume_test/v8
exporting 10.32.1.147/24:/data/volume_test/v7
exporting 10.32.1.147/24:/data/volume_test/v6
exporting 10.32.1.147/24:/data/volume_test/v5
exporting 10.32.1.147/24:/data/volume_test/v4
exporting 10.32.1.147/24:/data/volume_test/v3
exporting 10.32.1.147/24:/data/volume_test/v2
exporting 10.32.1.147/24:/data/volume_test/v1
exporting 10.32.1.147/24:/data/volumes
[root@master 11]# cat nfs-deployment.yaml
kind: Deployment
apiVersion: apps/v1
metadata:name: nfs-provisioner
spec:selector:matchLabels:app: nfs-provisionerreplicas: 1strategy:type: Recreatetemplate:metadata:labels:app: nfs-provisionerspec:serviceAccount: nfs-provisionercontainers:- name: nfs-provisionerimage: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0imagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: example.com/nfs- name: NFS_SERVERvalue: 10.32.1.147- name: NFS_PATHvalue: /data/nfs_pro/volumes:- name: nfs-client-rootnfs:server: 10.32.1.147path: /data/nfs_pro/
[root@master 11]# kubectl apply -f nfs-deployment.yaml
deployment.apps/nfs-provisioner created
[root@master 11]# kubectl get pods | grep nfs
nfs-provisioner-d5bd78f66-56ccg 1/1 Running 0 6s
三、創(chuàng)建storageclass,動(dòng)態(tài)供給pv
[root@master 11]# cat nfs-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs
provisioner: example.com/nfs
[root@master 11]# kubectl apply -f nfs-storageclass.yaml
storageclass.storage.k8s.io/nfs created
[root@master 11]# kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs example.com/nfs Delete Immediate false 22s
# 顯示內(nèi)容如上,說明storageclass創(chuàng)建成功了
注意:provisioner處寫的example.com/nfs
應(yīng)該跟安裝nfs provisioner時(shí)候的env下的PROVISIONER_NAME的value值保持一致,如下:
env:- name: PROVISIONER_NAMEvalue: `example.com/nfs`
四、創(chuàng)建pvc,通過storageclass動(dòng)態(tài)生成pv
[root@master 11]# cat claim.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-claim1
spec:accessModes: ["ReadWriteMany"]resources:requests:storage: 1GistorageClassName: nfs
[root@master 11]# kubectl apply -f claim.yaml
persistentvolumeclaim/test-claim1 created
# 查看是否動(dòng)態(tài)生成了pv,pvc是否創(chuàng)建成功,并和pv綁定
[root@master 11]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test-claim1 Bound pvc-6ecea632-e5ff-4ef9-99df-33638fe90a1c 1Gi RWX nfs 13s
# 通過上面可以看到test-claim1的pvc已經(jīng)成功創(chuàng)建了,綁定的pv是pvc-6ecea632-e5ff-4ef9-99df-33638fe90a1c
# 這個(gè)pv是由storageclass調(diào)用nfs provisioner自動(dòng)生成的。
步驟總結(jié):
- 1、供應(yīng)商:創(chuàng)建一個(gè)nfs provisioner
- 2、創(chuàng)建storageclass,storageclass指定剛才創(chuàng)建的供應(yīng)商
- 3、創(chuàng)建pvc,這個(gè)pvc指定storageclass
五、創(chuàng)建pod,掛載storageclass動(dòng)態(tài)生成的pvc
[root@master 11]# cat read-pod.yaml
kind: Pod
apiVersion: v1
metadata:name: read-pod
spec:containers:- name: read-podimage: nginximagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-pvcmountPath: /usr/share/nginx/htmlrestartPolicy: "Never"volumes:- name: nfs-pvcpersistentVolumeClaim:claimName: test-claim1
[root@master 11]# kubectl apply -f read-pod.yaml
pod/read-pod created
[root@master 11]# kubectl get pods | grep read
read-pod 1/1 Running 0 16s