【问题标题】:How to start another application(pod) from a CRON JOB如何从 CRON JOB 启动另一个应用程序(pod)
【发布时间】:2021-09-24 06:36:43
【问题描述】:

我在 Azure k8s 中有一个 CRON JOB,它每天触发一次,根据写在这个 CRON JOB(图像)中的条件,我需要启动另一个应用程序/s(Pods),它将执行一些过程并死掉

【问题讨论】:

  • 你好@AshleyAlex。 help you下面的答案有没有?

标签: kubernetes azure-aks kubernetes-cronjob


【解决方案1】:

如果您需要创建两个 cron pods 同时运行,您需要创建 两个 cron 作业,但如果您需要这两个作业在 d 上运行>不同的时间,这样您就可以使用每天运行两次的相同 cron 作业,您可以安排这样的 cron 作业:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "* */12 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

这将每 12 小时运行一次。

【讨论】:

  • 似乎我把你弄糊涂了,要求是只有在 CRON JOB 中编写的某些条件满足时才启动另一个不同的应用程序(简单来说,如何调用/启动一个 POD,它是来自这个 CRON JOB 的另一个应用程序荚)
  • 正如您在 cron 作业模板中看到的那样,您有容器,因此您可以添加一个或多个容器,因此可以创建多个 pod,您可以使用多个容器,当条件验证后死亡时可以处理这些容器终止这会更好。
【解决方案2】:

我将描述一个需要在 CronJob Pod 中运行 kubectl 命令的解决方案。如果您用于创建CronJob 的映像没有kubectl 命令,则需要安装它。
简而言之,您可以使用创建 Deployment(或 Pod)的 Bash 脚本,然后将该脚本挂载到一个卷中到 CronJob Pod。

下面,我将提供详细的分步说明。


这是一个非常简单的 bash 脚本,我们将安装到 CronJob Pod:
注意:您可能需要根据需要修改此脚本。如果您用于创建CronJob 的映像没有安装kubectl 命令,您可以在此脚本中安装它。

$ cat deploy-script.sh
#!/bin/bash

echo "Creaing 'web-app'"
kubectl create deployment web-app --image=nginx
sleep 10
echo "Deleting 'web-app'"
kubectl delete deployment web-app

我们想从 Pod 内部运行这个脚本,所以我将它转换为 ConfigMap,这将允许我们将这个脚本挂载到一个卷中(参见:Using ConfigMaps as files from a Pod):

$ cat deploy-script-configmap.yml
apiVersion: v1
kind: ConfigMap
metadata:
  name: deploy-script
data:
  deployScript.sh: |
    #!/bin/bash

    echo "Creaing 'web-app'"
    kubectl create deployment web-app --image=nginx
    sleep 10
    echo "Deleting 'web-app'"
    kubectl delete deployment web-app

$ kubectl apply -f deploy-script-configmap.yml
configmap/deploy-script created

然后我创建了一个单独的cron-user ServiceAccount 并分配了edit 角色,我们的CronJob 将在此ServiceAccount 下运行:

$ cat cron-job.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: cron-user
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: cron-user-binding
subjects:
  - kind: ServiceAccount
    name: cron-user
    namespace: default
roleRef:
  kind: ClusterRole
  name: edit
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: deploy-cron-job
spec:
  schedule: "*/2 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          serviceAccountName: cron-user
          volumes:
            - name: deploy-script
              configMap:
                name: deploy-script
          containers:
          - name: cron-job-1
            image: bitnami/kubectl
            command: ["bash", "/mnt/deployScript.sh"]
            volumeMounts:
            - name: deploy-script
              mountPath: /mnt/
          

应用上述清单后,deploy-cron-job CronJob 已创建:

$ kubectl apply -f cron-job.yaml
serviceaccount/cron-user created
clusterrolebinding.rbac.authorization.k8s.io/cron-user-binding created
cronjob.batch/deploy-cron-job created

$ kubectl get cronjob
NAME              SCHEDULE      SUSPEND   ACTIVE   
deploy-cron-job   */2 * * * *   False     1     

一段时间后,CronJob Pod 已创建,从日志中我们可以看到,它按预期创建了 web-app 部署:

$ kubectl get pods
NAME                                       READY   STATUS        RESTARTS   AGE
deploy-cron-job-1626426840-6w6s9           0/1     Completed     0          21s

$ kubectl logs -f deploy-cron-job-1626426840-6w6s9
Creaing 'web-app'
deployment.apps/web-app created
Deleting 'web-app'
deployment.apps "web-app" deleted

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多