最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

K8S節(jié)點本地存儲被撐爆問題徹底解決方法

 更新時間:2022年11月11日 08:50:38   作者:螢火架構(gòu)  
這篇文章主要為大家介紹了K8S節(jié)點本地存儲被撐爆問題徹底解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

存儲的內(nèi)容

現(xiàn)在云原生越來越流行,很多企業(yè)都上馬了K8S,但是這里邊也有很多的坑要填,這篇文章就聊一下K8S節(jié)點本地存儲被撐爆的問題,也就是磁盤被占滿的問題。

要解決存儲使用過多的問題,就得先了解存儲中都保存了些什么內(nèi)容,否則解決不了問題,還可能帶來更多的風(fēng)險。

鏡像

容器要在節(jié)點上運行,kubelet 首先要拉取容器鏡像到節(jié)點本地,然后再根據(jù)鏡像創(chuàng)建容器。隨著Pod的調(diào)度和程序的升級,日積月累,節(jié)點本地就會保存大量的容器鏡像,占用大量存儲空間。

如果使用的是Docker容器運行時,這些文件保存在 /var/lib/docker/image/overlay2 目錄下。

可寫層

關(guān)于可寫層,了解容器本質(zhì)的同學(xué)應(yīng)該比較熟悉,容器運行時使用的是一種聯(lián)合文件系統(tǒng)技術(shù),它把鏡像中的多層合并起來,然后再增加一個可寫層,容器中寫操作的結(jié)果會保存在這一層,這一層存在于容器當(dāng)前節(jié)點的本地存儲中。雖然鏡像中的層是容器實例共享的,但是可寫層是每個容器一份。

假如我們有一個名為 mypod 的Pod實例,在其中創(chuàng)建一個文件:/hello.txt,并寫入 hello k8s 的字符。

$ kubectl exec mypod -- sh -c 'echo "hello k8s" > /hello.txt'
$ kubectl exec mypod -- cat /k8s/hello.txt
hello k8s

如果使用的是Docker容器運行時,可以在Docker的相關(guān)目錄中找到可寫層以及剛剛創(chuàng)建的這個文件,它們在  /var/lib/docker/overlay2 這個目錄下。

如果毫無節(jié)制的使用可寫層,也會導(dǎo)致大量的本地磁盤空間被占用。

日志

K8S推薦的日志輸出方式是將程序日志直接輸出到標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤,此時容器運行時會捕捉這些數(shù)據(jù),并把它們寫到本地存儲,然后再由節(jié)點上的日志代理或者Pod中的邊車日志代理轉(zhuǎn)運到獨立的日志處理中心,以供后續(xù)分析使用。

這些日志保存在節(jié)點本地的  /var/log/container 目錄下,我們可以實際創(chuàng)建一個Pod來確認(rèn)下:

apiVersion: v1
kind: Pod
metadata:
  name: pod-log-stdout
spec:
  containers:
  - name: count
    image: busybox:latest
    args: [/bin/sh, -c,
            'i=0; while true; do echo "$i: $(date) a log entry."; i=$((i+1)); usleep 1000; done']

這個Pod每隔1毫秒會寫1條數(shù)據(jù)到標(biāo)準(zhǔn)輸出。要找到容器運行時根據(jù)標(biāo)準(zhǔn)輸出創(chuàng)建的日志文件,首先要找到這個Pod部署的節(jié)點,然后登錄到這個節(jié)點,就能找到對應(yīng)的文件了。

如果程序輸出的日志很多,占滿磁盤空間就是早晚的事。

emptyDir

emptyDir 是一種基于節(jié)點本地存儲的Volume類型,它通過在本地存儲創(chuàng)建一個空目錄來實際承載Volume。使用這種存儲卷可以在Pod的多個容器之間共享數(shù)據(jù),比如一個容器造數(shù)據(jù),一個容器消費數(shù)據(jù)。

看下面這個例子:

apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-empty-dir
spec:
  containers:
  - name: count
    image: busybox:latest
    args: [/bin/sh, -c, 'echo "k8s" > /cache/k8s.txt;sleep 1800']
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

在 spec.volumes[] 中只需要添加一個名為 emptyDir 的字段,它的配置都可以使用默認(rèn)值,然后這個卷會被掛載到容器的 /cache 路徑。

容器的啟動參數(shù)是一個shell命令,它會在容器的 cache 目錄下創(chuàng)建1個名為 k8s.txt 的文件。容器創(chuàng)建后稍等一會,使用下面的命令獲取這個文件的內(nèi)容:

$ kubectl exec pod-vol-empty-dir -- cat /cache/k8s.txt
k8s

可以看到,文件內(nèi)容正是容器啟動命令中寫入的 k8s 字符。

K8S會在當(dāng)前的Node自動創(chuàng)建一個目錄來實際承載這個卷,目錄的位置在Node的  /var/lib/kubelet/pods 路徑下。要查看這個目錄中的內(nèi)容,需要先找到Pod Id和對應(yīng)的Node,然后登錄到這個Node,就能找到這個目錄了。minikube中的查找方法如下圖所示:

注意用顏色框圈出來的內(nèi)容,不同的Pod對應(yīng)的數(shù)據(jù)不同。查找Pod Id的命令:

kubectl get pods -o custom-columns=PodName:.metadata.name,PodUID:.metadata.uid,PodNode:.spec.nodeName

如果不對 emptyDir Volume 做一些限制,也是有很大的風(fēng)險會使用過多的磁盤空間。

存儲的限制方法

通過上文的介紹,我們可以看到,除了容器鏡像是系統(tǒng)機制控制的,其它的內(nèi)容都跟應(yīng)用程序有關(guān)。

應(yīng)用程序完全可以控制自己使用的存儲空間,比如少寫點日志,將數(shù)據(jù)保存到遠程存儲,及時刪除使用完畢的臨時數(shù)據(jù),使用LRU等算法控制存儲空間的使用量,等等。不過完全依賴開發(fā)者的自覺也不是一件很可靠的事,萬一有BUG呢?所以K8S也提供了一些機制來限制容器可以使用的存儲空間。

K8S的GC

K8S有一套自己的GC控制邏輯,它可以清除不再使用的鏡像和容器。這里我們重點看下對鏡像的清理。

這個清理工作是 kubelet 執(zhí)行的,它有三個參數(shù)來控制如何執(zhí)行清理:

  • imageMinimumGCAge 未使用鏡像進行垃圾回收時,其存在的時間要大于這個閾值,默認(rèn)是2分鐘。
  • imageGCHighThresholdPercent 鏡像占用的磁盤空間比例超過這個閾值時,啟動垃圾回收。默認(rèn)85。
  • ImageGCLowThresholdPercent 鏡像占用的磁盤空間比例低于這個閾值時,停止垃圾回收。默認(rèn)80。

可以根據(jù)自己的鏡像大小和數(shù)量的水平來更改這幾個閾值。

日志總量限制

K8S對寫入標(biāo)準(zhǔn)輸出的日志有一個輪轉(zhuǎn)機制,默認(rèn)情況下每個容器的日志文件最多可以有5個,每個文件最大允許10Mi,如此每個容器最多保留最新的50Mi日志,再加上Node也可以對Pod數(shù)量進行限制,日志使用的本地存儲空間就變得可控了。這個控制也是 kubelet 來執(zhí)行的,有兩個參數(shù):

  • containerLogMaxSize 單個日志文件的最大尺寸,默認(rèn)為10Mi。
  • containerLogMaxFiles 每個容器的日志文件上限,默認(rèn)為5。

以上文的 pod-log-stdout 這個Pod為例,它的日志輸出量很多就會超過10Mi,我們可以實際驗證下。

不過如果沒有意外,意外將要發(fā)生了,K8S的限制不起作用。這是因為我們使用的容器運行時是docker,docker有自己的日志處理方式,這套機制可能過于封閉,K8S無法適配或者不愿意適配??梢愿膁ocker deamon的配置來解決這個問題,在K8S Node中編輯這個文件  /etc/docker/daemon.json (如果沒有則新建),增加關(guān)于日志的配置:

{
    "log-opts": {
        "max-size": "10m",
        "max-file": "5"
    }
}

然后重啟Node上的docker:systemctl restart docker。注意還需要重新創(chuàng)建這個Pod,因為這個配置只對新的容器生效。

在docker運行時下,容器日志實際上位于 /var/lib/docker/containers 中,先找到容器Id,然后就可以觀察到這些日志的變化了:

emptyDir Volume 限制

對于emptyDir類型的卷,可以設(shè)置 emptyDir.sizeLimit,比如設(shè)置為 100Mi。

apiVersion: v1
kind: Pod
metadata:
  name: pod-vol-empty-dir-limit
spec:
  containers:
  - name: count
    image: busybox:latest
    args: [/bin/sh, -c,
            'while true; do dd if=/dev/zero of=/cache/$(date "+%s").out count=1 bs=5MB; sleep 1; done']
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir:
      sizeLimit: 100Mi

稍等幾分鐘,然后查詢Pod的事件:

可以看到 kubelet 發(fā)現(xiàn) emptyDir volume 超出了100Mi的限制,然后就把 Pod 關(guān)掉了。

臨時數(shù)據(jù)的總量限制

對于所有類型的臨時性本地數(shù)據(jù),包括 emptyDir 卷、容器可寫層、容器鏡像、日志等,K8S也提供了一個統(tǒng)一的存儲請求和限制的設(shè)置,如果使用的存儲空間超過限制就會將Pod從當(dāng)前Node逐出,從而避免磁盤空間使用過多。

然后我們創(chuàng)建一個Pod,它會每秒寫1個5M的文件,同時使用 spec.containers[].resources.requests.limits 給存儲資源設(shè)置了一個限制,最大100Mi。

apiVersion: v1
kind: Pod
metadata:
  name: pod-ephemeral-storage-limit
spec:
  containers:
  - name: count
    image: busybox:latest
    args: [/bin/sh, -c,
            'while true; do dd if=/dev/zero of=$(date "+%s").out count=1 bs=5MB; sleep 1; done']
    resources:
      requests:
        ephemeral-storage: "50Mi"
      limits:
        ephemeral-storage: "100Mi"

稍等幾分鐘,然后查詢Pod的事件:

kubectl describe pod pod-ephemeral-storage-limit

可以看到 kubelet 發(fā)現(xiàn)Pod使用的本地臨時存儲空間超過了限制的100Mi,然后就把 Pod 關(guān)掉了。

通過這些存儲限制,基本上就可以說是萬無一失了。當(dāng)然還要在節(jié)點預(yù)留足夠的本地存儲空間,可以根據(jù)Pod的數(shù)量和每個Pod最大可使用的空間進行計算,否則程序也會因為總是得不到所需的存儲空間而出現(xiàn)無法正常運行的問題。

以上就是K8S節(jié)點本地存儲被撐爆問題徹底解決方法的詳細內(nèi)容,更多關(guān)于K8S節(jié)點本地存儲被撐爆的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • k8s的架構(gòu)組成操作代碼

    k8s的架構(gòu)組成操作代碼

    k8s是一個輕便的和可擴展的開源平臺,用于管理容器化應(yīng)用和服務(wù),通過k8s能夠進行應(yīng)用的自動化部署和擴縮容,這篇文章主要介紹了k8s的架構(gòu)組成,需要的朋友可以參考下
    2024-05-05
  • K8S?使用EFK日志的統(tǒng)一管理(詳細步驟)

    K8S?使用EFK日志的統(tǒng)一管理(詳細步驟)

    在Kubernetes中,EFK是一種常見的日志統(tǒng)一管理方案,EFK堆棧允許你收集、存儲、搜素、分析和可視化容器應(yīng)用程序的日志,下面是如何在Kubernetes中使用EFK實現(xiàn)日志統(tǒng)一管理的詳細步驟,感興趣的朋友一起看看吧
    2025-01-01
  • K8s實戰(zhàn)教程之容器和?Pods資源分配問題

    K8s實戰(zhàn)教程之容器和?Pods資源分配問題

    這篇文章主要介紹了K8s實戰(zhàn)教程之容器和?Pods資源分配,本篇文章通過配置集群中運行的容器的?CPU?請求和限制,你可以有效利用集群上可用的?CPU?資源,通過將?Pod?CPU?請求保持在較低水平,可以使?Pod?更有機會被調(diào)度,需要的朋友可以參考下
    2022-07-07
  • 使用k8tz解決pod內(nèi)的時區(qū)問題(坑的解決)

    使用k8tz解決pod內(nèi)的時區(qū)問題(坑的解決)

    時區(qū)的不一致,會帶來很多困擾。即使代碼與時區(qū)無關(guān),但容器日志與系統(tǒng)日志時間相關(guān)聯(lián)排查問題也會讓人頭疼,這篇文章主要介紹了使用k8tz優(yōu)雅的解決pod內(nèi)的時區(qū)問題,需要的朋友可以參考下
    2022-10-10
  • Kubernetes?權(quán)限管理認(rèn)證鑒權(quán)詳解

    Kubernetes?權(quán)限管理認(rèn)證鑒權(quán)詳解

    這篇文章主要為大家介紹了Kubernetes?權(quán)限管理認(rèn)證鑒權(quán)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • Kubernetes故障排除有效維護集群的最佳實踐工具

    Kubernetes故障排除有效維護集群的最佳實踐工具

    這篇文章主要為大家介紹了Kubernetes故障排除有效維護集群的最佳實踐工具詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 一文講解如何獲取k8s容器里運行的jar包

    一文講解如何獲取k8s容器里運行的jar包

    K8S是Google開源的容器集群管理系統(tǒng),其設(shè)計目標(biāo)是在主機集群之間提供一個能夠自動化部署、可拓展、應(yīng)用容器可運營的平臺,這篇文章主要給大家介紹了關(guān)于如何獲取k8s容器里運行的jar包的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • 詳解Rainbond內(nèi)置ServiceMesh微服務(wù)架構(gòu)

    詳解Rainbond內(nèi)置ServiceMesh微服務(wù)架構(gòu)

    這篇文章主要為大家介紹了詳解Rainbond內(nèi)置ServiceMesh微服務(wù)架構(gòu),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • Kubernetes?Ingress實現(xiàn)細粒度IP訪問控制

    Kubernetes?Ingress實現(xiàn)細粒度IP訪問控制

    這篇文章主要為大家介紹了Kubernetes?Ingress實現(xiàn)細粒度IP訪問控制,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Podman開機自啟容器實現(xiàn)過程及與Docker對比

    Podman開機自啟容器實現(xiàn)過程及與Docker對比

    這篇文章主要為大家介紹了Podman開機自啟容器實現(xiàn)過程,通過示例代碼的形式進行演繹過程,有需要的朋友可以參考下,希望可以有所幫助
    2021-09-09

最新評論

武穴市| 温州市| 巧家县| 安吉县| 红安县| 郧西县| 新昌县| 图们市| 旌德县| 襄城县| 潮州市| 淮北市| 南城县| 五河县| 共和县| 陆川县| 玉林市| 靖安县| 安国市| 荔浦县| 安达市| 昌都县| 通山县| 元江| 昌邑市| 商都县| 衡阳县| 桃江县| 启东市| 当阳市| 白河县| 文登市| 宜宾县| 中阳县| 霍城县| 上犹县| 潼关县| 仪陇县| 玛多县| 正镶白旗| 澄迈县|