配置 Pod 以使用卷进行存储

此页面展示了如何配置 Pod 以使用卷进行存储。

只要容器存在,容器的文件系统就会存在,因此当一个容器终止并重新启动,对该容器的文件系统改动将丢失。 对于独立于容器的持久化存储,你可以使用。 这对于有状态应用程序尤为重要,例如键值存储(如 Redis)和数据库。

准备开始

你必须拥有一个 Kubernetes 的集群,且必须配置 kubectl 命令行工具让其与你的集群通信。 建议运行本教程的集群至少有两个节点,且这两个节点不能作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面的 Kubernetes 练习环境之一:

要获知版本信息,请输入 kubectl version.

为 Pod 配置卷

在本练习中,你将创建一个运行 Pod,该 Pod 仅运行一个容器并拥有一个类型为 emptyDir 的卷, 在整个 Pod 生命周期中一直存在,即使 Pod 中的容器被终止和重启。以下是 Pod 的配置:

  1. pods/storage/redis.yaml
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: redis
  5. spec:
  6. containers:
  7. - name: redis
  8. image: redis
  9. volumeMounts:
  10. - name: redis-storage
  11. mountPath: /data/redis
  12. volumes:
  13. - name: redis-storage
  14. emptyDir: {}
  1. 创建 Pod:

    1. kubectl apply -f https://k8s.io/examples/pods/storage/redis.yaml
  2. 验证 Pod 中的容器是否正在运行,然后留意 Pod 的更改:

    1. kubectl get pod redis --watch

    输出如下:

    1. NAME READY STATUS RESTARTS AGE
    2. redis 1/1 Running 0 13s
  3. 在另一个终端,用 Shell 连接正在运行的容器:

    1. kubectl exec -it redis -- /bin/bash
  4. 在你的 Shell 中,切换到 /data/redis 目录下,然后创建一个文件:

    1. root@redis:/data# cd /data/redis/
    2. root@redis:/data/redis# echo Hello > test-file
  5. 在你的 Shell 中,列出正在运行的进程:

    1. root@redis:/data/redis# apt-get update
    2. root@redis:/data/redis# apt-get install procps
    3. root@redis:/data/redis# ps aux

    输出类似于:

    1. USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    2. redis 1 0.1 0.1 33308 3828 ? Ssl 00:46 0:00 redis-server *:6379
    3. root 12 0.0 0.0 20228 3020 ? Ss 00:47 0:00 /bin/bash
    4. root 15 0.0 0.0 17500 2072 ? R+ 00:48 0:00 ps aux
  6. 在你的 Shell 中,结束 Redis 进程:

    1. root@redis:/data/redis# kill <pid>

    其中 <pid> 是 Redis 进程的 ID (PID)。

  7. 在你原先终端中,留意 Redis Pod 的更改。最终你将会看到和下面类似的输出:

    1. NAME READY STATUS RESTARTS AGE
    2. redis 1/1 Running 0 13s
    3. redis 0/1 Completed 0 6m
    4. redis 1/1 Running 1 6m

此时,容器已经终止并重新启动。这是因为 Redis Pod 的 restartPolicyAlways

  1. 用 Shell 进入重新启动的容器中:

    1. kubectl exec -it redis -- /bin/bash
  2. 在你的 Shell 中,进入到 /data/redis 目录下,并确认 test-file 文件是否仍然存在。

    1. root@redis:/data/redis# cd /data/redis/
    2. root@redis:/data/redis# ls
    3. test-file
  3. 删除为此练习所创建的 Pod:

    1. kubectl delete pod redis

接下来

  • 参阅 Volume
  • 参阅 Pod
  • 除了 emptyDir 提供的本地磁盘存储外,Kubernetes 还支持许多不同的网络附加存储解决方案, 包括 GCE 上的 PD 和 EC2 上的 EBS,它们是关键数据的首选,并将处理节点上的一些细节, 例如安装和卸载设备。了解更多详情请参阅