我有一个运行在Kubernetes集群中的Docker容器中的Web应用程序。该应用程序有一个端点需要定期调用。该应用程序在多个节点/ pod上运行,只有一个节点执行由该端点启动的任务非常重要。我查看了Kubernetes Cron Jobs,但没有找到任何有关从Kubernetes Cron Job调用端点的文档。是否有人提出了解决此问题的方案?在必须确保只有一个节点执行任务的集群中如何处理调度?
我有一个运行在Kubernetes集群中的Docker容器中的Web应用程序。该应用程序有一个端点需要定期调用。该应用程序在多个节点/ pod上运行,只有一个节点执行由该端点启动的任务非常重要。我查看了Kubernetes Cron Jobs,但没有找到任何有关从Kubernetes Cron Job调用端点的文档。是否有人提出了解决此问题的方案?在必须确保只有一个节点执行任务的集群中如何处理调度?
CronJob
是个不错的选择。这里是一个快速的布局,它运行3个接受所有流量的nginx容器。每分钟,一个Job
会对其中一个容器进行curl操作(总是同一个容器)。
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: main
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: singleton
labels:
app: nginx
special: singleton
spec:
replicas: 1
selector:
matchLabels:
app: nginx
special: singleton
template:
metadata:
labels:
app: nginx
special: singleton
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
name: allpods
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
---
kind: Service
apiVersion: v1
metadata:
name: singleton
spec:
selector:
special: singleton
ports:
- protocol: TCP
port: 80
targetPort: 80
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: callout
spec:
schedule: "*/1 * * * *"
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 1
failedJobsHistoryLimit: 1
jobTemplate:
spec:
template:
spec:
containers:
- name: callout
image: buildpack-deps:curl
args:
- /bin/sh
- -ec
- curl http://singleton
restartPolicy: Never
allpods
服务通过使用两个 Deployments
都包含的 app: nginx
标签来定位来自两个服务的 Pods
。singleton
Service
仅针对 singleton
Deployment
。大多数用户将使用 allpods
Service
。singleton
Service
是原始问题的特定用例,即“只有一个节点执行任务很重要”。您可以看到 Cronjob
的目标是 http://singleton
,以便同一单个 Pod
处理该任务。 - coreypobrien