文章目錄
- 前言
- StorageClass是什么
- 一、實驗目的
- 配置過程
- 二、實驗環境
- 實驗步驟
- 一、配置網絡存儲NFS:
- 1.主機基礎配置
- 2.配置 NFS:
- 二、開啟rbac權限:
- 三、創建nfs-deployment.yaml
- 四、創建storageclass資源
- 五、驗證:
- 1.創建PVC驗證
- 2.創建一個pod驗證
- 3.刪除pod、pvc,pv會自動刪除,nfs數據未刪除
前言
StorageClass是什么
簡單理解
由于在大型環境應用部署環境中,利用靜態方式創建大量的pv是很麻煩的事情,所以為了方便運維人員,我們可以使用StorageClass
storageclass是一種網絡存儲的動態供給方式,它通過連接存儲插件,根據PVC的消費需求,動態生成PV,從而實現方便管理的效果。
詳細解釋
在 Kubernetes 中,StorageClass 是一種抽象,用于定義不同存儲提供者的存儲配置。它提供了一種靈活的方式來管理和動態分配存儲資源。StorageClass 允許集群管理員定義不同類型的存儲(例如 SSD、HDD、網絡存儲等),以及不同的存儲配置(例如不同的性能和備份策略)。
StorageClass 的核心概念
Provisioner(供應者):
Provisioner 是指具體的存儲插件,用于創建實際的存儲卷。例如,常見的 Provisioner 包括 kubernetes.io-ebs(AWS 的 EBS 卷)、kubernetes.io/gce-pd(Google Cloud 的 Persistent Disk)、kubernetes.io/nfs(NFS 存儲)等。
Parameters(參數):
Parameters 定義了存儲類的具體配置選項。這些參數因不同的 Provisioner 而異。例如,對于 AWS EBS,可能包括卷的類型(如 gp2、io1)、I/O 性能參數等。
ReclaimPolicy(回收策略):
ReclaimPolicy 定義了當持久卷(PersistentVolume)不再使用時該如何處理。常見的策略包括:
Retain:
保留卷和數據,需要手動處理。
Delete:
刪除卷和數據。
Recycle:
清空卷并重新用于其他請求(注意,這種策略已經不推薦使用)。
MountOptions(掛載選項):
這些選項指定了掛載卷時使用的掛載參數。例如,可以指定文件系統的掛載選項來優化性能或可靠性。
VolumeBinding(卷綁定模式):
VolumeBinding 控制卷綁定的時機,通常有兩種模式:
Immediate:
立即綁定卷,默認模式。
ForFirst:
等待第一個消費者(Pod)請求時再綁定卷,適用于需要考慮 Pod 調度位置的場景。
一、實驗目的
驗證k8s中StorageClass的動態生產pv
配置過程
(1) 配置網絡存儲—>
(2) 開啟賬號訪問權限(創建賬號、創建權限、給賬號關聯權限)—>
(3) 通過中間件將賬號與共享存儲關聯—>
(4) 配置StorageClass與中間件關聯—>
(5) 創建PVC關聯StorageClass—>
(6) 創建pod關聯pvc,動態生成pv
(7) 驗證
二、實驗環境
Ip | 主機名 | cpu | 內存 | 硬盤 |
---|---|---|---|---|
192.168.10.11 | master | 1cpu雙核 | 2G | 40G |
192.168.10.12 | node01 | 1cpu雙核 | 2G | 40G |
192.168.10.13 | node02 | 1cpu雙核 | 2G | 40G |
192.168.10.17 | nfs | 1cpu1核 | 1G | 40G |
虛擬機 centos7.9
master node01 node02 已部署k8s集群
版本 1.18.0
nfs服務器部署nfs
實驗步驟
一、配置網絡存儲NFS:
1.主機基礎配置
由于nfs是新創建的虛擬機需要關閉防火墻,關閉沙盒
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux
2.配置 NFS:
所有主機都需要安裝nfs
yum -y install nfs-utils rpcbind
其次在nfs主機上
mkdir /nfsdata
vim /etc/exports
輸入
/nfsdata *(rw,sync,no_root_squash)
systemctl start rpcbind
systemctl start nfs-server
systemctl enable rpcbind
systemctl enable nfs-server
showmount -e
看到這個nfs就部署成功了
二、開啟rbac權限:
RBAC(Role-Based Access Control):基于角色的訪問控制
vim account.yaml
kind: Namespace
apiVersion: v1
metadata: name: test #自定義了一個名稱空間
---
apiVersion: v1
kind: ServiceAccount #服務類賬號
metadata: name: nfs-provisioner #創建賬號 nfs-provisionernamespace: test #指定好自定義的名稱空間。
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole #集群類的角色
metadata: name: nfs-provisioner-runner namespace: test
rules: #規則,指定有什么樣的權限 - apiGroups: [""] #“”不寫代表對所有api組具有的權限 resources: ["persistentvolumes"] #對pv可以進行什么樣的操作 verbs: ["get", "list", "watch", "create", "delete"] #有獲得,創建,刪掉等 等權限- apiGroups: [""] resources: ["persistentvolumeclaims"] #pvc有什么樣的權限 verbs: ["get", "list", "watch", "update"] #具體權限 - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["watch", "create", "update", "patch"] - apiGroups: [""] resources: ["services", "endpoints"] verbs: ["get","create","list", "watch","update"]- apiGroups: ["extensions"] resources: ["podsecuritypolicies"] resourceNames: ["nfs-provisioner"] verbs: ["use"]
---
kind: ClusterRoleBinding #cluster開頭的指的都是整個k8s的權限范圍,在集群內都生效
apiVersion: rbac.authorization.k8s.io/v1
metadata: name: run-nfs-provisioner
subjects: - kind: ServiceAccount name: nfs-provisioner namespace: test
roleRef: kind: ClusterRole name: nfs-provisioner-runner apiGroup: rbac.authorization.k8s.io
簡單注釋
這個 YAML 文件定義了一個 Kubernetes 命名空間 test,在其中創建了一個名為 nfs-provisioner 的服務賬號,并為該賬號設置了一組權限規則,允許其對持久卷、持久卷聲明、存儲類等資源進行特定操作。最后,通過集群角色綁定將權限規則與服務賬號進行了關聯,使得該賬號能夠在指定命名空間內執行相應的操作。
執行這個yaml文件,看到三個created就是運行成功了,如果報錯仔細查看,大概率是字符錯誤
kubectl apply -f nfs-deployment.yaml
獲取命名空間 test 中的服務賬號,可以看到已經存在
kubectl -n test get serviceaccounts
三、創建nfs-deployment.yaml
通過中間件將訪問賬號與共享存儲關聯
vim nfs-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata: name: nfs-client-provisioner namespace: test
spec: selector: matchLabels: app: nfs-client-provisioner replicas: 1 strategy: type: Recreate template: metadata: labels: app: nfs-client-provisioner spec: serviceAccount: nfs-provisioner #nfs-provisioner為已創建的服務類賬號 containers: - name: nfs-client-provisioner image: registry.cn-hangzhou.aliyuncs.com/open-ali/nfs-client-provisioner #中間件鏡像imagePullPolicy: IfNotPresent volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: pro-test - name: NFS_SERVER value: 192.168.10.17 - name: NFS_PATHvalue: /nfsdata volumes: - name: nfs-client-root nfs:server: 192.168.10.17path: /nfsdata
簡單注釋
在 Kubernetes 集群中部署了一個 NFS 客戶端 provisioner,用于動態創建持久卷,并將其掛載到容器中,以便應用程序可以訪問 NFS 服務器上的數據。
創建然后查看一下,看到即可
kubectl apply -f nfs-deployment.yaml
kubectl -n test get pod
四、創建storageclass資源
vim storageclass.yaml
(配置storageclass與中間件關聯)
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: storageclassnamespace: test
provisioner: pro-test
#reclaimPolicy: Retain
reclaimPolicy: Delete
創建并查看
kubectl apply -f storageclass.yamlkubectl get sc
五、驗證:
1.創建PVC驗證
vim test-pvc1.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-pvc1namespace: test
spec:storageClassName: storageclassaccessModes:- ReadWriteManyresources:requests:storage: 200Mi
創建并查看
kubectl apply -f test-pvc1.yaml
kubectl -n test get pv,pvc
nfs服務器上查看
ls /nfsdata/
查看pod容器掛載目錄,目錄中無文件
[root@master ~]# kubectl -n test exec -it nfs-client-provisioner-5878bf7b9c-2294l /bin/sh
/ # ls persistentvolumes/
test-test-pvc1-pvc-1738bcd6-3d9b-49f6-9005-3eee8e61eae6
/ # ls persistentvolumes/test-test-pvc1-pvc-1738bcd6-3d9b-49f6-9005-3eee
8e61eae6/
/ #exit
2.創建一個pod驗證
vim test-pod1.yaml
apiVersion: v1
kind: Pod
metadata:name: test-pod1namespace: test
spec:containers:- name: test-pod1image: busyboximagePullPolicy: IfNotPresentargs:- /bin/sh- -c- sleep 3000volumeMounts:- name: nfs-pvmountPath: /testvolumes:- name: nfs-pvpersistentVolumeClaim:claimName: test-pvc1
kubectl apply -f test-pod1.yaml
kubectl get pod -n test
向pod1中寫入文件測試
kubectl exec -it -n test test-pod1 -- touch /test/test1.txt
nfs服務器上查看:
ls /nfsdata/test-test-pvc1-pvc-1738bcd6-3d9b-49f6-9005-3eee8e61eae6/
3.刪除pod、pvc,pv會自動刪除,nfs數據未刪除
kubectl -n test get pv,pvc
查看nfs會發現目錄名發生變化,但數據還在
ls /nfsdata/archived-test-test-pvc1-pvc-1738bcd6-3d9b-49f6-9005-3eee8e61eae6/
實驗完成