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

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

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2025-2-10 10:08:15 | 显示全部楼层 |阅读模式
kubernets 的容器中日志大kubectl 如何清理容器日志% x; e. j8 B) v) T6 H. F5 f

7 G* q2 T" B9 j8 }8 {/ p- q% l
- m4 {6 Z' _8 g" [/ I
  • 创建一个定时任务(CronJob)来定期清理Pod的日志文件。可以使用kubectl create cronjob命令来创建一个定时任务。

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

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

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


    ' s3 a3 L% e3 T1 s3 m6 {

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

" N0 d- @! M7 ~' @- q! o" G

+ G5 r  V% k3 N. K' G( ?0 z0 J) n


3 ^3 [3 M  o% ~

& ]6 R- P0 W% M! @2 u8 U5 M1 p/ M1 S


8 X! `+ L& r. k8 _8 I% S磁盘写满引发的后果
& \# h# k% O' U容器数据磁盘写满造成的后果:. g! ~% w4 c5 P- P1 o

0 ^! \% }# \  |4 H  P4 ^Pod 不能删除 (一直 Terminating)( W# C4 S/ k$ B
Pod 不能被创建 (一直 ContainerCreating)
0 p# Q* A# A7 }# ]! Z. i- H磁盘写满分两种情况:0 r/ B/ I. h5 D, s, o

1 i: ?1 U5 Y/ X! a9 w磁盘空间全部使用完
5 i( R- l9 k, M" z
7 M4 u0 p5 b* u( }# 系统盘被占满$ df -Th文件系统       类型      容量  已用  可用 已用% 挂载点/dev/vda1    ext4      50G  50G   0G   100% //dev/vdb1    ext4    100G  10G  90G   10% /data2 f. R) u1 n' z
磁盘 Inode 全部使用完
/ s3 x8 J. \1 K- i$ t
2 W$ D' ~0 W7 u1 p2 n& c# 数据盘 Inode 被占满$ df -i文件系统       Inode 已用(I) 可用(I) 已用(I)% 挂载点/dev/vda1    3276800  3276800 0      100% /  {5 f5 q2 @! f
判断磁盘写满方法' A9 N' _5 H8 T
下面命令能快速的排查磁盘占满原因:  [" ~* [9 E9 z
5 L" y1 K5 I7 y1 I' k. X" ]
docker info | grep 'Docker Root Dir' # 检查 Docker 存储目录# U) Y, ]7 E$ y' n# J8 Y
docker system df # 查看容器磁盘使用情况0 N  Y: C" N7 p) |9 z
df -hT # 检查宿主机 磁盘空间 使用情况; z' b  s. [$ N" R4 z6 W( s/ r, i
df -i # 检查宿主机 Inode 使用情况* s) D- J6 ?' t- G- n9 q% s: X
解决方法
! U% ~# k, \: cPS:保证业务能正常使用为第一原则解决问题. K# Z. j: ~4 C" r+ g
) p3 W" x( _- e" G9 ]" I
标记 Node 为不可调度( P: B" s8 W  ?* C- y

: I& U" F+ x4 z6 E% L$ kubectl drain ${node-name}
% Z5 s" o9 L3 r. Q& b6 u3 y+ L查找那个容器输出日志占用最大
6 ^; N; Y( r# n! Q1 |4 a7 j6 T( Z- q5 I2 k
$ 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( U# l6 z$ j& k) V4 y  J
清空容器日志文件
" q. c3 z! |/ w0 y5 z% ?" d" C% G+ Q) N2 v) n
注意:如果需要重启 docker服务,首先腾出一点磁盘空间,不然重启 docker 会失败。不能直接使用 rm 删除日志文件,这样磁盘空间是不会释放的。不小心这样操作,那只能通过 systemctl restart docker 重启 Docker 服务释放磁盘空间,如果磁盘还是没有释放,可以通过 lsof | grep -i delete 查找已删除的文件进程,找到后直接 kill掉。0 x* B, P' x: p0 `/ _5 Y% n- t( t

5 l* d7 J7 s% p3 B1 }# 通过 echo 命令 清空日志文件$ echo > /var/lib/docker/containers/d0e330944a074268a1f0998fd66ee73f584642352a2fe77304c1fa49b819893a/d0e330944a074268a1f0998fd66ee73f584642352a2fe77304c1fa49b819893a-json.log
1 d: [3 L, ?& W- D. f% Y( `$ i清理节点不用的 images,释放磁盘空间9 p" D! f! A" f4 `, [, S
4 B$ \3 ~. A6 G. b6 E7 W) U" b8 \
# 查看 docker 镜像$ docker images# 删除不用的镜像$ docker rmi ${images_id}
" K3 M# h' g- R* ^$ `6 m上面步骤操作完后(上面清理日志方法,可能对于收集日志程序会丢失一些日志,但一般情况能接受),可以选择驱赶节点上所有pod(kubectl drain ${node-name} )再优化Docker配置。也可以不驱赶节点上pod,在现基础上优化容器日志方法,优化配置后重启 Docker,这会导致节点上pod中断一会,如果前端反向代理具备重试机制一般不会影响业务正常访问。
6 y# ~, ]9 t, L' i; s# X: q' v1 g9 i0 k
优化完 Docker配置后,把节点加入到k8s集群中,正常服务。
0 u3 ]$ `* O" f3 o2 S$ k4 l4 K
  K/ X8 z  v; z0 j) X' P$ l' L# 取消不可调度的标记$ kubectl uncordon ${node-name}7 `6 _) M5 v8 g; q, a
定位问题根本原因及解决思路# T- F0 N( Q; t: L) h
日志输出量大,导致磁盘写满. X+ I+ A5 ~3 b! K
7 @3 w! k; }7 R" d: I6 u+ X
减少日志输出,调整应用日志输出级别2 X, c, B% B( G1 R! q
增大磁盘空间
- o' C* \5 E' b# N) H" H* Y: B* \日志输出到统一日志收集中心; d0 q* ?2 B& a3 w" f8 v( R
容器镜像占满磁盘
1 M/ U+ g/ p$ ^4 p3 s0 ^- s
8 j' ]! V3 U- X! ~. f配置k8s垃圾回收策略
) i% w1 ?( u' L节点运行 images 定时清理脚本; ]3 p, @% _, e  E2 V
可写层量大导致磁盘写满: 优化程序逻辑,不写文件到容器内或控制写入文件的大小与数量8 |; [' X' K. @, [( T
- D5 l. ?0 f. o+ f$ {) `4 ^
具体优化方法* O* E! V: _" ?' n% s# M! x
配置 Docker日志轮转,数据目录不要存放在系统盘
8 |! N) r5 ?8 V7 z6 H* f; _6 Y5 d% j1 r+ B" |6 ?
$ vim /etc/docker/daemon.json{"registry-mirrors": ["https://4xr1qpsp.mirror.aliyuncs.com"], "graph": "/data/docker", "log-opts": {"max-size":"500m", "max-file":"3"}}
' `8 Z- y- d. r8 n' g配置解释:
* B1 J  H4 @# J- x3 {2 U0 Y" L- O0 Z% N' e0 @2 `
配置完,重启 docker才能生效,日志轮转只对以后新创建的容器有效。
% |0 d4 o6 v& b6 y, b( D6 p7 }
" @/ r) R3 T  Bregistry-mirrors 镜像加速配置
- G4 j  R: U1 B7 O/ X8 hgraph 定义数据存储目录
. F% w, S2 L* |; |6 S" G( pmax-size=500m 意味着一个容器日志大小上限是500M7 `: h# j% u" G' g; l
max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json. X0 {6 f, j# [: D3 z; m
清理 docker images
+ G) M: ]0 M. P. M9 R1 y
% M& d8 |$ z5 K( V2 l: w' s定时清理脚本: J1 l% _: r1 x! y1 Q

& Y- u$ A. M9 g3 T) @$ 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
( D3 r6 y& z" H5 W3 O; P" wkubernetes 垃圾回收配置,这里不在细讲,具体参考官方配置文档 https://kubernetes.io/docs/conce ... garbage-collection/
4 o; _* @, N1 h8 L8 z
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-11 23:27 , Processed in 0.017623 second(s), 22 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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