生产上如果对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_DockerfileFROM 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的名字,这样输出的日志文件容易识别
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

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就定义了
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

这样日志就保存到对应启动的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名字为
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

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/
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

这样日志就保存到对应的PV里面了