生产上如果对k8s服务日志没有那么看重,或者小集群没有必要使用EFK这类方式收集日志,可以直接将日志存到宿主主机目录下,通过配置Pod的YAML文件,将宿主机上的目录挂载到Pod中,使Pod中的日志直接写入到宿主机的目录中,从而实现日志的本地保存。这种方法通常使用HostPath或PersistentVolume(PV)和PersistentVolumeClaim(PVC)来实现。
Volume挂载方案
如果使用Volume挂载方案将日志写入宿主机目录,那么即使Pod被删除,宿主机上的日志文件仍然保留。这种方式的好处是简单直接,但需要注意宿主机磁盘空间的管理。
注意事项
- 安全性:当使用HostPath或挂载宿主机目录时,需要注意安全问题,确保Pod中的应用程序不会意外地访问或修改宿主机上的敏感文件。
- 数据备份:对于重要的日志数据,建议定期备份以防数据丢失。
- 资源使用:使用日志收集器或挂载大量日志到宿主机时,需要考虑对集群资源(如CPU、内存、磁盘空间)的影响。
不管使用hostPath存储还是使用pv、pvc存储都需要修改dockerfile文件
Dockerfile
需要修改dockerfile文件 ,让输出的日志保存到容器的某个目录下,然后将这个容器的目录挂载到node的目录下,输出日志文件名为了容易查找设置为pod名称
[root@jenkins jsh]# cat /data/images/jsh/backend_Dockerfile
FROM XXXXX.XXXXXX.cn/jdk/jdk:1.8
MAINTAINER XXXX <XXXX@XX.com>
# 添加Jar包到镜像中
ADD XXXXX.jar /app.jar
# 设置工作目录(可选,根据您的需求决定是否需要)
WORKDIR /
# 暴露端口
EXPOSE 80
# 启动Jar包,并将日志同时输出到屏幕和文件
ENTRYPOINT sh -c 'java -server -Xms128m -Xmx320m -XX:PermSize=128M -XX:MaxPermSize=256M -Dspring.pid.fail-on-write-error=true -jar /app.jar 2>&1 | tee /jsh-logs/backend-$(hostname).log'
#$(hostname) 这个变量 是pod的名字,这样输出的日志文件容易识别
hostPath方式
也是我生产上使用的方法
deployment的配置文件部分
....
....
#deployment.spec.template.spec.volumes
spec:
volumes:
- name: log-jsh-backend #起个名字
hostPath:
path: /data/log/jsh/backend/ #node的目录 挂载目录
....
....
#deployment.spec.template.spec.containers.volumeMounts
volumeMounts:
- name: log-jsh-backend #引用上面的名字
mountPath: /jsh-logs/ #这个是在dockerfile就定义了
这样日志就保存到对应启动的node主机的目录上了
PVC方式
nfs-pvc
storageclasses
[root@k8s-node2 backend]# kubectl get storageclasses.storage.k8s.io
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-guoguo nfs-provisioner-01 Retain Immediate false 6d4h
[root@jenkins jsh]# cat jsh-backend-nfs-pvc-storageclass.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-jsh-backend-log
namespace: jsh
spec:
accessModes: #使用的模式
- ReadWriteMany #可被多个pod同时读写
resources:
requests:
storage: "10Gi" ##存储大小为10G 不过对于NFS来说 这个没用 限制不了
storageClassName: nfs-guoguo # #使用的storageclass名字为
deployment的配置文件部分
....
....
# deployment.spec.template.spec.volumes.persistentVolumeClaim
spec:
volumes:
- name: nfs-log-jsh-backend
persistentVolumeClaim:
claimName: nfs-jsh-backend-log #pvc的名字
....
....
# deployment.spec.template.spec.containers.volumeMounts
volumeMounts:
- name: nfs-log-jsh-backend
mountPath: /jsh-logs/
这样日志就保存到对应的PV里面了