Kubernetes 运行有意定期退出的容器

Kubernetes 运行有意定期退出的容器,kubernetes,Kubernetes,我如何让Kubernates自动重新启动一个有意退出的容器,以便从环境变量中获取新数据 我有一个在Kubernates群集上运行的容器,该群集以以下方式运行: 容器启动,轮询工作 如果它收到一个任务,它会做一些工作 它再次为工作投票,直到 。。容器已经运行了一段时间,之后退出,而不是轮询更多的工作 它需要不断地重新启动,因为它使用由Kubernates秘密填充的环境变量,这些秘密由另一个进程定期刷新 我尝试过部署,但它似乎不太适合,因为我得到了CrashLoopBackOff状态,这意味着工

我如何让Kubernates自动重新启动一个有意退出的容器,以便从环境变量中获取新数据

我有一个在Kubernates群集上运行的容器,该群集以以下方式运行:

  • 容器启动,轮询工作
  • 如果它收到一个任务,它会做一些工作
  • 它再次为工作投票,直到
  • 。。容器已经运行了一段时间,之后退出,而不是轮询更多的工作
它需要不断地重新启动,因为它使用由Kubernates秘密填充的环境变量,这些秘密由另一个进程定期刷新

我尝试过部署,但它似乎不太适合,因为我得到了
CrashLoopBackOff
状态,这意味着工作人员的计划越来越少

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-fonky-worker
  labels:
    app: my-fonky-worker

spec:
  replicas: 2
  selector:
    matchLabels:
      app: my-fonky-worker
  template:
    metadata:
      labels:
        app: my-fonky-worker
    spec:
      containers:
      - name: my-fonky-worker-container
        image: my-fonky-worker:latest
        env:
          - name: NOTSOSECRETSTUFF
            value: cats_are_great
          - name: SECRETSTUFF
            valueFrom:
              secretKeyRef:
                name: secret-name
                key: secret-key

我也尝试过CronJob,但这似乎有点不太妥当,因为这可能意味着容器在几秒钟内处于停止状态。

我认为解决这个问题的方法是将容器作为CronJob运行。但不要将启动死线秒作为容器杀手

它按计划运行

在您的容器中,您可以对工作进行N次轮询。
N次后,它退出0。

正如@Josh所说,您需要使用退出0退出,否则它将被视为失败的容器!根据第一个示例,这里是“Pod正在运行并且有一个容器。容器成功退出。”如果您的restartPolicy设置为Always(顺便说一句,这是默认设置)然后容器将重新启动,尽管Pod状态显示为正在运行,但如果您记录Pod,则可以看到容器重新启动

它需要不断地重新启动,因为它使用由Kubernates秘密填充的环境变量,这些秘密由另一个进程定期刷新


对此,我会采取不同的方法。我将按照说明装载配置映射,这将自动刷新装载的配置映射数据。注意:请注意“kubelet中的”kubelet同步周期(默认为1分钟)+ConfigMaps缓存的ttl(默认为1分钟)以管理Pod中configmap数据的刷新率

如果我在您的示例中理解正确,则有两个问题:

  • 重新启动容器
  • 更新秘密值
  • <>为了保持你的秘密,你应该考虑使用评论所描述的秘密,并把秘密作为体积而不是环境变量,是一个例子。

    根据重新启动容器的第二个问题,它取决于下面描述的退出代码

    从另一个角度来看,您可以使用init container等待新任务,也可以使用main container根据您的需求继续执行此任务,或者创建作业调度器

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      labels:
        app: complete
      name: complete
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: complete
      template:
        metadata:
          labels:
            app: complete
        spec:
          hostname: c1
          containers:
          - name: complete
            command: 
            - "bash"
            args:
            - "-c"
            - "wa=$(shuf -i 15-30 -n 1)&& echo $wa && sleep $wa"
            image: ubuntu
            imagePullPolicy: IfNotPresent
            resources: {}
          initContainers:
          - name: wait-for
            image: ubuntu
            command: ['bash', '-c', 'sleep 30']
      restartPolicy: Always
    
    请注意:

    • 当卷中已经使用的秘密被更新时,投影的密钥最终也会被更新。Kubelet正在检查装载的秘密是否在每次定期同步时都是新的。但是,它正在使用其本地缓存获取机密的当前值。 可以使用(KubeletConfiguration结构中的ConfigMapAndSecretChangeDetectionStrategy字段)配置缓存的类型。它可以通过watch(默认)进行传播,基于ttl,或者直接将所有请求重定向到kube apiserver。因此,从密钥更新到新密钥投影到Pod的总延迟可以与kubelet sync period+缓存传播延迟一样长,其中缓存传播延迟取决于所选缓存类型(它等于监视传播延迟、缓存ttl或零协同响应)
    • 使用机密作为子路径卷装载的容器将不会收到机密更新
    另请参阅:


    如果您将秘密作为装入的卷而不是环境变量注入,并轮询读取代码中的文件,该怎么办?