2016-12-16 51 views
6

我確定我錯過了一些明顯的東西。我已經完成在Kubernetes ScheduledJobs/CronJobs的文件看,但我不能找到一種方法,做一個時間表如下:Kubernetes中的Cron作業 - 連接到現有Pod,執行腳本

  1. 連接到現有波德
  2. 執行腳本
  3. 斷開

我有這樣做的替代方法,但他們不覺得正確。

  1. 安排一個cron任務:kubectl EXEC -IT $(kubectl獲取豆莢--selector =一些選擇器|頭-1)/路徑/到/腳本

  2. 創建具有一個部署一個「Cron Pod」也包含應用程序,許多「Non Cron Pods」僅僅是應用程序。 Cron Pod會使用一個不同的圖像(一個預定了cron任務)。

我寧願使用Kubernetes ScheduledJobs如果可能的話,防止跑多次同樣的工作,同時也因爲它給我的印象做的更合適的方式。

有沒有辦法通過ScheduledJobs/CronJobs來做到這一點?

http://kubernetes.io/docs/user-guide/cron-jobs/

+0

爲什麼你必須連接到現有的吊艙?你不能在一個新的pod中執行你的腳本嗎?另一種可能性是在主要窗格(例如HTTP)上打開一個服務器,並從預定作業撥打電話。 – kichik

+0

這是一個我想調用命令的Symfony應用程序。服務器上有很多租戶,這對'ls -s */|會更容易cut -f1 -d'/''獲取可迭代的目錄(安裝)列表,而不是爲每個安裝手動創建cron條目。它會以'installation = $(ls -d */| cut -f1 -d'/'); cd/path/$安裝; php app/console some:command' 新的pod不會知道每個安裝,並且不會訪問安裝變量,也不需要下拉和設置應用程序就好像它是一個實例。 – Aeisor

回答

0

據我所知是沒有「正式」的方式來做到這一點,你所希望的方式,那就是我相信的設計。豆莢應該是短暫的並且可以水平擴展,而喬布斯則設計成退出。將cron作業「附加」到現有的容器並不適合該模塊。調度員不知道工作是否完成。

相反,作業可以調出一個專門用於運行作業的應用程序實例,然後在作業完成後將其刪除。要做到這一點,您可以使用與作業相同的Image作爲部署,但通過設置command:來使用不同的「入口點」。

如果他們的工作需要訪問由您的應用程序創建的數據,那麼這些數據將需要在應用程序/ Pod之外持久化,您可以通過幾種方法來實現,但顯而易見的方式是數據庫或持久卷。 例如期運用數據庫會是這個樣子:

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: APP 
spec: 
    template: 
    metadata: 
     labels: 
     name: THIS 
     app: THAT 
    spec: 
     containers: 
     - image: APP:IMAGE 
      name: APP 
      command: 
      - app-start 
      env: 
      - name: DB_HOST 
       value: "127.0.0.1" 
      - name: DB_DATABASE 
       value: "app_db" 

和連接到同一數據庫的工作,但有不同的「入口點」:

apiVersion: batch/v1 
kind: Job 
metadata: 
    name: APP-JOB 
spec: 
    template: 
    metadata: 
     name: APP-JOB 
     labels: 
     app: THAT 
    spec: 
     containers: 
     - image: APP:IMAGE 
     name: APP-JOB 
     command: 
     - app-job 
     env: 
      - name: DB_HOST 
      value: "127.0.0.1" 
      - name: DB_DATABASE 
      value: "app_db" 

或永久體積法會是這個樣子:

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: APP 
spec: 
    template: 
    metadata: 
     labels: 
     name: THIS 
     app: THAT 
    spec: 
     containers: 
     - image: APP:IMAGE 
      name: APP 
      command: 
      - app-start 
      volumeMounts: 
      - mountPath: "/var/www/html" 
      name: APP-VOLUME 
     volumes: 
     - name: APP-VOLUME 
      persistentVolumeClaim: 
      claimName: APP-CLAIM 

--- 

apiVersion: v1 
kind: PersistentVolume 
metadata: 
    name: APP-VOLUME 
spec: 
    capacity: 
    storage: 10Gi 
    accessModes: 
    - ReadWriteMany 
    persistentVolumeReclaimPolicy: Retain 
    nfs: 
    path: /app 

--- 

apiVersion: v1 
kind: PersistentVolumeClaim 
metadata: 
    name: APP-CLAIM 
spec: 
    accessModes: 
    - ReadWriteMany 
    resources: 
    requests: 
     storage: 10Gi 
    selector: 
    matchLabels: 
     service: app 

有了這樣的工作,連接到同一個卷:

apiVersion: batch/v1 
kind: Job 
metadata: 
    name: APP-JOB 
spec: 
    template: 
    metadata: 
     name: APP-JOB 
     labels: 
     app: THAT 
    spec: 
     containers: 
     - image: APP:IMAGE 
     name: APP-JOB 
     command: 
     - app-job 
     volumeMounts: 
     - mountPath: "/var/www/html" 
      name: APP-VOLUME 
    volumes: 
     - name: APP-VOLUME 
     persistentVolumeClaim: 
      claimName: APP-CLAIM