配置 Pod 使用卷进行存储

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

容器的文件系统仅在容器存在时才存在。因此,当容器终止并重新启动时,文件系统更改将丢失。为了获得独立于容器的更一致的存储,您可以使用 。这对有状态应用程序特别重要,例如键值存储(如 Redis)和数据库。

在您开始之前

您需要有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少有两个节点(不充当控制平面主机)的集群上运行本教程。如果您还没有集群,可以使用 minikube 创建一个,或者您可以使用以下 Kubernetes playground 中的一个

要检查版本,请输入 kubectl version

为 Pod 配置卷

在本练习中,您将创建一个运行一个容器的 Pod。此 Pod 具有一个类型为 emptyDir 的卷,该卷在 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: {}
  1. 创建 Pod

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

    kubectl get pod redis --watch
    

    输出类似于以下内容

    NAME      READY     STATUS    RESTARTS   AGE
    redis     1/1       Running   0          13s
    
  3. 在另一个终端中,获取到正在运行的容器的 shell

    kubectl exec -it redis -- /bin/bash
    
  4. 在您的 shell 中,转到 /data/redis,然后创建一个文件

    root@redis:/data# cd /data/redis/
    root@redis:/data/redis# echo Hello > test-file
    
  5. 在您的 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
    
  6. 在您的 shell 中,杀死 Redis 进程

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

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

  7. 在您最初的终端中,观察 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 的 重启策略Always

  1. 获取到已重新启动的容器的 shell

    kubectl exec -it redis -- /bin/bash
    
  2. 在您的 shell 中,转到 /data/redis,并验证 test-file 是否仍然存在。

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

    kubectl delete pod redis
    

下一步

  • 参见

  • 参见 Pod

  • 除了 emptyDir 提供的本地磁盘存储之外,Kubernetes 还支持许多不同的网络连接存储解决方案,包括 GCE 上的 PD 和 EC2 上的 EBS,它们更适合于关键数据,并将处理诸如在节点上挂载和卸载设备之类的细节。有关更多详细信息,请参见

上次修改时间:2023 年 8 月 24 日下午 6:38 PST:使用 code_sample 短代码代替 code 短代码 (e8b136c3b3)