Kubernetes 臨時存儲須要限制嗎?

臨時存儲簡介

Node節點一般還能夠具備本地的臨時性存儲,由本地掛載的可寫入設備或者 RAM來提供支持。臨時(Ephemeral) 意味着對所存儲的數據不提供長期可用性的保證。html

Pods 一般能夠使用臨時性本地存儲來實現緩衝區、保存日誌等功能。kubelet 能夠爲使用本地臨時存儲的 Pods 提供這種存儲空間,容許後者使用 emptyDir 類型的卷將其掛載到容器中。node

kubelet 也使用此類存儲來保存節點層面的容器日誌容器鏡像文件以及運行中容器的可寫入層web

臨時存儲有哪些

  • 本地臨時存儲(local ephemeral storage)
  • emptyDir

本地臨時存儲(local ephemeral storage):Kubernetes在1.8的版本中引入了一種相似於CPU,內存的新的資源模式:ephemeral-storage,而且在1.10版本kubelet中默認打開這個特性。ephemeral-storage是爲管理和調度Kubernetes中運行的應用短暫存儲。面試

emptyDir:emptyDir 類型Volume在Pod分配到Node上時被建立,Kubernetes會在Node節點上自動分配一個目錄,所以無需指定宿主機Node上對應的目錄文件。這個目錄初始內容爲空,當Pod從Node上移除時,emptyDir中的數據會被永久刪除。docker

註釋:容器的 crashing 事件並不會致使 emptyDir 中的數據被刪除。api

臨時存儲默認存儲在哪一個位置?

在每一個 Kubernetes Node節點 上,kubelet 默認根目錄是 /var/lib/kubelet 和 日誌目錄 /var/log 保存在節點的系統分區上,這個分區同時也會被Pod的 EmptyDir 類型的 volume容器日誌鏡像層容器的可寫層所佔用ephemeral-storage 即是對系統分區進行管理。微信

臨時存儲須要限制嗎?

答案是 須要限制,從上文了解到,臨時存儲默認根目錄是在 /var/lib/kubelet 中,/var 通常狀況都是在系統根分區中,而且根分區磁盤通常不會很大(阿里雲ECS系統盤默認爲 40G),這就必須限制,爲系統預留足夠的磁盤空間來支持正常運行。上文也說到,臨時存儲也能夠使用 RAM,那就更應該限制,內存是一種很是有限的資源。app

Node節點設置臨時存儲使用大小

Node節點上的 kubelet 組件啓動時,kubelet會統計當前節點默認 /var/lib/kubelet 所在的分區可分配的磁盤資源,或者你能夠覆蓋節點上kubelet的配置來自定義可分配的資源。建立Pod時會根據存儲需求調度到知足存儲的節點,Pod使用超過限制的存儲時會對其作驅逐處理來保證不會耗盡節點上的磁盤空間。運維

注意:若是運行時指定了別的獨立的分區,好比修改了docker的鏡像層和容器可寫層的存儲位置(默認是/var/lib/docker)所在的分區,將再也不將其計入 ephemeral-storage 的消耗。編輯器

kubelet 以下配置,限制Node節點上臨時存儲能使用多大磁盤空間

# Node 資源保留
  nodefs.available: 10% # 給 /var/lib/kubelet 所在分區保留 10% 磁盤空間
  nodefs.inodesFree: 5% # 給 /var/lib/kubelet 所在分區保留 5% inodes

臨時存儲限制使用舉例

限制磁盤本地臨時存儲

apiVersion: v1
kind: Pod
metadata:
  name: test-storage
  labels:
    app: test-storage
spec:
  containers:
  - name: busybox
    image:  busybox
    command: ["sh", "-c", "while true; do dd if=/dev/zero of=$(date '+%s').out count=1 bs=30MB; sleep 1; done"] # 使用dd命令持續往容器寫數據
    resources:
      limits:
        ephemeral-storage: 300Mi #定義存儲的限制爲300Mi
      requests:
        ephemeral-storage: 300Mi

容器使用磁盤超過 300Mi,被 kubelet 驅逐。具體請見下圖

限制內存臨時存儲

emptyDir 也是一種臨時存儲,所以也須要限制使用。

在Pod級別檢查臨時存儲使用量時,也會將 emptyDir 的使用量計算在內,所以若是對 emptyDir 使用過量後,也會致使該Pod被 kubelet Evict

另外,emptyDir自己也能夠設置容量上限。指定 emptyDir 使用內存做爲存儲介質,這樣用戶能夠得到極好的讀寫性能,可是因爲內存比較珍貴,只提供了 128Mi 的空間,當用戶在 /cache-data 目錄下使用超過64Mi後,該Pod會被 kubelet 驅逐。

        volumeMounts:
        - mountPath: /cache-data
          name: cache-data-volume
      volumes:
      - emptyDir:
          medium: Memory
          sizeLimit: 128Mi
        name: cache-data-volume

參考連接

  • https://kubernetes.io/zh/docs/concepts/configuration/manage-resources-containers/
  • https://developer.aliyun.com/article/594066
  • https://ieevee.com/tech/2019/05/23/ephemeral-storage.html

熱門文章推薦

最後

  • 歡迎您加我微信【 ypxiaozhan01】,拉您進技術羣,一塊兒交流學習...
  • 歡迎您關注【 YP小站】,學習互聯網最流行的技術,作個專業的技術人...

  【文章讓您有收穫,👇  或者 在看 支持我吧】

本文分享自微信公衆號 - YP小站(ypxiaozhan)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索