k8s cron作业运行多次



我有下面的cronjob,它删除特定命名空间中的pod。

我按原样运行作业,但作业似乎不是每20分钟运行一次,而是每隔几(2-3(分钟运行一,我需要的是,每20分钟,作业就会开始删除指定命名空间中的pod,然后终止,知道这里可能出了什么问题吗?

apiVersion: batch/v1
kind: CronJob
metadata:
name: restart
spec:
schedule: "*/20 * * * *"
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 0
failedJobsHistoryLimit: 0
jobTemplate:
spec:
backoffLimit: 0
template:
spec:
serviceAccountName: sa
restartPolicy: Never
containers:
- name: kubectl
image: bitnami/kubectl:1.22.3
command:
- /bin/sh
- -c
- kubectl get pods -o name | while read -r POD; do kubectl delete "$POD"; sleep 30; done

我真的不知道为什么会发生这种事。。。

也许删除吊舱折叠

更新

我尝试了以下操作,但没有删除任何pod,知道吗?

apiVersion: batch/v1
kind: CronJob
metadata:
name: restart
spec:
schedule: "*/1 * * * *"
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 0
failedJobsHistoryLimit: 0
jobTemplate:
spec:
backoffLimit: 0
template:
metadata:
labels:
name: restart
spec:
serviceAccountName: pod-exterminator
restartPolicy: Never
containers:
- name: kubectl
image: bitnami/kubectl:1.22.3
command:
- /bin/sh
- -c
- kubectl get pods -o name --selector name!=restart | while read -r POD; do kubectl delete "$POD"; sleep 10; done.

这个cronjob pod将在执行过程中的某个时刻删除自己。导致作业失败,并额外重置其回退计数。

医生说:

当作业的Pod被删除或成功,而该作业的任何其他Pod在此期间都没有失败时,回退计数将重置。

您需要应用适当的筛选器。还要注意,您可以使用一个命令删除所有pod。

spec.jobTemplate.spec.template.metadata添加一个可用于筛选的标签。

apiVersion: batch/v1
kind: CronJob
metadata:
name: restart
spec:
jobTemplate:
spec:
template:
metadata:
labels:
name: restart # label the pod

然后使用此标签删除所有不是cronjob pod的pod。

kubectl delete pod --selector name!=restart

由于您在注释中声明,您需要一个循环,完整的工作示例可能如下所示。

---
apiVersion: batch/v1
kind: CronJob
metadata:
name: restart
namespace: sandbox
spec:
schedule: "*/20 * * * *"
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 0
failedJobsHistoryLimit: 0
jobTemplate:
spec:
backoffLimit: 0
template:
metadata:
labels:
name: restart
spec:
serviceAccountName: restart
restartPolicy: Never
containers:
- name: kubectl
image: bitnami/kubectl:1.22.3
command:
- /bin/sh
- -c
- |
kubectl get pods -o name --selector "name!=restart" |
while read -r POD; do
kubectl delete "$POD"
sleep 30
done
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: restart
namespace: sandbox
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-management
namespace: sandbox
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: restart-pod-management
namespace: sandbox
subjects:
- kind: ServiceAccount
name: restart
namespace: sandbox
roleRef:
kind: Role
name: pod-management
apiGroup: rbac.authorization.k8s.io
kubectl create namespace sandbox
kubectl config set-context --current --namespace sandbox
kubectl run pod1 --image busybox -- sleep infinity
kubectl run pod2 --image busybox -- sleep infinity
kubectl apply -f restart.yaml # the above file

在这里,您可以看到第一个pod是如何被终止的。

$ kubectl get all
NAME                         READY   STATUS        RESTARTS   AGE
pod/pod1                     1/1     Terminating   0          43s
pod/pod2                     1/1     Running       0          39s
pod/restart-27432801-rrtvm   1/1     Running       0          16s
NAME                    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
cronjob.batch/restart   */1 * * * *   False     1        17s             36s
NAME                         COMPLETIONS   DURATION   AGE
job.batch/restart-27432801   0/1           17s        17s

请注意,这实际上有点bug。因为从读取pod列表到删除列表中的单个pod,该pod可能不再存在。您可以使用以下内容来忽略这些案例,因为当它们消失时,您不需要删除它们。

kubectl delete "$POD" || true

也就是说,既然你将你的作业命名为重启,我认为这样做的目的是重启一些部署的pod。实际上,您可以使用适当的重启,利用Kubernetes更新策略。

kubectl rollout restart $(kubectl get deploy -o name)

使用默认的更新策略,这将导致首先创建新的pod,并确保它们在终止旧的pod之前做好准备。

$ kubectl rollout restart $(kubectl get deploy -o name)
NAME                        READY   STATUS              RESTARTS   AGE
pod/app1-56f87fc665-mf9th   0/1     ContainerCreating   0          2s
pod/app1-5cbc776547-fh96w   1/1     Running             0          2m9s
pod/app2-7b9779f767-48kpd   0/1     ContainerCreating   0          2s
pod/app2-8d6454757-xj4zc    1/1     Running             0          2m9s

这也适用于deamonsets。

$ kubectl rollout restart -h
Restart a resource.
Resource rollout will be restarted.
Examples:
# Restart a deployment
kubectl rollout restart deployment/nginx

# Restart a daemon set
kubectl rollout restart daemonset/abc

相关内容

  • 没有找到相关文章

最新更新