Kubernetes:如何在部署的每个Pod中定期运行任务?

nzrxty8p  于 2023-03-01  发布在  Kubernetes
关注(0)|答案(1)|浏览(476)

我读过在K8s集群中周期性运行任务的各种方法,但似乎没有一种方法能很好地适用于这个特定的情况。我有一个部署“my-depl”,它可以运行任意数量的pod,任务需要在每个pod中周期性地执行(基本上是一个shell命令,大约每周“轻推”主应用程序一次)。
Kubernetes Cronjob功能在它自己的容器中启动一个任务。这个K8s任务不知道当前有多少pod在为“my-depl”运行,并且不能在这些pod中运行任何东西。可以想象,我可以在这个K8s Cronjob中运行kubectl,但是这看起来非常的笨拙和危险。
第二种选择是让crond(或者像JobberCronenberg这样的替代工具)作为pod的一部分运行,但这意味着两个进程正在运行,如果cron进程停止运行,容器可能不会停止运行。
第三种选择是通过一个特殊的init进程(如s6-overlay)来运行多进程容器,如果一个子进程死亡,可以使其死亡,但这似乎相当复杂,几乎不是一个一流的特性。
我能想到的第四个选择是“不要这样做,这很愚蠢。重新设计你的应用程序,这样它就不需要每周被”轻推“一次”。这是一个合理的建议,但有很多工作要做,我至少需要一个临时的解决方案。
那么,有没有人有比这里详细介绍的更好的想法?

odopli94

odopli941#

我认为最简单的解决方案是在sidecar容器(即同一pod中的另一个容器)中运行crond(或您选择的替代方案),请记住,pod中的所有容器共享相同的网络名称空间,因此localhost对于所有容器都是相同的。
这意味着您的cron容器可以很高兴地运行curlwget命令(或任何其他必要的命令)来通过本地端口ping您的API。
例如,类似于下面这样,我们的cron任务只是针对api容器中运行的Web服务器运行wget

apiVersion: v1
data:
  root: |
    * * * * * wget -O /tmp/testfile http://127.0.0.1:8080 2> /tmp/testfile.err
kind: ConfigMap
metadata:
  labels:
    app: cron-example
  name: crontabs-ghm86fgddg
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: cron-example
  name: cron-example
spec:
  replicas: 1
  selector:
    matchLabels:
      app: cron-example
  template:
    metadata:
      labels:
        app: cron-example
    spec:
      containers:
      - image: docker.io/alpinelinux/darkhttpd:latest
        name: api
      - command:
        - /bin/sh
        - -c
        - |
          crontab /data/crontabs/root
          exec crond -f -d0
        image: docker.io/alpine:latest
        name: cron
        volumeMounts:
        - mountPath: /data/crontabs
          name: crontabs
      volumes:
      - configMap:
          name: crontabs-ghm86fgddg
        name: crontabs

相关问题