k8s 持久卷使用相關記錄,供后續研究參考。。。
組成 PV ( PersistentVolume ) + PVC ( PersistentVolumeClaim ) + SC ( StorageClass ) + NFS
k8s 持久卷掛載方案有多種,我這里使用的是 NFS
k8s 集群為 master + 2 node 自行搭建 使用 flannel 做網絡插件,實現k8s集群內部通信
IP:k8s-master: 192.168.1.230
k8s-node01:192.168.1.231
k8s-node02:192.168.1.232
一、NFS 搭建
NFS 搭建很簡單,自行百度
需要創建對應網絡共享目錄,配置相應權限
創建完成后,即可通過k8s StorageClass 來創建存儲卷綁定策略及指定相關存儲卷插件類型
注:需要在所有工作節點都安裝NFS 不然會在 Deployment 中部署 replicas 多實例時報錯。 通過命令 kubectl describe pods xxx 中查看 Events 事件中提示報錯信息: NFS 服務器文件系統崩壞等信息。未截圖
二、創建 SC 配置
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: bxy-storageclass provisioner: kubernetes.io/no-provisioner reclaimPolicy: Retain #回收策略:Retain(保留)、 Recycle(回收)或者Delete(刪除) volumeBindingMode: Immediate #volumeBindingMode存儲卷綁定策略 allowVolumeExpansion: true #是否允許擴容 #volumeBindingMode存儲卷綁定策略 #(控制存儲卷綁定和動態供應行為 #- Immediate:創建 PVC 后立即創建后端存儲卷,並且立即綁定新創建的 PV 和 PVC。 #- WaitForFirstConsumer:當 PVC 被 Pod 使用時,才觸發 PV 和后端存儲的創建,同時實現 PVC/PV 的綁定,啟用該配置后,Storage Class 中的 Zone 和 Region 將不再生效,而是使用 Pod 調度所在節點的 zone 和 region 創建文件系統,保證文件系統能被 Pod 掛載。) #StorageClass的定義包含四個部分: #provisioner:指定 Volume 插件的類型,包括內置插件(如kubernetes.io/glusterfs、kubernetes.io/aws-ebs)和外部插件(如 external-storage 提供的 ceph.com/cephfs)。 #parameters:指定 provisioner 的選項,比如 glusterfs 支持 resturl、restuser 等參數。 #mountOptions:指定掛載選項,當 PV 不支持指定的選項時會直接失敗。比如 NFS 支持 hard 和 nfsvers=4.1 等選項。 #reclaimPolicy:指定回收策略,同 PV 的回收策略。
啟動:kubectl create -f bxy-nfs-StorageClass.yaml
框起來的三個字段在上面 yaml 配置文件中有相關注釋
三、創建 PV 配置
apiVersion: v1 kind: PersistentVolume metadata: name: bxy-pv labels: name: bxy-pv-labels spec: capacity: #容量 storage: 6Gi volumeMode: Filesystem #存儲卷模式(默認值為filesystem,除了支持文件系統外(file system)也支持塊設備(raw block devices)) accessModes: #訪問模式 - ReadWriteMany #ReadWriteOnce(RWO/該volume只能被單個節點以讀寫的方式映射),ReadOnlyMany (ROX/該volume可以被多個節點以只讀方式映射), Re adWriteMany (RWX/該volume可以被多個節點以讀寫的方式映射) persistentVolumeReclaimPolicy: Retain #回收策略:Retain(保留)、 Recycle(回收)或者Delete(刪除) storageClassName: bxy-storageclass #存儲類(通過設置storageClassName字段進行設置。如果設置了存儲類,則此PV只能被綁定到也指定了此存儲類的PVC) mountOptions: #掛接選項 - hard - nfsvers=4.1 nfs: path: /bxy/nfsdata #我的本地掛載路徑為 /bxy/nfsdata server: 192.168.1.231 #NFS 文件系統所在服務器的真實 IP #https://www.cnblogs.com/yanh0606/p/11269142.html
spec.storageClassName 字段對應 StorageClass 配置中的 metedata.name 字段
spec.mountOptions 字段沒搞太懂,此為官網中 NFS 相應掛載配置
https://www.cnblogs.com/yanh0606/p/11269142.html 相關資料網站
啟動:kubectl create -f bxy-nfs-pv.yaml
注意創建完 PV 后,會看到 Status 類型為 Available ,這是因為 PV 還沒有和 PVC 綁定,當綁定成功后會自動改成 Bound
四、創建 PVC 配置
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: bxy-pvc spec: accessModes: - ReadWriteMany volumeMode: Filesystem resources: #注意:我寫的是 5G ,但實際綁定成功后會自動改變為 PV 中設置的容量大小 6G requests: storage: 5Gi storageClassName: bxy-storageclass selector: matchLabels: name: bxy-pv-labels #pvc 通過 matchLabels和pv中的label匹配,來關聯要使用的存儲空間。 #https://my.oschina.net/sskxyz/blog/3130131 #表明此PVC希望使用Label:name: "bxy-pv-labels"的PV。 #https://www.cnblogs.com/yanh0606/p/11269142.html
spec.selector.matchLabels 這個字段與 PV 中的 labels 字段匹配
#pvc 通過 matchLabels和pv中的label匹配,來關聯要使用的存儲空間。
#https://my.oschina.net/sskxyz/blog/3130131
#表明此PVC希望使用Label:name: "bxy-pv-labels"的PV。
#https://www.cnblogs.com/yanh0606/p/11269142.html
啟動:kubectl create -f bxy-nfs-pvc.taml
注意框起來的部分,狀態為 Bound 並且容量為 6G,而不是配置文件中請求的 5G 容量
再次回過頭來看下我們的 pv 狀態
未創建 PVC 之前狀態:
創建 PVC 后對比:
在未創建 PVC 之前我的 PV 狀態為 Available ,現在狀態自動更改為 Bound,說明已經自動綁定成功,並且 CLAIM 中添加了 PVC namespace/name
最后,我們啟動一個 NG 來,檢驗下是否能成功掛載此卷。
五、創建 Deployment 配置
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-nfs-deploy spec: replicas: 2 selector: matchLabels: # spec.selector.matchLabels 要與 spec.template.metadata.labels 匹配!!!!不匹配不能啟動 k8s-app: nginx-deploy-selector-labels template: metadata: labels: # Pod副本擁有的標簽,對應RC的Selector k8s-app: nginx-deploy-selector-labels spec: containers: - name: my-nginx image: nginx imagePullPolicy: IfNotPresent volumeMounts: - mountPath: "/usr/share/nginx/html" name: bxy-pv # spec.template.spec.containers.name.volumeMounts.name == spec.template.spec.volumes.name volumes: #持久卷相關連部分 - name: bxy-pv #PersistentVolume metadata.name persistentVolumeClaim: claimName: bxy-pvc #PersistentVolumeClaim metadata.name # Claim 必須位於使用它的 Pod 所在的同一名字空間內。
沒啥好解釋的,注釋基本都寫了,可能有部分不是很准確,自行在摸索吧。
啟動:kubectl create -f nginx-nfs-deploy.taml
掛載很成功,沒啥好說的,畢竟已經實驗多次了。
對了,這里沒有 Port 相關的配置,會在下面寫一個 Service 來做端口映射配置
在看下具體的 Pod 吧。
兩個 NG 很健康
這個是 Pod 的 Events ,可以看到這個 Pod 被調度到 k8s-node02 上面了,創建啟動啥的都和正常,沒啥毛病。
下面就是讓這個 NG 可以在外網能夠訪問。
六、創建 Service 配置
apiVersion: v1 kind: Service metadata: labels: k8s-app: nginx-svc-labels name: nginx-nfs namespace: default spec: clusterIP: 10.101.138.35 #集群內部IP externalTrafficPolicy: Cluster #Cluster或者Local(Local 流量不會轉發到其他節點) ports: - nodePort: 29606 #NodePort,外部訪問的端口 port: 19606 #容器間,服務調用的端口 protocol: TCP targetPort: 80 #容器暴露的端口,與Dockerfile暴露端口保持一致 selector: k8s-app: nginx-deploy-selector-labels #此標簽要與deploy中的 spec.selector.matchLabels 匹配 type: LoadBalancer
spec.clusterIP 這個是我手動添加的,只要在 k8s flannel 網段類就可以了
基本上都注釋的很詳細了,也不再說啥了。
啟動看看吧。
沒啥問題,訪問下看看
嗯,是訪問到了,但是沒有文件,這個我們在 掛載目錄下添加個文件試試效果,順便也能確認下我們的掛載卷是否生效了
在訪問下,看看效果。。。
三台服務器都能訪問 NG ,這個就是 Service 中的配置效果。
老鐵,沒毛病吧。