2017-07-26 65 views
0

按年齡有沒有一種方法oc delete jobsoc delete pods?我想根據他們的年齡清理cron作業文物。那可能嗎?按年齡清理工作和豆莢?

編輯:我添加了一個Python腳本,清理下面的作業。有用。我是在假設它會清理相關的豆莢,但它沒有。我意識到,即使我詢問了清理莢的問題,試圖解決這個問題可能超出了單個可回答問題的範圍,所以當我回過頭來解決這個問題時,我會問一個新問題。感謝那些回答並幫助我指引正確方向的人。

+0

您使用的是什麼OpenShift安裝?對於完整的安裝,定期工作應該在羣集級別上運行,並在某些時間比某些時間更早時進行清理。如果在Minishift或「oc cluster up」上運行,我不確定此作業是否運行。它使用的命令是「oc adm prune」,雖然看着我沒有看到任何關於停止工作的豆莢。我會試着找出停工的豆莢會發生什麼事情。 –

+0

@GrahamDumpleton我正在使用v3.5.5.31,但我沒有管理員權限,所以我必須找到一種不同的方法來處理它。我會看看你的方法,但我也想出了我自己的方法,我會在測試時分享它。 – jimjim

回答

0

對不起,花了這麼長時間纔得到這裏。 由於我沒有管理員權限,並且我已經在openshift上通過cronjobs觸發了python應用程序,所以我認爲最好的方法是使用REST API。這導致我寫這個腳本來清理已經完成並且超過24小時的工作。

from os import environ 
import requests 
from datetime import datetime, timedelta 

設置身份驗證令牌

apihost = 'https://openshift.redhat.com:8443{endpoint}' 

jobsurl = apihost.format(
endpoint = '/apis/batch/v1/namespaces/%s/jobs' % environ['NAMESPACE'] 
) 

headers = { 
'Authorization': 'Bearer %s' % environ['AUTH_TOKEN'] 
} 

獲取當前工作

req_jobs = requests.get(jobsurl, headers=headers, verify=False) 

遍歷,找出工作中集

刪除
jobstodelete = [] 

for item in req_jobs.json()['items']: 
    if 'completionTime' in item['status']: 
     elapsed_time = datetime.now() - datetime.strptime(item['status']['completionTime'], '%Y-%m-%dT%H:%M:%SZ') 
     if elapsed_time > timedelta(hours=24): 
      jobstodelete.append(item['metadata']['selfLink']) 

刪除作業
for job in jobstodelete: 
    delurl = apihost.format(
     endpoint = job 
    ) 

req_del = requests.delete(delurl, headers=headers, verify=False) 

這清理了工作就好了。

0

周圍的工作清理Kubernetes文檔:

當工作完成後,沒有更多的豆莢創建,但豆莢,也不刪除。因爲它們被終止了,所以它們不會出現kubectl獲取豆莢,但它們會出現與kubectl獲取豆莢-a。保留它們可讓您仍然查看已完成Pod的日誌,以檢查錯誤,警告或其他診斷輸出。作業對象在完成後也會保留,以便您可以查看其狀態。用戶在注意其狀態後刪除舊作業。

所以你需要使用oc delete自己清理它們。

做到這一點的唯一方法似乎是使用腳本(未經測試)類似:

for job in $(oc get jobs -o name); do 
    if [[ "$(oc get "${job}" -o jsonpath="{.status.conditions[0]['status','type']}") != "Complete True" ]]; then 
     continue 
    fi 

    completionTime="$(oc get "${job}" -o jsonpath='{.status.completionTime}')" 
    if [[ "$(date -d "${completionTime}" +%s)" -lt "$(date -d "${cutoff}" +%s)" ]]; then 
     oc delete "${job}" 
    fi 
done 
+0

我讀過。我正在閱讀這個[https://docs.openshift.com/container-platform/3.5/dev_guide/cron_jobs.html],它基本上說明了同樣的事情,就手動清除cron作業工件而言。 – jimjim

0

docker-gc可以通過它們是通過GRACE_PERIOD_SECONDS可變多大刪除退出容器。它將刪除所有已退出的容器,不僅僅是cron的容器,而且您可以使用變量EXCLUDE_FROM_GC來使其工作。

+1

這不是他正在使用的普通老式Docker服務,而是OpenShift/Kubernetes。像''docker-gc''這樣的工具不會去做所需要的。 –