找回密码
 注册
查看: 14|回复: 0

kubernets 的容器中日志大kubectl 如何清理容器日志

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2025-2-10 10:08:15 | 显示全部楼层 |阅读模式
kubernets 的容器中日志大kubectl 如何清理容器日志) v/ E; Y3 k! Z1 P" C
- M- D' U3 \# X6 _2 E4 ]! ]3 ~

" ^8 }1 `. @: K# u9 L! \
  • 创建一个定时任务(CronJob)来定期清理Pod的日志文件。可以使用kubectl create cronjob命令来创建一个定时任务。

  • 在CronJob中使用kubectl delete pod <pod-name>命令来删除指定Pod的日志文件。可以通过标签选择器来选择需要清理的Pod。

  • 可以在CronJob中使用kubectl logs <pod-name> --tail=0命令来清空Pod的日志文件,然后再删除Pod。

  • 设置合适的定时任务调度规则,比如每天凌晨执行清理操作。


    $ |  ?. q$ x  |) n+ P

请注意,在清理Pod的日志文件之前,请确保备份重要的日志数据以防丢失。另外,建议在清理操作之前先测试一下命令是否能够正确执行。

: M& M% E9 W8 |) H" r7 P9 ?. r


8 e8 z  Z, }( p

% @- H; z9 {1 }4 T  R. l: j

: V: I9 \6 L+ i8 K7 K5 X

$ Y% }  o/ A+ f2 W7 y' |1 O
磁盘写满引发的后果$ H, q& I' h) U6 O4 g
容器数据磁盘写满造成的后果:  B2 D. u$ \- r) T

" X+ L$ `( Y5 y9 Z( Q2 kPod 不能删除 (一直 Terminating)
9 S% I( Z) B8 E2 n6 wPod 不能被创建 (一直 ContainerCreating)  n6 O; p; G7 u) l, @7 c
磁盘写满分两种情况:
6 @8 Q- }( k- L6 S
! a  \: j8 z0 D3 G2 q磁盘空间全部使用完
/ P% I) y! N8 L
. x% J/ w4 L; K+ V% O* q- K# 系统盘被占满$ df -Th文件系统       类型      容量  已用  可用 已用% 挂载点/dev/vda1    ext4      50G  50G   0G   100% //dev/vdb1    ext4    100G  10G  90G   10% /data+ H, f% M& |9 m/ m
磁盘 Inode 全部使用完; t+ f+ `- p1 R+ u7 S, l% `8 o$ p
. U* v% p5 ]8 Z; |" }" a4 }  G
# 数据盘 Inode 被占满$ df -i文件系统       Inode 已用(I) 可用(I) 已用(I)% 挂载点/dev/vda1    3276800  3276800 0      100% /
) }: h/ P# J0 V$ G' b判断磁盘写满方法
1 x& v- ^% O( ^+ w0 v下面命令能快速的排查磁盘占满原因:
, y' F  C' {2 N9 ]0 i
9 @1 H' D- e! E! X. P' b8 Cdocker info | grep 'Docker Root Dir' # 检查 Docker 存储目录1 M5 I2 O( _) `2 K& V9 w8 K
docker system df # 查看容器磁盘使用情况4 b5 e% I+ X# A
df -hT # 检查宿主机 磁盘空间 使用情况! H$ D& l- X; v2 m2 }% X& [* F
df -i # 检查宿主机 Inode 使用情况) c; R3 d+ F; q6 q+ p
解决方法- d' @9 p0 D. t6 @2 @- v1 u: V
PS:保证业务能正常使用为第一原则解决问题  ^) e/ x! y+ a) s; X& M" m7 T

9 r! ~, l* n& N8 n% ?6 E标记 Node 为不可调度( T1 \: r$ q3 s6 t* ?
) Y2 r+ _' o, b2 a- Y" d5 c7 H' m5 O
$ kubectl drain ${node-name}
" L/ n0 I8 H+ Q) {3 |查找那个容器输出日志占用最大5 e* z- }+ |: I+ {- z4 b/ O

! c1 V8 b3 d1 Z9 {9 k4 _$ 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
* ~( `+ ?" w. j7 O0 ~+ s! n清空容器日志文件
) }; F+ J+ @- O. D  P* t( c- m; ^  F/ i
. y/ c0 p' a( x! B& w" z! z& v- D3 H7 x; Z注意:如果需要重启 docker服务,首先腾出一点磁盘空间,不然重启 docker 会失败。不能直接使用 rm 删除日志文件,这样磁盘空间是不会释放的。不小心这样操作,那只能通过 systemctl restart docker 重启 Docker 服务释放磁盘空间,如果磁盘还是没有释放,可以通过 lsof | grep -i delete 查找已删除的文件进程,找到后直接 kill掉。
3 V; m# t8 v/ K& i+ H0 D; L" F0 J
* o- v+ a4 `5 R) n4 M$ P3 C# 通过 echo 命令 清空日志文件$ echo > /var/lib/docker/containers/d0e330944a074268a1f0998fd66ee73f584642352a2fe77304c1fa49b819893a/d0e330944a074268a1f0998fd66ee73f584642352a2fe77304c1fa49b819893a-json.log. t( I( P$ n0 ?0 ]
清理节点不用的 images,释放磁盘空间
/ A# ~2 t6 s, t* F* X4 C( a  n. r5 V+ h1 G" H# `
# 查看 docker 镜像$ docker images# 删除不用的镜像$ docker rmi ${images_id}
* H* ~# s6 H. }& @9 a2 D: w, j上面步骤操作完后(上面清理日志方法,可能对于收集日志程序会丢失一些日志,但一般情况能接受),可以选择驱赶节点上所有pod(kubectl drain ${node-name} )再优化Docker配置。也可以不驱赶节点上pod,在现基础上优化容器日志方法,优化配置后重启 Docker,这会导致节点上pod中断一会,如果前端反向代理具备重试机制一般不会影响业务正常访问。
9 R& w  ?9 s& P, x) q: L$ `$ k( s7 E+ a2 {7 u
优化完 Docker配置后,把节点加入到k8s集群中,正常服务。
% r# F& h; g4 z" k  T& R- X( A% m* ]1 O  e. d4 B! @% s
# 取消不可调度的标记$ kubectl uncordon ${node-name}' _6 |$ B3 H2 T* E8 R
定位问题根本原因及解决思路
3 z( v& M; E  C7 a日志输出量大,导致磁盘写满
, O5 T) y! p; x0 y$ O1 y  ~7 J8 j" Y1 R/ q
减少日志输出,调整应用日志输出级别
! P5 i0 s/ m0 x: s增大磁盘空间. R" b, ~3 [" o; K5 s; V
日志输出到统一日志收集中心4 a' S( h5 R% w
容器镜像占满磁盘% ^2 o1 G4 d3 Q' p& u* t3 G

! h) I3 u% s4 N, k/ o配置k8s垃圾回收策略% C; M# k1 R( F0 w2 @3 y4 h
节点运行 images 定时清理脚本
5 l- }' U" @' T; P2 f/ ^0 Y可写层量大导致磁盘写满: 优化程序逻辑,不写文件到容器内或控制写入文件的大小与数量
& l. w' [0 }& K8 D8 @
& [4 G2 b  p6 u7 N* R5 X6 T9 P具体优化方法
" ~/ \: p1 r+ Z- P0 K% s配置 Docker日志轮转,数据目录不要存放在系统盘+ S$ k+ ~+ v) _
7 y4 a/ H; f, ?8 Y& T
$ vim /etc/docker/daemon.json{"registry-mirrors": ["https://4xr1qpsp.mirror.aliyuncs.com"], "graph": "/data/docker", "log-opts": {"max-size":"500m", "max-file":"3"}}) _9 Q, d, n& f' ~" l
配置解释:# e( R1 w( Z/ H& K! G

) m. l: r; C4 I4 D配置完,重启 docker才能生效,日志轮转只对以后新创建的容器有效。
5 k8 S% @/ t  H# I! }3 r  n0 }( M4 m
registry-mirrors 镜像加速配置
) M; q  l4 U! z8 Z- }9 bgraph 定义数据存储目录
5 M/ t) y* Q5 Z9 ?& G4 Tmax-size=500m 意味着一个容器日志大小上限是500M
) w2 y1 C2 {; }$ l2 `max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json
& q5 u9 K: E9 C- c: v6 W清理 docker images
/ r8 N& d4 n1 i/ V) ]0 B
7 d! Z% `) t4 @' _3 ~% @% C4 @定时清理脚本
8 r' f) h; |# _
; ?( }* z6 X/ v9 t( r, m$ 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  X5 U- q3 A' a6 a. B% M3 Q
kubernetes 垃圾回收配置,这里不在细讲,具体参考官方配置文档 https://kubernetes.io/docs/conce ... garbage-collection/8 C" s6 J3 O; F5 Y
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 00:26 , Processed in 0.013357 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表