J'ai une webapp en cours d'exécution dans un Docker-conteneur dans un cluster Kubernetes. L'application a un point de terminaison que je souhaite appeler périodiquement. L'application s'exécute sur plusieurs nœuds/modules, et il est important qu'un seul nœud exécute la tâche lancée par le point de terminaison. J'ai examiné les travaux Kubernetes Cron, mais je n'ai trouvé aucune documentation sur l'appel des points de terminaison à partir d'un travail Kubernetes Cron. Quelqu'un at-il une proposition de solution à ce problème? Comment gérez-vous la planification dans un cluster où il est crucial qu'un seul nœud exécute la tâche?
CronJob
s sont un bon choix. Voici une présentation rapide qui exécute 3 pods nginx acceptant tout le trafic. Chaque minute, un Job
boucle 1 des 3 pods (toujours le même pod).
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