从Kubernetes Cron Job 调用端点

22

我有一个运行在Kubernetes集群中的Docker容器中的Web应用程序。该应用程序有一个端点需要定期调用。该应用程序在多个节点/ pod上运行,只有一个节点执行由该端点启动的任务非常重要。我查看了Kubernetes Cron Jobs,但没有找到任何有关从Kubernetes Cron Job调用端点的文档。是否有人提出了解决此问题的方案?在必须确保只有一个节点执行任务的集群中如何处理调度?


你的意思是同时只有1个节点?永远只有1个节点?这1个节点需要是调用端点的节点还是被调用的端点所在的节点?重要的是只调用1个Pod而不管它在哪个节点上,还是在一个节点上的任何Pod都可以? - coreypobrien
每天在特定时间只调用一个Pod很重要,而它所在的节点并不重要。这个Pod是被调用的终端节点。 - user1119371
1个回答

45

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

请问为什么您需要第二个服务?第一个服务已经覆盖了第二个服务所做的事情吗?(如果这是个愚蠢的问题,请原谅,我还不太熟悉 Kubernetes。) - anniex
1
allpods 服务通过使用两个 Deployments 都包含的 app: nginx 标签来定位来自两个服务的 Podssingleton Service 仅针对 singleton Deployment。大多数用户将使用 allpods Servicesingleton Service 是原始问题的特定用例,即“只有一个节点执行任务很重要”。您可以看到 Cronjob 的目标是 http://singleton,以便同一单个 Pod 处理该任务。 - coreypobrien
@coreypobrien 这个需求需要两个服务吗?例如:如果你有3个Pod,而且只有一个服务针对这三个Pod,那么如果发送一个请求到这个服务,服务会将其重定向到其中一个Pod上,就我所理解的而言。 - brunochaina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接