目錄
前情回顧
動態(tài)pv
實驗模擬
步驟一:在stor01節(jié)點上安裝nfs,并配置nfs服務
接下來在matser01上配置
步驟二:創(chuàng)建 Service Account,用來管理 NFS Provisioner 在?k8s?集群中運行的權(quán)限和動態(tài)規(guī)則
步驟三:使用 Deployment 來創(chuàng)建 NFS Provisioner?
部署nfs-provisioners插件:
步驟四:創(chuàng)建 StorageClass,負責建立 PVC 并調(diào)用 NFS provisioner 進行預定的工作,并讓 PV 與 PVC 建立關聯(lián)
步驟五:?創(chuàng)建 PVC 和 Pod 測試
下面進行讀寫測試
前情回顧
存儲卷:
emptyDir 容器內(nèi)部,隨著pod銷毀,emptyDir也會消失 不能做數(shù)據(jù)持久化
hostPath:持久化存儲數(shù)據(jù) 可以和節(jié)點上目錄做掛載。pod被銷毀了數(shù)據(jù)還在
NFS:一臺機器,提供pod內(nèi)容器所有的掛載點
pv和pvc:
pvc就是pod發(fā)起的掛載請求
pv:持久化存儲目錄
靜態(tài)pv和pvc: 運維負責:創(chuàng)建好持久化存儲卷,聲明好讀寫和掛載類型 以及可以提供的存儲空間
pvc開發(fā)做,要和開發(fā)溝通好,你期望的讀寫和掛載類型,以及存儲空間。
當我發(fā)布pvc之后可以自動生成pv,還可以在共享服務器上直接生成掛載目錄。
pvc直接綁定和使用pv
動態(tài)pv
1.卷插件,k8s本身不支持的動態(tài)pv創(chuàng)建不包括nfs,需要聲明和安裝一個外部插件
Provisioner:存儲分配器。動態(tài)創(chuàng)建pv,然后根據(jù)pvc的請求自動綁定和使用。
StorageClass:來定義pv的屬性,存儲類型,大小,回收策略。
用nfs來實現(xiàn)動態(tài)PV,NFS支持的方式NFS-client,Provisioner
實驗模擬
步驟一:在stor01節(jié)點上安裝nfs,并配置nfs服務
1、在stor01節(jié)點上安裝nfs,并配置nfs服務
node02
cd /opt
mkdir k8s
chmod 777 k8s
vim /etc/exports
/opt/k8s 20.0.0.0/24(rw,no_root_squash,sync)
wq
systemctl restart rpcbind
systemctl restart nfs
showmount -e
master01
showmount -e 20.0.0.63
查看
接下來在matser01上配置
步驟二:創(chuàng)建 Service Account,用來管理 NFS Provisioner 在?k8s?集群中運行的權(quán)限和動態(tài)規(guī)則
vim nfs-client-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
---
#定義權(quán)限
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: nfs-client-provisioner-clusterrole
rules:
- apiGroups: [""]
#apigroup定義了規(guī)則使用了哪個api的組,空字符“”,直接使用api的核心組的資源
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
#表示權(quán)限的動作。
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
#獲取pv屬性
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
#獲取api活動的時間信息
- apiGroups: [""]
resources: ["events"]
verbs: ["list", "watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
---
#集群角色綁定
apiVersion: rbac.authorization.k8s.io
kind: ClusterRoleBinding
metadata:
name: nfs-client-provisioner-clusterrolebinding
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-clusterrole
apiGroup: rbac.authorization.k8s.io
wq
步驟三:使用 Deployment 來創(chuàng)建 NFS Provisioner?
vim /etc/kubernetes/manifests/kube-apiserver.yaml
...
spec:
containers:
- command:
- --feature-gares=RemoveSelfLink=false
- --advertise-address=20.0.0.61
feature-gates:在不破壞現(xiàn)有規(guī)則以及功能基礎上引入新功能或者修改現(xiàn)有功能的機制。
禁用不影響之前的規(guī)則
wq
kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
kubectl delete pods kube-apiserver -n kube-system
kubectl get pods -n kube-system | grep apiserver
部署nfs-provisioners插件:
nfs的provisioner的客戶端以pod的方式運行在集群當中,監(jiān)聽k8s集群當中的pv的請求。動態(tài)的創(chuàng)建于NFS服務器相關的pv。
容器里使用配置,在provisioner當中定義好環(huán)境變量,穿給容器。storageclass的名稱,nfs服務器的地址,nfs的目錄
vim nfs-client-provisioner.yaml
#創(chuàng)建 NFS Provisioner
vim nfs-client-provisioner.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
selector:
matchLabels:
app: nfs1
strategy:
type: Recreate
template:
metadata:
labels:
app: nfs1
spec:
serviceAccountName: nfs-client-provisioner
#指定Service Account賬戶來調(diào)用
containers:
- name: nfs1
image: quay.io/external_storage/nfs-client-provisioner:latest
imagePullPolicy: IfNotPresent
volumeMounts:
- name: nfs1
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: nfs-storage
#配置provisioner的Name,確保該名稱與StorageClass資源中的provisioner名稱保持一致
- name: NFS_SERVER
value: stor01
#配置綁定的nfs服務器
- name: NFS_PATH
value: /opt/k8s
#配置綁定的nfs服務器目錄
volumes:
#申明nfs數(shù)據(jù)卷
- name: nfs-client-root
nfs:
server:20.0.0.63
path: /opt/k8s
kubectl apply -f nfs-client-provisioner.yaml
步驟四:創(chuàng)建 StorageClass,負責建立 PVC 并調(diào)用 NFS provisioner 進行預定的工作,并讓 PV 與 PVC 建立關聯(lián)
vim nfs-client-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nfs-client-storageclass
provisioner: nfs-storage #這里的名稱要和provisioner配置文件中的環(huán)境變量PROVISIONER_NAME保持一致
parameters:
archiveOnDelete: "false"
#false表示在刪除PVC時不會對數(shù)據(jù)目錄進行打包存檔,即刪除數(shù)據(jù);為ture時就會自動對數(shù)據(jù)目錄進行打包存檔,存檔文件以archived開頭
reclaimPolicy: Retain
#定義pv的回收策略,retain,另一個是delete,不支持回收
allowVolumeExpansion: true
#pv的存儲空間可以動態(tài)的擴縮容
kubectl apply -f nfs-client-storageclass.yaml
步驟五:?創(chuàng)建 PVC 和 Pod 測試
先創(chuàng)建pvc
vim test-pvc-pod.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: nfs-client-storageclass #關聯(lián)StorageClass對象
resources:
requests:
storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx1
labels:
app: nginx1
spec:
replicas:1
selector:
matchLabels:
app: nginx1
template:
metadata:
labels:
app: nginx1
spec:
containers:
- name: nginx1
image: nginx:1.22
volumeMounts:
- name: nginx1
mountPath: /usr/share/nginx/html
volumes:
- name: nginx1
persistentVolumeClaim:
claimName: nfs-pvc
#與PVC名稱保持一致
kubectl apply -f test-pvc-pod.yaml
nfs主機中:?
下面進行讀寫測試
總結(jié)
動態(tài)pv的兩個組件:
provisioner插件:支持nfs。創(chuàng)建pv目錄
strogeclass:定義pv的屬性。
動態(tài)pv的默認策略是刪除
動態(tài)pv刪除pvc的狀態(tài)。最好設置為releassed
1.給卷插件創(chuàng)建賬號,確保集群可以在集群內(nèi)部通信,獲取資源,監(jiān)聽事件。創(chuàng)建和刪除以及更新pv
2.創(chuàng)建卷插件的pod。由卷插件的pod創(chuàng)建pv
3。定義storageclass給pv賦予屬性。屬性包括:pvc被刪除之后pv的狀態(tài),以及回收策略。
4.創(chuàng)建pvc文章來源:http://www.zghlxwxcb.cn/news/detail-819520.html
5.實驗完成
?文章來源地址http://www.zghlxwxcb.cn/news/detail-819520.html
到了這里,關于k8s--動態(tài)pvc和pv的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!