有没有办法自动删除已完成的工作,除了使用cronjob清理已完成的工作?
该K8S工作文件规定,完成作业的预期行为是他们留在已完成的状态,直到手动删除.因为我每天通过k8s cronjobs运行成千上万的工作,我不想保持完成的工作.
我有一个具有以下版本的 Kubernetes 集群:
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.1", GitCommit:"632ed300f2c34f6d6d15ca4cef3d3c7073412212", GitTreeState:"clean", BuildDate:"2021-08-19T15:38:26Z", GoVersion:"go1.16.6", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.13", GitCommit:"aac5f64a5218b0b1d0138a57d273a12db99390c9", GitTreeState:"clean", BuildDate:"2021-01-18T07:43:30Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
WARNING: version difference between client (1.22) and server (1.16) exceeds the supported minor version skew of +/-1
Run Code Online (Sandbox Code Playgroud)
我的 Kubernetes 集群中有一个 CronJob。
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: abc-cronjob
namespace: abc-namespace
...
Run Code Online (Sandbox Code Playgroud)
Kubernetes 集群识别 cron 作业的 api 资源。
$ kubectl -n abc-namespace api-resources
NAME SHORTNAMES APIVERSION NAMESPACED KIND
...
cronjobs cj batch/v1beta1 true …Run Code Online (Sandbox Code Playgroud) 我确定我错过了一些明显的东西.我查看了Kubernetes上ScheduledJobs/CronJobs的文档,但是我找不到按计划执行以下操作的方法:
我有其他方法可以做到这一点,但他们感觉不对.
安排一个cron任务:kubectl exec -it $(kubectl get pods --selector = some-selector | head -1)/ path/to/script
创建一个具有"Cron Pod"的部署,该部署也包含应用程序,以及许多"Non Cron Pod",它们只是应用程序.Cron Pod将使用不同的图像(一个安排了cron任务).
如果可能的话,我宁愿使用Kubernetes ScheduledJobs来防止同一个Job同时运行多次,也因为它让我感觉更合适.
有没有办法通过ScheduledJobs/CronJobs来做到这一点?
我有一个 k8s cronjob,它由一个 init 容器和一个 pod 容器组成。如果 init 容器失败,主容器中的 Pod 永远不会启动,并无限期地停留在“PodInitializing”中。
如果 init 容器失败,我的目的是让作业失败。
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: job-name
namespace: default
labels:
run: job-name
spec:
schedule: "15 23 * * *"
startingDeadlineSeconds: 60
concurrencyPolicy: "Forbid"
successfulJobsHistoryLimit: 30
failedJobsHistoryLimit: 10
jobTemplate:
spec:
# only try twice
backoffLimit: 2
activeDeadlineSeconds: 60
template:
spec:
initContainers:
- name: init-name
image: init-image:1.0
restartPolicy: Never
containers:
- name: some-name
image: someimage:1.0
restartPolicy: Never
Run Code Online (Sandbox Code Playgroud)
pod 上的 kubectl 卡住会导致:
Name: job-name-1542237120-rgvzl
Namespace: default
Priority: 0 …Run Code Online (Sandbox Code Playgroud) kubernetes kubernetes-pod kubernetes-cronjob kubernetes-jobs
我想在我的本地时区(GMT+7)中安排 kubernetes cronjob,目前当我在 k8s 中安排 cronjob 时,我需要在 UTC 中安排,但我想在我的本地时区中安排,正如Kubernetes 文档中指定的那样,我需要更改kube-controller 管理器中的时区如下
所有 CronJob 计划:时间均基于 kube-controller-manager 的时区。
如果您的控制平面在 Pod 或裸容器中运行 kube-controller-manager,则为 kube-controller-manager 容器设置的时区将决定 cron 作业控制器使用的时区。
但我找不到为 kube-controller-manager 设置时区的方法,我正在使用 Kuberenetes on-premise v1.17,我在 - /etc/kubernetes/manifests/kube-controller-manager 中找到了控制器管理器清单文件.yaml 但找不到更改时区的方法或文档。
我有一个 HorizontalPodAutoscalar 来根据 CPU 扩展我的 pod。这里的 minReplicas 设置为5:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-web
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp-web
minReplicas: 5
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
Run Code Online (Sandbox Code Playgroud)
然后,我添加了 Cron 作业来根据一天中的时间放大/缩小我的水平 pod 自动缩放器:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: production
name: cron-runner
rules:
- apiGroups: ["autoscaling"]
resources: ["horizontalpodautoscalers"]
verbs: ["patch", "get"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: cron-runner
namespace: production
subjects:
- kind: ServiceAccount
name: sa-cron-runner …Run Code Online (Sandbox Code Playgroud) 在Kubernetes cronjobs中,在限制部分中说明了这一点
如果CronJob控制器在从CronJob的开始时间到开始时间加上startingDeadlineSeconds之前的一段时间内没有运行或中断,或者如果跨度涵盖多个开始时间并且concurrencyPolicy不允许并发,则作业可能无法运行.
我从中理解的是,如果startingDeadlineSeconds设置为10并且cronjob在其预定时间由于某种原因无法启动,那么只要这些10秒没有通过,它仍然可以尝试再次启动,但是在10秒,它肯定不会被启动,这是正确的?
此外,如果我已经concurrencyPolicy设置为Forbid,如果cronjob尝试安排,当有一个已经运行时,K8会将其视为失败吗?
我有一个在Kubernetes集群中的Docker容器中运行的webapp。该应用程序具有一个我想定期调用的端点。该应用程序在多个节点/吊舱中运行,重要的是只有一个节点执行端点发起的任务。我看过Kubernetes Cron Jobs,但没有找到有关从Kubernetes Cron Job调用端点的任何文档。有人有解决这个问题的建议吗?在只有一个节点执行任务的群集中,您如何处理调度?
我想在不同的时间运行一个 cron。
是否可以在我的 YML 文件中执行类似的操作:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: my-cronjob
spec:
schedule:
- "*/10 00-08 * * *"
- "*/5 09-18 * * *"
- "*/10 19-23 * * *"
concurrencyPolicy: Forbid
...
Run Code Online (Sandbox Code Playgroud)
或者我是否必须为每个计划时间创建单独的 YML 文件?
我想在我的GKE上运行CronJob,以便每天执行批处理操作.理想的情况是我的集群在作业未运行时扩展到0个节点,并且每次满足计划时动态扩展到1个节点并在其上运行作业.
我首先尝试通过使用kubernetes doc 中的一个简单的CronJob来实现这一点,它只打印当前时间并终止.
我首先使用以下命令创建了一个集群:
gcloud container clusters create $CLUSTER_NAME \
--enable-autoscaling \
--min-nodes 0 --max-nodes 1 --num-nodes 1 \
--zone $CLUSTER_ZONE
Run Code Online (Sandbox Code Playgroud)
然后,我创建了一个CronJob,其中包含以下描述:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: Never
Run Code Online (Sandbox Code Playgroud)
作业计划每小时运行一次,并在终止前打印当前时间.
首先,我想创建具有0个节点的集群,但设置--num-nodes 0结果是错误的.为什么会这样?请注意,我可以在创建集群后手动将集群缩小到0个节点.
其次,如果我的群集有0个节点,则不会调度作业,因为群集不会自动扩展到1个节点,而是会出现以下错误:
无法安排pod:没有可用于安排pod的节点.
第三,如果我的集群有1个节点,则作业正常运行但在此之后,集群不会缩小到0个节点,而是保留1个节点.我让我的集群运行两个连续的工作,并没有在两者之间缩小.我假设一小时应该足够长,以便群集这样做.
我错过了什么?
autoscaling google-cloud-platform kubernetes google-kubernetes-engine kubernetes-cronjob