設定 Pod 以使用 Volume 進行儲存

本頁說明如何設定 Pod 以使用 Volume 進行儲存。

容器的檔案系統僅在容器存在期間存在。因此,當容器終止並重新啟動時,檔案系統變更會遺失。為了獲得更一致且獨立於容器的儲存,您可以使用 Volume。這對於有狀態應用程式(例如鍵值儲存區 (如 Redis) 和資料庫)尤其重要。

準備開始

您需要有一個 Kubernetes 叢集,並且必須設定 kubectl 命令列工具以與您的叢集通訊。建議在至少有兩個節點且未充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個,或者您可以使用以下 Kubernetes 練習場之一

若要檢查版本,請輸入 kubectl version

為 Pod 設定 Volume

在本練習中,您會建立一個執行一個容器的 Pod。此 Pod 具有 emptyDir 類型的 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: {}
  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 的 restartPolicyAlways

  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
    

下一步

  • 請參閱 Volume

  • 請參閱 Pod

  • 除了 emptyDir 提供的本機磁碟儲存外,Kubernetes 還支援許多不同的網路附加儲存解決方案,包括 GCE 上的 PD 和 EC2 上的 EBS,這些是關鍵資料的首選,並且將處理諸如在節點上掛載和卸載裝置等詳細資訊。如需更多詳細資訊,請參閱 Volumes

上次修改時間:2023 年 8 月 24 日下午 6:38 PST:Use code_sample shortcode instead of code shortcode (e8b136c3b3)