配置 Pod 使用 Volume 进行存储
本页面展示如何配置 Pod 使用 Volume 进行存储。
容器的文件系统只与其生命周期绑定。因此,当容器终止并重启时,文件系统的更改会丢失。为了获得独立于容器的更一致的存储,你可以使用 Volume。这对于有状态应用程序尤其重要,例如键值存储(如 Redis)和数据库。
准备开始
你需要拥有一个 Kubernetes 集群,并且 kubectl 命令行工具已配置为与你的集群通信。建议在至少有两个非控制平面主机的节点上运行本教程。如果你还没有集群,可以使用 minikube 创建一个,或者使用以下 Kubernetes 演练场之一:
要检查版本,输入 kubectl version
。
为 Pod 配置 Volume
在本练习中,你将创建一个运行单个容器的 Pod。此 Pod 具有一个 emptyDir 类型的 Volume,该 Volume 持续存在于 Pod 的整个生命周期,即使容器终止并重启也是如此。以下是该 Pod 的配置文件:
apiVersion: v1
kind: Pod
metadata:
name: redis
spec:
containers:
- name: redis
image: redis
volumeMounts:
- name: redis-storage
mountPath: /data/redis
volumes:
- name: redis-storage
emptyDir: {}
创建 Pod
kubectl apply -f https://k8s.io/examples/pods/storage/redis.yaml
验证 Pod 的容器正在运行,然后查看 Pod 的变化:
kubectl get pod redis --watch
输出类似于:
NAME READY STATUS RESTARTS AGE redis 1/1 Running 0 13s
在另一个终端中,获取正在运行的容器的 shell:
kubectl exec -it redis -- /bin/bash
在你的 shell 中,进入
/data/redis
目录,然后创建一个文件:root@redis:/data# cd /data/redis/ root@redis:/data/redis# echo Hello > test-file
在你的 shell 中,列出正在运行的进程:
root@redis:/data/redis# apt-get update root@redis:/data/redis# apt-get install procps root@redis:/data/redis# ps aux
输出类似于:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND redis 1 0.1 0.1 33308 3828 ? Ssl 00:46 0:00 redis-server *:6379 root 12 0.0 0.0 20228 3020 ? Ss 00:47 0:00 /bin/bash root 15 0.0 0.0 17500 2072 ? R+ 00:48 0:00 ps aux
在你的 shell 中,杀死 Redis 进程:
root@redis:/data/redis# kill <pid>
其中
<pid>
是 Redis 进程 ID (PID)。在原始终端中,查看 Redis Pod 的变化。最终,你会看到类似如下输出:
NAME READY STATUS RESTARTS AGE redis 1/1 Running 0 13s redis 0/1 Completed 0 6m redis 1/1 Running 1 6m
此时,容器已经终止并重启。这是因为 Redis Pod 的 restartPolicy 设置为 Always
。
进入重启后的容器的 shell:
kubectl exec -it redis -- /bin/bash
在你的 shell 中,进入
/data/redis
目录,并验证test-file
文件仍然存在。root@redis:/data/redis# cd /data/redis/ root@redis:/data/redis# ls test-file
删除为本次练习创建的 Pod:
kubectl delete pod redis