容器内的日志输出有多重方式:容器内文件、stdout、stderr等等,我们在解决nginx-ingress-controller的日志持久化过程中,以k8s的编排和组织能力,尝试非侵入地解决各种问题,包括目录权限与挂载的问题、nginx配置问题、日志轮转的问题。希望这些解决方法,可以为读者容器化应用的日志落盘提供思路。
从需求说起
轻舟微服务平台大量地依赖nginx-ingress-controller进行流量管理和负载均衡,因此该组件的日志维护非常重要。
轻舟k8s团队设计了一个较为无侵入的方案,通过这个方案可以将nginx-ingress-controller的日志输出,不论是accesslog还是klog库输出的日志,都能进行重定向落盘和轮转、清理。 我们发现这个日志持久化方案基本可以应对绝大多数的容器应用的日志持久化需求。
nginx-ingress-controller的日志
nginx-ingress-controller的日志包括三个部分:
-
controller日志:输出到stdout,通过启动参数中的–log_dir可已配置输出到文件,重定向到文件后会自动轮转,但不会自动清理
-
accesslog:输出到stdout,通过nginx-ingress-controller的配置文件——configmap:
nginx-configuration中的字段可以配置输出到哪个文件。输出到文件后不会自动轮转或清理 -
errorlog:输出到stderr,配置方式与accesslog类似。