kubernets 的容器中日志大kubectl 如何清理容器日志
) ^0 Y, C+ U6 A* k( _5 f
1 e" G; S U; K1 f+ v
9 w7 V: A" U% g. w- d) L4 h$ L创建一个定时任务(CronJob)来定期清理Pod的日志文件。可以使用kubectl create cronjob命令来创建一个定时任务。 在CronJob中使用kubectl delete pod <pod-name>命令来删除指定Pod的日志文件。可以通过标签选择器来选择需要清理的Pod。 可以在CronJob中使用kubectl logs <pod-name> --tail=0命令来清空Pod的日志文件,然后再删除Pod。 设置合适的定时任务调度规则,比如每天凌晨执行清理操作。
: I+ Y) E% S5 o, E9 H
请注意,在清理Pod的日志文件之前,请确保备份重要的日志数据以防丢失。另外,建议在清理操作之前先测试一下命令是否能够正确执行。
1 V [2 T6 ^& A$ Y2 P! n4 X
3 p) w1 T: e' g( E
9 B H) v9 _/ c$ }
2 N) x7 M) ?# H) r/ y- l: B* u
- J3 d5 h# d3 ]7 }8 G磁盘写满引发的后果: @2 Z7 p8 `# _6 q3 A1 y! ]
容器数据磁盘写满造成的后果:
- J u5 x x O; p g! i4 Q" I5 V
Pod 不能删除 (一直 Terminating)
( i- \. X/ p: { A% JPod 不能被创建 (一直 ContainerCreating)5 M5 [# A" q- g1 `" L
磁盘写满分两种情况:% {6 N/ R; o, W; }% j
6 }8 ~4 X& p4 L, S7 J/ j4 o
磁盘空间全部使用完
, e5 m4 [( f9 Y% M" x
3 Z4 V+ F, C* H7 M# 系统盘被占满$ df -Th文件系统 类型 容量 已用 可用 已用% 挂载点/dev/vda1 ext4 50G 50G 0G 100% //dev/vdb1 ext4 100G 10G 90G 10% /data
9 i2 S, I; w- B6 [2 V磁盘 Inode 全部使用完8 ?' s4 R6 i# g; z
0 M; e: f6 J- _" }) D4 B
# 数据盘 Inode 被占满$ df -i文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点/dev/vda1 3276800 3276800 0 100% /" G! y% ?2 E- S4 I1 G- C! G3 q7 \( i
判断磁盘写满方法& w) Z5 [ t/ r. v
下面命令能快速的排查磁盘占满原因:
2 {' d. D) E& @) a" ] I* w. t
4 o( j+ G5 F5 Vdocker info | grep 'Docker Root Dir' # 检查 Docker 存储目录
) i- I1 @9 H% p/ U# i0 xdocker system df # 查看容器磁盘使用情况
# B& s. ?3 M5 p5 u" Cdf -hT # 检查宿主机 磁盘空间 使用情况
[; A: X9 n0 X. Z" l+ M, c/ [df -i # 检查宿主机 Inode 使用情况
( C, D, R: y% d+ J" a解决方法
6 J! G+ [0 E' _4 sPS:保证业务能正常使用为第一原则解决问题0 P' g# H, l% _2 ~5 f0 W( S5 [
G; {7 M9 d' D( u
标记 Node 为不可调度3 c3 B$ T+ v( G0 J8 F: T
# A6 W+ B; ?# h: m, j z/ h! [
$ kubectl drain ${node-name}! ?' M! |6 J/ |0 ?5 {* m9 r
查找那个容器输出日志占用最大1 E6 v: r; C/ Z5 w9 f
, e5 S$ b! p8 `$ for name in $(docker ps -a | awk '{print $1}' | grep -v CONTAINER); do docker inspect $name | grep LogPath | awk '{print $NF}' | tr -d '",' |xargs du -sh;done5G /var/lib/docker/containers/d0e330944a074268a1f0998fd66ee73f584642352a2fe77304c1fa49b819893a/d0e330944a074268a1f0998fd66ee73f584642352a2fe77304c1fa49b819893a-json.log. Z9 `2 b7 {1 y
清空容器日志文件" A" P7 W% x: s0 f% O
) [: E2 C) I$ n& N2 b3 V5 n1 f注意:如果需要重启 docker服务,首先腾出一点磁盘空间,不然重启 docker 会失败。不能直接使用 rm 删除日志文件,这样磁盘空间是不会释放的。不小心这样操作,那只能通过 systemctl restart docker 重启 Docker 服务释放磁盘空间,如果磁盘还是没有释放,可以通过 lsof | grep -i delete 查找已删除的文件进程,找到后直接 kill掉。
( X2 v" b9 H' _. e" L ~ t. A7 S4 j( M n% S) ?
# 通过 echo 命令 清空日志文件$ echo > /var/lib/docker/containers/d0e330944a074268a1f0998fd66ee73f584642352a2fe77304c1fa49b819893a/d0e330944a074268a1f0998fd66ee73f584642352a2fe77304c1fa49b819893a-json.log
9 _: l( `' E, x6 k; C! p清理节点不用的 images,释放磁盘空间
) b1 a( g+ v7 j2 S0 }
3 x. C; {' b3 _# 查看 docker 镜像$ docker images# 删除不用的镜像$ docker rmi ${images_id}# s7 O8 p0 u' f9 B6 W
上面步骤操作完后(上面清理日志方法,可能对于收集日志程序会丢失一些日志,但一般情况能接受),可以选择驱赶节点上所有pod(kubectl drain ${node-name} )再优化Docker配置。也可以不驱赶节点上pod,在现基础上优化容器日志方法,优化配置后重启 Docker,这会导致节点上pod中断一会,如果前端反向代理具备重试机制一般不会影响业务正常访问。3 c9 @+ f& Q: n q
3 m [' V9 R" |2 j优化完 Docker配置后,把节点加入到k8s集群中,正常服务。
- Z+ T ?. M" F6 W- W3 F! l, Y/ v( }# M' C: L1 G+ D ]! z& N+ x
# 取消不可调度的标记$ kubectl uncordon ${node-name}
# y$ K" k: [; @1 F; b& ?定位问题根本原因及解决思路
4 l* l, u, t7 v# a; B6 r1 i日志输出量大,导致磁盘写满
9 ]3 M$ h+ e8 }& y0 ]' h# \( }
% g! y( A* r0 ~0 N7 t Z. d, d减少日志输出,调整应用日志输出级别
" F5 S A% Y5 Q8 l增大磁盘空间
) B5 Y9 U7 ]9 m: N7 p7 _日志输出到统一日志收集中心8 c8 _' |+ G( e* Z- i2 W
容器镜像占满磁盘
5 B, z' D4 I2 {/ j ~5 Q! L5 ?4 n# O6 M4 B' w% v
配置k8s垃圾回收策略3 Q! {* k4 j8 `. ^5 R, O
节点运行 images 定时清理脚本
1 s/ g# f) b) u可写层量大导致磁盘写满: 优化程序逻辑,不写文件到容器内或控制写入文件的大小与数量
5 L( P5 q e8 e- g/ q% {- |; {! i6 \! U' }* K5 L# w" P
具体优化方法, `* v: @! W% z5 g+ S/ [/ j
配置 Docker日志轮转,数据目录不要存放在系统盘
2 k% y4 N- s2 F7 |+ r6 w; [! A" X4 W3 c0 T {' U
$ vim /etc/docker/daemon.json{"registry-mirrors": ["https://4xr1qpsp.mirror.aliyuncs.com"], "graph": "/data/docker", "log-opts": {"max-size":"500m", "max-file":"3"}}
5 H; T! [/ g# P* G. R配置解释:" V, E" H& {% o# n i" q4 C
$ C& S |9 H% {: j
配置完,重启 docker才能生效,日志轮转只对以后新创建的容器有效。
7 l$ n7 F+ Z+ G7 s9 h. L% D6 [$ D) F) @/ N4 ~
registry-mirrors 镜像加速配置6 [% k! E- o: _9 z. _; L
graph 定义数据存储目录5 I: N5 @2 t7 P
max-size=500m 意味着一个容器日志大小上限是500M9 M2 c6 @ [7 V2 q2 ]2 Y8 b
max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json
9 t6 A( C( \+ n清理 docker images q4 l; U3 D; r% B
' o0 t3 z) x' ]' Y& e& ? G
定时清理脚本
' O; H9 {8 K& L/ C e' ]1 u M+ U N( z
$ vim docker_delete_image.sh#!/usr/bin/env bashfor images_id in `docker images | grep 'harbor.example.com' | awk '{print $3}'`do docker rmi $images_iddone# 清理 imagesfor images_id_1 in `docker images | awk '$2 ~ ""{print $3}'`do docker rmi $images_id_1done+ A2 f7 {; n9 I1 i1 z
kubernetes 垃圾回收配置,这里不在细讲,具体参考官方配置文档 https://kubernetes.io/docs/conce ... garbage-collection/
- z; t7 c9 S+ r& M/ s- v, w; h* O |