配置 Pod 使用卷进行存储
本页展示如何配置 Pod 以使用 Volume 进行存储。
Container 的文件系统仅在其存在期间有效。因此,当 Container 终止并重新启动时,文件系统更改将会丢失。为了与 Container 无关的更持久的存储,您可以使用 Volume。这对于状态化应用程序(例如键值存储(如 Redis)和数据库)尤其重要。
开始之前
您需要一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少具有两个非控制平面主机的集群上运行本教程。如果您还没有集群,可以使用 minikube 创建一个,或者可以使用以下 Kubernetes 游乐场
要检查版本,请输入 kubectl version。
为 Pod 配置 Volume
在本练习中,您创建一个运行一个 Container 的 Pod。此 Pod 具有一种 emptyDir 类型的 Volume,该 Volume 在 Pod 的整个生命周期内都存在,即使 Container 终止并重新启动也是如此。这是 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 的 Container 是否正在运行,然后观察 Pod 的更改
kubectl get pod redis --watch输出如下所示
NAME READY STATUS RESTARTS AGE redis 1/1 Running 0 13s在另一个终端中,获取到正在运行的 Container 的 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
此时,Container 已终止并重新启动。这是因为 Redis Pod 具有一个 restartPolicy 设置为 Always。
获取到重新启动的 Container 的 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