2017-07-26 1 views
0

年齢別にoc delete jobsまたはoc delete podsへの道はありますか?私はどれくらいの年齢でcronの仕事成果物をきれいにしたいのですか?それは可能ですか?年齢別にジョブとポッドをクリーンアップしますか?

編集:以下のジョブをクリーンアップするpythonスクリプトを追加しました。できます。私はそれも関連するポッドをクリーンアップすることを前提にしていましたが、そうはしません。私はポッドクリーンアップについて質問しましたが、解決された問題を1つの答えることのできる質問の範囲を超えたものにすることを願っていました。したがって、これを理解することに戻ると、私は新しい質問をします。答えて、正しい方向に私を助けてくれた人に感謝します。

+0

どのOpenShiftインストールを使用していますか?完全インストールの場合、クラスタレベルで定期的なジョブを実行し、特定の時間よりも古いものがある場合はその内容をクリーンアップします。 Minishiftまたは '' oc cluster up''を実行している場合、このジョブが実行されるかどうかはわかりません。それが使用するコマンドは '' oc adm prune''ですが、ジョブから停止したポッドについては何も表示されません。私は仕事のために停止したポッドで何が起こるかを調べてみます。 –

+0

@GrahamDumpleton私はv3.5.5.31を使用していますが、私は管理者権限がありませんので、別の方法でそれにアプローチする必要があります。私はあなたのアプローチを見ていくつもりですが、私はそれをテストしたときに私が共有する自分のアプローチを考え出しました。 – jimjim

答えて

0

申し訳ありませんが、申し訳ありません。 私は管理者特権を持っていないので、opensshiftで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 get pods -aと表示されます。それらを保持することで、完成したポッドのログを表示して、エラー、警告、またはその他の診断出力を確認することができます。ジョブオブジェクトは、ジョブの完了後も保持され、ジョブの状態を表示できます。以前のジョブを削除した後は、そのステータスに気づいたユーザーが決定します。

したがって、oc deleteを使用して自分でクリーニングする必要があります。彼らはGRACE_PERIOD_SECONDS変数を経由している何歳で終了したコンテナを削除することができ

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

それを行うための唯一の方法は次のようにスクリプト(未テスト)何かを使用するように見えます。 cronだけでなく、すべての終了コンテナを削除しますが、EXCLUDE_FROM_GC変数を使用して動作させることができます。

+1

これは彼が使用している普通のDockerサービスではなく、OpenShift/Kubernetesです。 '' docker-gc''のようなツールは、必要なことをするつもりはありません。 –

関連する問題