【发布时间】:2021-09-24 06:36:43
【问题描述】:
我在 Azure k8s 中有一个 CRON JOB,它每天触发一次,根据写在这个 CRON JOB(图像)中的条件,我需要启动另一个应用程序/s(Pods),它将执行一些过程并死掉
【问题讨论】:
-
你好@AshleyAlex。 help you下面的答案有没有?
标签: kubernetes azure-aks kubernetes-cronjob
我在 Azure k8s 中有一个 CRON JOB,它每天触发一次,根据写在这个 CRON JOB(图像)中的条件,我需要启动另一个应用程序/s(Pods),它将执行一些过程并死掉
【问题讨论】:
标签: kubernetes azure-aks kubernetes-cronjob
如果您需要创建两个 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 小时运行一次。
【讨论】:
我将描述一个需要在 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
【讨论】: