在 Kubernetes 中使用 Cron 作业访问日志。

25

我正在kubernetes中运行一个CronJob,任务成功完成并将输出记录到存储在路径storage/logs下的日志文件中,但由于容器处于已完成状态,我无法访问该文件。

这是我的job yaml:

apiVersion: v1
items:
- apiVersion: batch/v1beta1
  kind: CronJob
  metadata:
    labels:
      chart: cronjobs-0.1.0
    name: cron-cronjob1
    namespace: default
  spec:
    concurrencyPolicy: Forbid
    failedJobsHistoryLimit: 1
    jobTemplate:      
      spec:
        template:
          metadata:          
            labels:
              app: cron
              cron: cronjob1
          spec:
            containers:
            - args:
              - /usr/local/bin/php
              - -c
              - /var/www/html/artisan bulk:import
              env:
              - name: DB_CONNECTION
                value: postgres
              - name: DB_HOST
                value: postgres
              - name: DB_PORT
                value: "5432"
              - name: DB_DATABASE
                value: xxx
              - name: DB_USERNAME
                value: xxx
              - name: DB_PASSWORD
                value: xxxx
              - name: APP_KEY
                value: xxxxx
              image: registry.xxxxx.com/xxxx:2ecb785-e927977
              imagePullPolicy: IfNotPresent
              name: cronjob1
              ports:
              - containerPort: 80
                name: http
                protocol: TCP              
            imagePullSecrets:
            - name: xxxxx
            restartPolicy: OnFailure          
            terminationGracePeriodSeconds: 30
    schedule: '* * * * *'
    successfulJobsHistoryLimit: 3

有没有办法让我的日志文件内容显示在kubectl log <podname>命令或其他替代方法中?

2个回答

18

Cronjob 根据 spec.schedule 运行Pod。完成任务后,Pod 的状态将设置为 completed,但 cronjob 控制器在完成后不会删除Pod。而且日志文件内容仍然保存在Pod的容器文件系统中。所以你需要做的是:

# here  you can get the pod_name from the stdout of the cmd `kubectl get pods`
$ kubectl logs -f -n default <pod_name>

2
这仅适用于标准输出,我需要在Pod内部记录到文件中,我需要不同的机制。 - Jack
1
我也注意到了,这仅适用于标准输出(stdout),不能用于标准错误(stderr)。 - linehrr
@linehrr 我没有检查过,也许你是对的。 - Shudipta Sharma

13
我猜您知道pod被保留,因为您设置了successfulJobsHistoryLimit: 3。您的意思可能是您的日志记录被记录到文件而不是标准输出,所以您在使用kubectl logs时看不到它。如果是这样,您也可以记录到标准输出或者在任务结束时使用PreStop hook将文件内容记录下来,例如

太棒了,我要使用日志管理,因为有一些日志文件我想要集中访问。 - Jack

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