实验手册-13-Volume

对比 emptyDir 和 hostPath 两种存储后端的区别

导图

步骤1 创建配置文件

bash

vim empty.yaml

配置文件内容:

yaml

apiVersion: v1
kind: Pod
metadata:
  name: producer-consumer
spec:
  containers:
  - image: busybox
    name: producer
    volumeMounts:
    - mountPath: /producer_dir
      name: shared-volume
    args:
    - /bin/sh
    - -c
    - echo "hello world!" > /producer_dir/hello ; sleep 30000

  - image: busybox
    name: consumer
    volumeMounts:
    - mountPath: /consumer_dir
      name: shared-volume
    args:
    - /bin/sh
    - -c
    - cat /consumer_dir/hello ; sleep 30000

  volumes:
    - name: shared-volume
      emptyDir: {}

步骤2 加载配置文件

bash

kubectl apply -f emptydir.yaml

步骤3 验证

查看创建的 Pod

bash

kubectl get pods

第二列 READY 显示为 2/2 表示两个【容器】都是 Ready 状态

查看 consumer 的日志:

bash

kubectl logs producer-consumer consumer

查找一下我们刚才创建出来的 Docker 容器:

bash

docker ps | grep busybox

红线圈起来的部分是容器的 ID,下一步会用到。

查看容器的详细信息:

bash

docker inspect 041e85c3c9d0 | grep shared -A 5 -B 3
docker inspect 

其中的 041e85c3c9d0 是容器 ID,换成你自己的

可以看到两个容器都挂载了 /var/lib/kubelet/pods/26c0356b-bbb8-4755-ae69-2fc1fa506cf0/volumes/kubernetes.io~empty-dir/shared-volume 这个目录

我们看一下这个目录中的文件内容:

bash

cat /var/lib/kubelet/pods/26c0356b-bbb8-4755-ae69-2fc1fa506cf0/volumes/kubernetes.io~empty-dir/shared-volume/hello

步骤4 删除创建的 Pod

bash

kubectl delete pod producer-consumer

步骤5 再次查看刚才的文件

bash

cat /var/lib/kubelet/pods/26c0356b-bbb8-4755-ae69-2fc1fa506cf0/volumes/kubernetes.io~empty-dir/shared-volume/hello

发现文件已经消失,所以 emptyDir 是【临时的】目录

文件不存在

步骤1 先创建一个文件夹,用来后续共享给 Pod 内的容器

bash

mkdir /root/producer_dir

步骤2 创建一个配置文件

bash

vim hostpath.yaml

文件内容为:

yaml

apiVersion: v1
kind: Pod
metadata:
  name: producer-consumer
spec:
  containers:
  - image: busybox
    name: producer
    volumeMounts:
    - mountPath: /producer_dir
      name: shared-volume
    args:
    - /bin/sh
    - -c
    - echo "hello world!" > /producer_dir/hello ; sleep 30000

  volumes:
    - name: shared-volume
      hostPath:
        path: /root/producer_dir

步骤3 加载这个配置文件

bash

kubectl apply -f hostpath.yaml

步骤4 查看创建的 Pod 是不是已经准备就绪

bash

kubectl get pods

步骤5 验证

查看目录内的文件内容

bash

cat /root/producer_dir/hello

步骤6 删除创建的 Pod

bash

kubectl delete pod producer-consumer

步骤7 再次验证

bash

cat /root/producer_dir/hello

可以发现,目录没有被删除,hostPath是持久化的目录