Kubernetes CronJob启动问题

hjqgdpho  于 2023-02-03  发布在  Kubernetes
关注(0)|答案(2)|浏览(160)

我从Kubernetes开始,实现了一个运行Java jar的CronJob,它运行得很好,但我观察到,如果由于某种原因(例如,错误的密钥)容器没有启动,pod将无限期地处于错误状态:创建容器配置错误。
当这种情况发生时,有没有办法自动杀死吊舱?
我尝试使用启动探测器,如下面的代码所示,但探测器甚至没有运行。

apiVersion: batch/v1
kind: CronJob
metadata:
  name: appName
  namespace: appNamespace
  labels:
    app: appName
    release: production
    tiers: backend
spec:
  jobTemplate:
    spec:
      backoffLimit: 2
      template:
        spec:
          volumes:
            - name: tmp-pod
              emptyDir: {}
          containers:
            - name: appName
              image: docker-image
              command: ["/bin/bash", "-c"]
              args:
                - |
                  touch /tmp/pod/app-started; 
                    java -XX:MaxRAMPercentage=75.0 -Djava.security.egd=file:/dev/urandom -jar /app.jar;
              volumeMounts:
                - mountPath: /tmp/pod
                  name: tmp-pod
              env:
                - name: env_var
                  value: value
              # if app is not started within 5m (30 * 10 = 300s), container will be killed.
              startupProbe:
                exec:
                  command:
                  - cat
                  - /tmp/pod/app-started
                initialDelaySeconds: 5
                periodSeconds: 10
                failureThreshold: 30
              resources:
                requests:
                  memory: "2200Mi"
                  cpu: "750m"
                limits:
                  memory: "2200Mi"
          restartPolicy: OnFailure
  schedule: "0 12 * * *"
  concurrencyPolicy: Forbid

CronJob不支持探测吗?还是我做错了什么?
是否有其他方法可以杀死一段时间后无法启动的容器?

jjjwad0x

jjjwad0x1#

我有同样的问题,kubernetes v1. 23. 14似乎kubernetes有一个错误与cronjobs probs
事件:

Normal   Started                 3m38s  kubelet                  Started container k8s-costs
  Warning  Unhealthy               3m38s  kubelet                  Startup probe failed: cat: /var/run/secrets/vault-envs: No such file or directory
  Normal   Killing                 3m37s  kubelet                  Stopping container k8s-costs

kubelet说"停止容器",但它仍然工作
因此,我看到pod已成功,一切正常,没有警报。但实际上作业执行失败,我们已经陷入火灾

2o7dmzc5

2o7dmzc52#

如果Pod中的容器无法启动,则可以使用活动探测器自动终止Pod。活动探测器会不断检查容器是否正在运行,如果检测到容器出现故障,则会重新启动容器。
以下是如何将活动探测器添加到pod定义的示例:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: appName
  namespace: appNamespace
  labels:
    app: appName
    release: production
    tiers: backend
spec:
  jobTemplate:
    spec:
      backoffLimit: 2
      template:
        spec:
          volumes:
            - name: tmp-pod
              emptyDir: {}
          containers:
            - name: appName
              image: docker-image
              command: ["/bin/bash", "-c"]
              args:
                - |
                  touch /tmp/pod/app-started; 
                    java -XX:MaxRAMPercentage=75.0 -Djava.security.egd=file:/dev/urandom -jar /app.jar;
              volumeMounts:
                - mountPath: /tmp/pod
                  name: tmp-pod
              env:
                - name: env_var
                  value: value
              livenessProbe:
                exec:
                  command:
                  - cat
                  - /tmp/pod/app-started
                initialDelaySeconds: 5
                periodSeconds: 10
                failureThreshold: 30
              resources:
                requests:
                  memory: "2200Mi"
                  cpu: "750m"
                limits:
                  memory: "2200Mi"
          restartPolicy: OnFailure
  schedule: "0 12 * * *"
  concurrencyPolicy: Forbid

在上例中,liveness probe exec命令检查文件/tmp/pod/app-started是否存在。如果在初始延迟5秒后该文件不存在,则探测器将每10秒检查一次,直到达到失败阈值30。此时,将终止容器并重新启动。

相关问题