2016-11-21 57 views
2

我試圖用Kubernetes工作替換我的傳統工作調度器,並想知道如何將連續工作作爲Kubernetes工作來編寫。如何將連續作業編寫爲Kubernetes作業?

首先,我寫了下面的腳本來按照書面順序執行job1job2,但它沒有像我期望的那樣工作。

apiVersion: batch/v1 
kind: Job 
metadata: 
    name: sequential 
spec: 
    activeDeadlineSeconds: 100 
    template: 
    metadata: 
     name: sequential_jobs 
    spec: 
     containers: 
     - name: job1 
     image: image1 
     - name: job2 
     image: image2 
     restartPolicy: Never 

上述作業似乎並行運行job1job2。 有沒有什麼好的方法可以按照書面順序運行job1job2

附加。

我最近發現https://github.com/argoproj/argo非常適合我的用例。

回答

2

概括地說,在Kubernetes設置中,沒有序列和捕獲跨容器/豆莢的依賴關係的概念。對於你的情況,如果你在一個工作規範(甚至是一個pod規範)中有2個容器,那麼這兩個容器沒有排序。同樣,如果你一個接一個地開火2個職位,那麼這些職位也沒有排序的概念。

理想情況下,如果任何事情需要排序,您應該在一個單元(容器)內將其捕獲到內部


稍微切到你的問題,我見過 當工作是依賴於現有的其他服務另一種常見的模式(比如由K8S服務額部署):

的容器中作業向k8s服務發出請求,如果服務未按預期做出響應,則會失敗。這樣,作業不斷重新啓動,最終當服務啓動時,作業執行併成功完成。

+1

豆莢可以有「init容器」,它在「主」容器啓動之前運行。但我不知道這是否也適用於喬布斯。如果是這樣,job1可以作爲init容器運行,job2作爲主容器運行。見http://kubernetes.io/docs/user-guide/production-pods/#handling-initialization –

+0

我還沒有嘗試過,但它似乎是一個很好的選擇。謝謝@MarcSluiter –

+0

Init容器也適用於工作 – baloo

0

剛剛碰到過這個。如上所述,就我所知,Kubernetes中沒有工作依賴的概念,但我一直在與一個商業實體(Univa)合作,該實體具有提供此(和其他)功能的附加組件。

該產品被稱爲Navops命令,它允許您用簡單的依賴表示法註釋Kubernetes作業。這裏有一個博客,裏面有一個簡要的解釋和例子 - http://blogs.univa.com/2017/06/navops-command-1-2-delivers-new-advanced-capabilities-for-managing-resources-on-kubernetes/。基本上,Navops作爲一組容器安裝在Kubernetes上,公開它自己的UI和CLI,並補充具有額外功能的Kubernetes調度器。您可以在http://navops.io下載。

該技術來自高性能計算中使用的Grid Engine調度程序,其中複雜的工作流,陣列作業等常見。

2

經過幾次嘗試,我做到了這一點,並解決了基本問題(類似於OP發佈的內容)。此配置可確保job-1job-2開始之前完成。如果job-1失敗,則job-2容器未啓動。我仍然需要重試和失敗處理,但基本工作。希望這將幫助其他人:

apiVersion: v1 
kind: Pod 
metadata: 
    name: sequential-job 
spec: 
    initContainers: 
    - name: job-1 
    image: busybox 
    # runs for 15 seconds; echoes job name and timestamp 
    command: ['sh', '-c', 'for i in 1 2 3; do echo "job-1 `date`" && sleep 5s; done;'] 
    - name: job-2 
    image: busybox 
    # runs for 15 seconds; echoes job name and timestamp 
    command: ['sh', '-c', 'for i in 1 2 3; do echo "job-2 `date`" && sleep 5s; done;'] 
    # I don't really need the 'containers', but syntax requires 
    # it so, I'm using it as a place where I can report the 
    # completion status 
    containers: 
    - name: job-done 
    image: busybox 
    command: ['sh', '-c', 'echo "job-1 and job-2 completed"'] 
    restartPolicy: Never 

更新

相同的配置上面也有工作規範內部工作原理:

apiVersion: batch/v1 
kind: Job 
metadata: 
    name: sequential-jobs 
spec: 
    template: 
    metadata: 
     name: sequential-job 
    spec: 
     initContainers: 
     - name: job-1 
     image: busybox 
     command: ['sh', '-c', 'for i in 1 2 3; do echo "job-1 `date`" && sleep 5s; done;'] 
     - name: job-2 
     image: busybox 
     command: ['sh', '-c', 'for i in 1 2 3; do echo "job-2 `date`" && sleep 5s; done;'] 
     containers: 
     - name: job-done 
     image: busybox 
     command: ['sh', '-c', 'echo "job-1 and job-2 completed"'] 
     restartPolicy: Never 
0

你看着旅 - https://brigade.sh。 使用JavaScript編寫簡單而複雜的工作流程。將容器鏈接在一起,並行或串行運行。根據時間啓動腳本,GitHub事件,Docker推送或任何其他觸發器。 Brigade是爲Kubernetes創建管道的工具。