Pod資料持久化
k8s中的volume提供了在容器中掛載外部存盤的能力,Pod需要設定卷來源(spec.volume)和掛載點(spec.containers.volumeMounts)這兩個資訊后
才可以使用相應的volume
官方對volume的介紹:
Docker 也有 Volume 的概念,但對它只有少量且松散的管理, 在 Docker 中,Volume 是磁盤上或者另外一個容器內的一個目錄, 直到最近,Docker 才支持對基于本地磁盤的 Volume 的生存期進行管理, 雖然 Docker 現在也能提供 Volume 驅動程式,但是目前功能還非常有限(例如,截至 Docker 1.7,每個容器只允許有一個 Volume 驅動程式,并且無法將引數傳遞給卷),另一方面,Kubernetes 卷具有明確的生命周期——與包裹它的 Pod 相同, 因此,卷比 Pod 中運行的任何容器的存活期都長,在容器重新啟動時資料也會得到保留, 當然,當一個 Pod 不再存在時,卷也將不再存在,也許更重要的是,Kubernetes 可以支持許多型別的卷,Pod 也能同時使用任意數量的卷,卷的核心是包含一些資料的目錄,Pod 中的容器可以訪問該目錄, 特定的卷型別可以決定這個目錄如何形成的,并能決定它支持何種介質,以及目錄中存放什么內容,使用卷時, Pod 宣告中需要提供卷的型別 (.spec.volumes 欄位)和卷掛載的位置 (.spec.containers.volumeMounts 欄位).容器中的行程能看到由它們的 Docker 鏡像和卷組成的檔案系統視圖, Docker 鏡像 位于檔案系統層次結構的根部,并且任何 Volume 都掛載在鏡像內的指定路徑上, 卷不能掛載到其他卷,也不能與其他卷有硬鏈接, Pod 中的每個容器必須獨立地指定每個卷的掛載位置,
Kubernetes 支持下列型別的卷:
- awsElasticBlockStore
- azureDisk
- azureFile
- cephfs
- cinder
- configMap
- csi
- downwardAPI
- emptyDir
- fc (fibre channel)
- flexVolume
- flocker
- gcePersistentDisk
- gitRepo (deprecated)
- glusterfs
- hostPath
- iscsi
- local
- nfs
- persistentVolumeClaim
- projected
- portworxVolume
- quobyte
- rbd
- scaleIO
- secret
- storageos
- vsphereVolume
參考地址:https://v1-17.docs.kubernetes.io/zh/docs/concepts/storage/volumes/#volume-%E7%9A%84%E7%B1%BB%E5%9E%8B
卷型別的簡單分類:
1 本地卷:只在當前節點使用,無法跨節點使用 hostPath emptyDir
2 網路卷:在任意節點都可以訪問到:nfs rbd cephfs glusterfs
3 公有云卷: awsElasticBlockStore azureDisk
4 k8s資源: secret configMap
emptyDir的使用介紹
在pod的宿主機上創建目錄,掛載到Pod中的容器,Pod洗掉該卷也會被洗掉,
應用場景: pod 中容器之間的資料共
環境準備:為了方便測驗需要把當前環境中的所有pod洗掉掉
1 [root@master ~]# kubectl get pod 2 NAME READY STATUS RESTARTS AGE 3 mypod 1/1 Running 2 3d1h 4 mypod2 1/1 Running 2 3d 5 mypod3 0/1 Completed 0 2d23h 6 web-5dcb957ccc-44rdl 1/1 Running 5 10d 7 web-5dcb957ccc-qpndh 1/1 Running 5 10d 8 web1-7f87dfbd56-6lckc 1/1 Running 2 3d10h 9 web2-7585bfb769-bfr9b 1/1 Running 2 3d10h 10 [root@master ~]# 11 [root@master ~]# kubectl delete $(kubectl get deploy -o name) 12 [root@master ~]# kubectl delete $(kubectl get pod -o name)
用yaml創建一個Pod,pod中有兩個容器,兩個容器之間通過emptyDir來共享資料
1 root@master ~]# vim pod.yaml 2 apiVersion: v1 3 kind: Pod #定義一個Pod資源 4 metadata: 5 name: my-pod #Pod的名字是my-pod 6 spec: 7 containers: #創建兩個容器,容器的名字分別是write,read 8 - name: write 9 image: centos 10 command: ["bash","-c","for i in {1..100};do echo $i >> /data/hello;sleep 1;done"] 11 volumeMounts: #在容器中掛載一個卷 12 - name: data #卷的名字是data 13 mountPath: /data #把卷掛載到容器中的/data目錄下 14 15 - name: read 16 image: centos 17 command: ["bash","-c","tail -f /data/hello"] 18 volumeMounts: 19 - name: data 20 mountPath: /data 21 22 volumes: #在pod中創建一個卷,注意這個卷要與containers同級 23 - name: data #卷的名字是data 24 emptyDir: {} #卷的型別是emptyDir, "{}"可以省略 25 26 [root@master ~]# 27 [root@master ~]# kubectl apply -f pod.yaml 28 [root@master ~]# kubectl get pod 29 NAME READY STATUS RESTARTS AGE 30 my-pod 2/2 Running 0 75s 31 [root@master ~]# 32 #在pod的write容器查看寫入的資料, 33 #在pod的read容器中查看是否有資料 34 [root@master ~]# kubectl exec -it my-pod -c write -- sh 35 sh-4.4# ls /data 36 hello 37 sh-4.4# tail /data 38 tail: error reading '/data': Is a directory 39 sh-4.4# tail /data/hello 40 49 41 50 42 51 43 sh-4.4# 44 [root@master ~]# kubectl exec -it my-pod -c read -- sh 45 sh-4.4# tail /data/hello 46 2 47 3 48 4 49 sh-4.4# 50 #如何查看這個共享卷在宿主機上的物理目錄? 51 #首先確認這個Pod當前在哪個node上 52 [root@master ~]# kubectl get pods -o wide 53 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES 54 my-pod 2/2 Running 6 17m 10.244.2.99 node2 <none> <none> 55 [root@master ~]# 56 #在node2的節點上查看kubelet的目錄 57 [root@node2 ~]# cd /var/lib/kubelet/ 58 [root@node2 kubelet]# ls 59 config.yaml cpu_manager_state device-plugins kubeadm-flags.env pki plugins plugins_registry pod-resources pods 60 [root@node2 kubelet]# cd pods 61 [root@node2 pods]# ls #在這個目錄下查看pod的原資料,以下資料是以podID為目錄名 62 41874bad-9f46-4417-b96c-6f41fd566ce1 c563f58d-dd2e-4937-867f-66d06ccc606d 63 5b2d78d8-0782-47c9-bf3f-202105824dee c87f53c4-5cc2-4842-910d-7206e636d83f 64 [root@node2 pods]# 65 #在當前node節點上查看my-pod的PodID為k8s_read_my-pod_default_5b2d78d8-0782-47c9-bf3f-202105824dee_0 66 67 [root@node2 pods]# docker ps | grep pod 68 69 a1eb18196f87 centos "bash -c 'tail -f /d…" About an hour ago Up About an hour k8s_read_my-pod_default_5b2d78d8-0782-47c9-bf3f-202105824dee_0 70 c16f2df96115 registry.aliyuncs.com/google_containers/pause:3.2 "/pause" About an hour ago Up About an hour k8s_POD_my-pod_default_5b2d78d8-0782-47c9-bf3f-202105824dee_0 71 [root@node2 pods]# 72 #在node2這個節點上進入5b2d78d8-0782-47c9-bf3f-202105824dee目錄查看 73 [root@node2 pods]# cd 5b2d78d8-0782-47c9-bf3f-202105824dee/ 74 [root@node2 5b2d78d8-0782-47c9-bf3f-202105824dee]# ls 75 containers etc-hosts plugins volumes 76 [root@node2 5b2d78d8-0782-47c9-bf3f-202105824dee]# cd volumes/ 77 [root@node2 volumes]# ls 78 kubernetes.io~empty-dir kubernetes.io~secret 79 [root@node2 volumes]# ls ./kubernetes.io~empty-dir/data/hello 80 ./kubernetes.io~empty-dir/data/hello 81 [root@node2 data]# pwd #以下目錄就是my-pod中兩個容器中的/data的物理目錄 82 /var/lib/kubelet/pods/5b2d78d8-0782-47c9-bf3f-202105824dee/volumes/kubernetes.io~empty-dir/data
hostPath
掛載Node檔案系統上檔案或者目錄到pod的容器中
應用場景:Pod中容器需要訪問宿主機檔案,只能給當前節點的pod訪問使用
1 [root@master ~]# vim pod-hostpath.yaml 2 3 apiVersion: v1 4 kind: Pod 5 metadata: 6 name: my-pod 7 spec: 8 containers: 9 - name: busybox 10 image: busybox 11 args: 12 - /bin/sh 13 - -c 14 - sleep 36000 15 volumeMounts: 16 - name: data 17 mountPath: /data 18 volumes: #定義一個卷 19 - name: data #卷的名字是data 20 hostPath: 21 path: /tmp #卷在宿主機上的地址是/tmp 22 type: Directory #卷的型別是一個目錄 23 24 [root@master ~]# kubectl apply -f pod-hostpath.yaml 25 pod/my-pod2 created 26 [root@master ~]# 27 [root@master ~]# kubectl get pod 28 NAME READY STATUS RESTARTS AGE 29 my-pod 2/2 Running 32 3h12m 30 my-pod2 1/1 Running 0 78s 31 [root@master ~]# #查看pod所在的node節點 32 [root@master ~]# kubectl get pod -o wide 33 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES 34 my-pod 2/2 Running 44 4h35m 10.244.2.99 node2 <none> <none> 35 my-pod2 1/1 Running 0 84m 10.244.2.100 node2 <none> <none> 36 [root@master ~]# #在node2節點的/data目錄下創建一個檔案a.txt 37 #在my-pod2的容器中查看/data目錄是否有這個檔案 38 [root@node2 ~]# touch /tmp/a.txt 39 [root@node2 ~]# 40 [root@master ~]# kubectl exec -it my-pod2 -- sh 41 / # ls /data 42 a.txt 43 / #
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/260250.html
標籤:其他
上一篇:機器學習入門實戰——基于knn的airbnb房租預測
下一篇:pod的資料持久化2 NFS
