hostPath
hostPath 卷能將主機節點文件系統上的文件或目錄掛載到您的 Pod 中
代碼示例:
kind: Deployment metadata: name: nginx-pod namespace: default spec: replicas: 3 template: metadata: labels: k8s-app: nginx-pod spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent volumeMounts: # 在容器中的路徑 node節點上的內容被關聯到 pod containr的 /test-pd路徑下 exec進入pod容器的路徑內可以看到節點上的內容 - mountPath: /test-pod name: test-volume volumes: - name: test-volume hostPath: #directory location on host 綁定的節點的文件路徑 path: /data # this field is optional 類型為目錄,此目錄必須存在 type: Directory --- apiVersion: v1 kind: Service metadata: name: nginx-svc namespace: default spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 32000 selector: k8s-app: nginx-pod
k8存儲介紹之 PV PVC
PV全稱叫做PersistentVolume ,持久化存儲卷。它是用來描述或者說用來定義一個存儲卷的。
PersistentVolumeClaim 持久卷聲明 (PVC)
PVC全稱 PersistentVolumeClaim 是用來描述希望使用什么樣的或者說是滿足什么條件的存儲,也就是持久化存儲聲明。使用這個來描述該容器需要一個什么存儲。比如下面使用NFS的PVC:
Persistent Volume主要是為了管理集群的存儲,供pod通過pvc來申請使用.
自己的理解是這樣的.
在存儲卷上面創建PV持久卷,pod 通過pvc申請pv資源,來供pod使用,大概就是這樣的調用邏輯.調用拓撲圖如下:
實驗示例:
使用nfs類型的PV,並使用Deployment部署nginx服務來驗證PV創建是否創建成功.
一、安裝nfs服務
在k8s master節點 上創建nfs服務器,用於提供存儲
1、安裝nfs服務端: # yum install nfs-utils rpcbind 2、創建用於nfs服務的存儲文件夾: # mkdir -p /data/nfs-server 3、編輯/etc/exports文件: [root@k8s-master ~]# vim /etc/exports /data/nfs-server 192.168.10.0/24(rw,async) 4、開啟nfs服務: # systemctl start nfs-server.service 檢驗是否開啟成功: [root@k8s-master ~]# showmount -e Export list for k8s-master: /data/nfs-server 192.168.10.0/24 [root@k8s-master ~]# #創建好nfs服務后不需要再客戶端掛載,保證nfs服務端服務正常即可.
二、創建pv對象
1、編輯pv資源的配置文件,文件如下:
[root@k8s-master ~]# cat pv.yaml --- apiVersion: v1 kind: PersistentVolume metadata: name: nfs-testpv labels: name: nfs-testpv spec: #指定pv為nfs服務器上對應的目錄 nfs: path: /data/nfs-server server: 192.168.10.10 #指定pv的回收策略,即pvc資源釋放后的事件,recycle刪除pvc的所有文件(不建議生產環境使用) persistentVolumeReclaimPolicy: Recycle #pv存儲類名稱 storageClassName: mynfs-pv #指定訪問模式 accessModes: - ReadWriteOnce # 設置存儲空間大小 capacity: storage: 2Gi [root@k8s-master ~]#
accessModes:支持三種類型
-
ReadWriteMany 多路讀寫,卷能被集群多個節點掛載並讀寫
-
ReadWriteOnce 單路讀寫,卷只能被單一集群節點掛載讀寫
-
ReadOnlyMany 多路只讀,卷能被多個集群節點掛載且只能讀
2、創建該PV資源:
[root@k8s-master ~]# kubectl apply -f pv.yaml persistentvolume/nfs-testpv created [root@k8s-master ~]#
3、查看該pv資源:
[root@k8s-master ~]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE nfs-testpv 2Gi RWO Recycle Available mynfs-pv 52s
至此,PV資源創建成功,接下來創建pvc,供pod來申請使用
三、創建pvc資源
1、編輯pvc資源配置文件:
[root@k8s-master ~]# cat pvc.yaml kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nfs-testpvc spec: # PVC也需要定義訪問模式,不過它的模式一定是和現有PV相同或者是它的子集,否則匹配不到PV. accessModes: - ReadWriteOnce # 定義資源要求PV滿足這個PVC的要求才會被匹配到 resources: requests: storage: 2Gi storageClassName: mynfs-pv [root@k8s-master ~]#
這個PVC就會和上面的PV進行綁定,它也有一些原則:
1>.PV和PVC中的spec關鍵字段要匹配,比如存儲(storage)大小,訪問模式.
2>. PV和PVC中的storageClassName字段必須一致.
2、應用pvc配置文件:
[root@k8s-master ~]# kubectl apply -f pvc.yaml
persistentvolumeclaim/nfs-testpvc created
3、查看該pvc資源:
[root@k8s-master ~]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nfs-testpvc Bound nfs-testpv 2Gi RWO mynfs-pv 5m1s
到這里,pvc也就創建完成了,接下來就是pod怎么去使用pvc.
四、創建nginx pod資源,使用pvc存儲.
1、這里使用 Deployment 創建3副本的nginx pod,使用volumes來綁定pvc的信息,並創建svc來訪問pod來驗證.
[root@k8s-master ~]# cat pvc-pod-nginx.yml apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-pod namespace: default spec: replicas: 3 template: metadata: labels: k8s-app: nginx-pod spec: containers: - name: nginx image: nginx #容器策略 imagePullPolicy: IfNotPresent #容器內部的掛載點,就是將pvc的卷掛載到pod容器的這個目錄下. volumeMounts: - mountPath: /usr/share/nginx/html/ name: test-volume #這里是掛載卷部分,這是最最最重點部分,volumes name 要和volumeMounts name名稱一致,claimName為pvc的名稱. volumes: - name: test-volume persistentVolumeClaim: claimName: nfs-testpvc --- apiVersion: v1 kind: Service metadata: name: nginx-svc namespace: default spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 32000 selector: k8s-app: nginx-pod [root@k8s-master ~]#
2、創建nginx pod及svc
root@k8s-master ~]# kubectl apply -f pvc-pod-nginx.yml
3、查看pod及svc創建信息.
root@k8s-master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-pod-5bdcc49bb7-6f7b7 1/1 Terminating 1 57m 10.244.2.44 k8s-node01 <none> <none> nginx-pod-5bdcc49bb7-8grz9 1/1 Terminating 1 57m 10.244.2.45 k8s-node01 <none> <none> nginx-pod-5bdcc49bb7-dxn56 1/1 Running 0 57m 10.244.3.55 k8s-node02 <none> <none> nginx-pod-5bdcc49bb7-mz9cm 1/1 Running 0 43m 10.244.3.58 k8s-node02 <none> <none> nginx-pod-5bdcc49bb7-tcx48 1/1 Running 0 43m 10.244.3.57 k8s-node02 <none> <none> [root@k8s-master ~]# kubectl get svc -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR nginx-svc NodePort 10.1.131.6 <none> 80:32000/TCP 58m k8s-app=nginx-pod
由於我是將nfs的 /data/nfs-server目錄作為pvc申請的存儲掛載到nginx pod的訪問目錄下,所以我在/data/nfs-server目錄創建一個index.html文件,nginx是可以訪問到的
root@k8s-master ~]# cat /data/nfs-server/index.html
hello pvc
[root@k8s-master ~]#
我的pod都是在node2節點上面,所以我用node2節點的ip:32000就可以訪問到我定義的index.html內容.
至此,pod使用pvc完成,這種是靜態pv使用的申請,后面會在總結pv動態申請,此處明白使用的方法和內在邏輯就可以.