Pod的數據持久化1 hostPath 和emptyDir

 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 / # 
相關文章
相關標籤/搜索