配置定時任務清理多余的鏡像和容器文件


k8s集群運行久了,難免會產生大量無用的鏡像和容器文件,因此需要經常進行清理。

一般而言,docker容器默認的本地數據存儲路徑位於/var/lib/docker路徑下,通過df -h /var/lib/docker命令,可以查看其占用情況。如果高於80%,則意味着需要清理了。

一、清理命令

與清理容器多余數據相關的命令有兩條,分別是:

docker image prune -af
docker system prune -f

其中,第一條命令是僅僅清除沒有被容器使用的鏡像文件,第二條命令是清除多余的數據,包括停止的容器、多余的鏡像、未被使用的volume等等,比第一條命令包含的內容多。

以上兩條命令可以通過一個腳本clean.sh統一執行:

#! /bin/bash 

need_clean() {
    used=`df -h /var/lib/docker | awk -F"[ %]+" '/dev/{print $5}'`
    if [[ $used -ge 80 ]]; then
        return 0
    fi
    
    return 1

}

if need_clean; then
    docker image prune -af
    if need_clean; then
        docker system prune -f
    fi
fi

這里通過awk獲取df -h的結果中的占用比例那一欄。-F"[ %]+"的意思是指定若干個空格或%為分隔符,從而將百分數中的%剔除。

只有當占用比例大於80%時才執行清除命令。如果執行第一條命令后降到了80%以下,則不用再執行下一條命令。

二、創建定時任務

腳本寫完了,但是我們希望機器能自動在合適的時間運行它。這就需要定時任務了。

linux中創建定時任務其實很簡單。系統中如果運行了crond程序,則只需要在/var/spool/cron目錄下創建一個以用戶名命名的文件,crond即可自動在合適的時間運行它。

比如我們以root用戶管理機器,就在/var/spool/cron目錄下創建一個root文件:

@daily   bash /usr/local/bin/clean.sh

將腳本拷貝到/usr/local/bin目錄下(當然也可以是別的目錄),那么crond就會在每天的午夜零點執行這個腳本。

三、添加文件鎖

有一種可能的情況是,如果將運行腳本的時間設定為每分鍾執行,則有可能出現上一個命令還沒執行完,下一個命令就來了。這時就會造成混亂。為了應對這種情況,需要通過flock命令,為文件添加鎖。於是上面的root文件可以改寫為:

@daily  flock -n /tmp/.cleanlock -c "bash /usr/local/bin/clean.sh"

其中,/tmp/.cleanlock可以隨便指定。-n的意思是如果沒有獲得鎖,則不進行操作。當然,設定為每天執行的話,由於周期較長,可以不用加文件鎖。

通過以上操作,系統就會在每天的夜里零點自動檢查是否需要清理多余的數據,確保集群運行的資源充足。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM