Pod數據持久化 node
k8s中的volume提供了在容器中掛載外部存儲的能力,Pod須要設置捲來源(spec.volume)和掛載點(spec.containers.volumeMounts)這兩個信息後
才能夠使用相應的volumegit
官方對volume的介紹:web
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 中的每一個容器必須獨立地指定每一個卷的掛載位置。redis
Kubernetes 支持下列類型的卷:docker
參考地址:https://v1-17.docs.kubernetes.io/zh/docs/concepts/storage/volumes/#volume-%E7%9A%84%E7%B1%BB%E5%9E%8Bvim
卷類型的簡單分類:centos
1 本地卷:只在當前節點使用,沒法跨節點使用 hostPath emptyDir
2 網絡卷:在任意節點均可以訪問到:nfs rbd cephfs glusterfs
3 公有云卷: awsElasticBlockStore azureDisk
4 k8s資源: secret configMapapi
emptyDir的使用介紹bash
在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 / #