iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
DevOps

新創視角下的 DevOps × AI 探索系列 第 18

Day 18: Volume 基礎:EmptyDir、HostPath

  • 分享至 

  • xImage
  •  

在前一篇我們聊到 Secret:管理敏感資訊,解決了應用程式在 Kubernetes 中如何安全地存取機密資料。
接下來要進入 持久化儲存 (PersistentVolume, PVC) 的世界之前,先讓我們回到基礎,認識 Volume 的最簡單兩種型態:EmptyDir 與 HostPath。

這篇文章會先帶你了解為什麼需要 Volume,再介紹這兩種 Volume 的特性,最後透過實作範例把它們串起來。

為什麼需要 Volume?

如果你有在容器裡存過檔案,你可能會遇到這個問題:

  • Pod 裡的容器一旦被刪除或重啟,裡面的檔案也跟著消失。
  • 想要多個容器共享資料?容器之間預設也沒辦法直接互通。

這就是為什麼需要 Volume —— 它是一個額外的掛載點,可以用來存資料或共享檔案。

常見的 Volume 類型大致可以分成三類:

  1. 暫存型:隨 Pod 存在,Pod 刪除後就消失,例如 EmptyDir。
  2. 節點綁定型:依賴 Node 上的檔案系統,例如 HostPath。
  3. 持久化型:透過 PV/PVC 跨 Pod 保存,這會在下一篇深入。

今天我們專注在前兩者。

EmptyDir

特性

  • 在 Pod 建立時產生,當 Pod 刪除時,資料會消失。
  • 適合用來存放暫存檔、快取,或讓同一個 Pod 內的多個容器共享資料。
  • 資料實際上是存在 Node 的檔案系統中,但不會跨 Pod 保留。

使用情境

  • Web 應用程式的快取資料。
  • 主容器與 Sidecar 容器共享檔案。

範例

以下是一個簡單的例子,app 容器會把文字寫到 /cache,而 sidecar 容器則會讀取同一個檔案:

apiVersion: v1
kind: Pod
metadata:
  name: emptydir-demo
spec:
  containers:
  - name: app
    image: busybox
    command: [ "sh", "-c", "echo 'Hello from app' > /cache/hello.txt && sleep 3600" ]
    volumeMounts:
    - name: cache-volume
      mountPath: /cache
  - name: sidecar
    image: busybox
    command: [ "sh", "-c", "cat /cache/hello.txt; sleep 3600" ]
    volumeMounts:
    - name: cache-volume
      mountPath: /cache
  volumes:
  - name: cache-volume
    emptyDir: {}

這樣一來,兩個容器就能透過同一個 Volume 共享資料。

HostPath

特性

  • 把 Node 上的檔案或目錄 掛載到 Pod 裡。
  • Pod 被刪除後,檔案仍會存在 Node 上。
  • 但安全性風險比較高,因為等於讓 Pod 直接接觸到 Node 的檔案系統。

使用情境

  • 偵錯或開發環境快速掛載檔案。
  • 存取 Node 上的特殊檔案,例如 /var/run/docker.sock。

範例

以下例子會把 Pod 的 log 寫到 Node 的 /var/log/hostpath-demo 資料夾裡:

apiVersion: v1
kind: Pod
metadata:
  name: hostpath-demo
spec:
  containers:
  - name: app
    image: busybox
    command: [ "sh", "-c", "echo 'Log from app' >> /logs/app.log && sleep 3600" ]
    volumeMounts:
    - name: host-logs
      mountPath: /logs
  volumes:
  - name: host-logs
    hostPath:
      path: /var/log/hostpath-demo
      type: DirectoryOrCreate

實際跑起來後,你會在 Node 上的 /var/log/hostpath-demo/app.log 找到 log 檔。

EmptyDir vs HostPath 對比

| 特性       | EmptyDir   | HostPath                   |
|------------|------------|----------------------------|
| 存活範圍   | 隨 Pod 刪除 | 存在於 Node 上              |
| 適用情境   | 暫存、快取  | 偵錯、Node 特定檔案          |
| 安全性     | 相對安全    | 風險較高(直接接觸 Node 檔案系統) |
| 生產環境建議 | ✅ 可用     | ❌ 謹慎使用                  |

實作範例:Sidecar Log Aggregation

最後來一個結合的範例:

  • app 容器:寫 log 到 EmptyDir。
  • logger 容器:讀取 EmptyDir 的 log,並寫到 HostPath,讓它存在 Node 上。

YAML 範例

apiVersion: v1
kind: Pod
metadata:
  name: volume-mix-demo
spec:
  containers:
  - name: app
    image: busybox
    command: [ "sh", "-c", "while true; do echo $(date) >> /cache/app.log; sleep 5; done" ]
    volumeMounts:
    - name: cache-volume
      mountPath: /cache
  - name: logger
    image: busybox
    command: [ "sh", "-c", "tail -f /cache/app.log >> /logs/persisted.log" ]
    volumeMounts:
    - name: cache-volume
      mountPath: /cache
    - name: host-logs
      mountPath: /logs
  volumes:
  - name: cache-volume
    emptyDir: {}
  - name: host-logs
    hostPath:
      path: /var/log/volume-mix
      type: DirectoryOrCreate

這樣就能同時體驗 EmptyDir 的容器間共享,以及 HostPath 的 Node 持久化效果。

小結

  • EmptyDir:適合暫存或 Pod 內共享資料。
  • HostPath:能直接存取 Node 檔案,但有安全風險,不建議生產環境使用。
  • 它們是 Kubernetes Volume 的基礎概念,幫助我們了解資料在 Pod 生命週期中的管理方式。
  • 下一篇,將會進入真正的持久化儲存世界:PersistentVolume (PV) 與 PersistentVolumeClaim (PVC)。

上一篇
Day 17: Secret:管理敏感資訊
下一篇
Day 19: PersistentVolume (PV) 與 PersistentVolumeClaim (PVC):持久化儲存
系列文
新創視角下的 DevOps × AI 探索22
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言