【发布时间】:2020-09-16 11:24:00
【问题描述】:
我在 Kubernetes 集群上部署了一个基于 Go 的应用程序。
我使用golang:1.13 作为我的基本图像
这些容器上的 /var/log 文件夹不断填满,导致 pod 被驱逐。
有没有一种方法可以让我在 deployment.yaml 中指定某些内容,或者我可以禁止将系统日志写入文件系统的类似内容?
【问题讨论】:
标签: kubernetes dockerfile
我在 Kubernetes 集群上部署了一个基于 Go 的应用程序。
我使用golang:1.13 作为我的基本图像
这些容器上的 /var/log 文件夹不断填满,导致 pod 被驱逐。
有没有一种方法可以让我在 deployment.yaml 中指定某些内容,或者我可以禁止将系统日志写入文件系统的类似内容?
【问题讨论】:
标签: kubernetes dockerfile
您可能应该设置某种日志轮换系统,大多数安装程序都会这样做。但是如果做不到这一点,如果您想禁用将容器输出收集到日志文件,您可以在 Dockerd 配置中执行此操作,通常它是在 dockerd 的 systemd 单元文件中设置的,但具体取决于您的部署。
【讨论】:
有几种方法可以解决这个问题,解决这个问题实际上取决于您的应用程序、环境和您的创造力。
Kubernetes documentation 描述了几种实现您需要的方法,并且在所有这些方法上都使用了 logrotate。
建议是:
作为一个关于如何利用你的创造力来解决这个问题的示例,一个简单的解决方案是在 /var/log 上挂载一个卷并将所有日志保存在外部,这样你就可以有更多空间来存储这些日志您可以在外部处理它们,根据需要进行清洁或维护。在此示例中,我使用 CronJob 来“删除”文件。
例子:
apiVersion: v1
kind: PersistentVolume
metadata:
name: logsvol
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: logsvol
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: Pod
metadata:
name: counter
spec:
containers:
- name: count
image: busybox
args:
- /bin/sh
- -c
- >
i=0;
while true;
do
echo "$i: $(date)" >> /var/log/1.log;
i=$((i+1));
sleep 1;
done
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- name: varlog
persistentVolumeClaim:
claimName: logsvol
您可以创建一个 CronJob 来为您清理(在此示例中我只是列出它)这些日志:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: logcleaner
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- ls -l /var/log
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- name: varlog
persistentVolumeClaim:
claimName: logsvol
restartPolicy: OnFailure
【讨论】: