马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
kubernets 的容器中日志大kubectl 如何清理容器日志
" _/ Q0 G+ W3 |4 _% e" H9 m3 | Y& {
) H7 ] A9 d; D. t创建一个定时任务(CronJob)来定期清理Pod的日志文件。可以使用kubectl create cronjob命令来创建一个定时任务。 在CronJob中使用kubectl delete pod <pod-name>命令来删除指定Pod的日志文件。可以通过标签选择器来选择需要清理的Pod。 可以在CronJob中使用kubectl logs <pod-name> --tail=0命令来清空Pod的日志文件,然后再删除Pod。 设置合适的定时任务调度规则,比如每天凌晨执行清理操作。 2 {: Y' f1 `6 B! B8 K
请注意,在清理Pod的日志文件之前,请确保备份重要的日志数据以防丢失。另外,建议在清理操作之前先测试一下命令是否能够正确执行。
: c0 s ]# @! i* t. t4 v; H6 f, ^
7 q5 ?7 k3 j: S" z" A, Q
- B! }/ [5 h1 J- d5 ]
1 s2 n" I7 g+ l0 V
7 \* B* }+ i5 a: r! i) M$ M2 l磁盘写满引发的后果
) [- m( e4 w/ E4 z- D容器数据磁盘写满造成的后果:
( Q: m2 \! \. S( A) p9 k( M4 L" K& b. F
Pod 不能删除 (一直 Terminating)
; i8 c3 \6 o+ S) C' f1 pPod 不能被创建 (一直 ContainerCreating)
6 o. ]& M \9 |磁盘写满分两种情况:
$ N3 Q) j1 y5 W
1 {% e* S7 e2 b: b; l2 d$ x( S* A) k) a磁盘空间全部使用完
5 _5 m' l9 a R, |) E. N' c
2 m4 p' \9 i. {+ K7 n* F1 X# @# 系统盘被占满$ df -Th文件系统 类型 容量 已用 可用 已用% 挂载点/dev/vda1 ext4 50G 50G 0G 100% //dev/vdb1 ext4 100G 10G 90G 10% /data! E$ ]* t4 G5 p1 S3 {* ]
磁盘 Inode 全部使用完- [# U% W: ~9 X/ I8 L9 C
" t( S& Q& C" z' {% j% ]% u+ F) w
# 数据盘 Inode 被占满$ df -i文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点/dev/vda1 3276800 3276800 0 100% /
$ g( C* z/ Z' `4 a3 q判断磁盘写满方法5 A- C4 R# ?0 @* W8 \
下面命令能快速的排查磁盘占满原因:. |, G+ X8 Q1 \% i# D- G" F
- ]7 {* E- k" |# u& d* Y! x7 q
docker info | grep 'Docker Root Dir' # 检查 Docker 存储目录+ z' B' u4 X" ]
docker system df # 查看容器磁盘使用情况$ |5 f9 ?; G% y9 F7 F! V
df -hT # 检查宿主机 磁盘空间 使用情况
. F7 X5 A7 p6 E# |1 qdf -i # 检查宿主机 Inode 使用情况
9 d3 q8 w! M- N解决方法# @3 m6 Z: C; K- e# u# V
PS:保证业务能正常使用为第一原则解决问题
. U. E5 l6 f6 E& j9 C
. Z5 N( S8 P ~# u标记 Node 为不可调度
. @+ g& h. j) b* N* ~ Q
; t+ t: e( ^& K X$ kubectl drain ${node-name}
5 K1 n8 H4 h; d5 M. i* ~查找那个容器输出日志占用最大, ] j' G, C+ x+ D6 t
! ?' x& A( ~/ T, w7 W7 N
$ 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
' w5 C: i+ p0 L7 v清空容器日志文件( O' ]: a4 Q% O% K) ?& w! e
) b$ f. B1 U e; [% o
注意:如果需要重启 docker服务,首先腾出一点磁盘空间,不然重启 docker 会失败。不能直接使用 rm 删除日志文件,这样磁盘空间是不会释放的。不小心这样操作,那只能通过 systemctl restart docker 重启 Docker 服务释放磁盘空间,如果磁盘还是没有释放,可以通过 lsof | grep -i delete 查找已删除的文件进程,找到后直接 kill掉。3 S! k# v" S7 o
) c6 \0 B% n5 _4 |# Q4 x5 C6 z5 F
# 通过 echo 命令 清空日志文件$ echo > /var/lib/docker/containers/d0e330944a074268a1f0998fd66ee73f584642352a2fe77304c1fa49b819893a/d0e330944a074268a1f0998fd66ee73f584642352a2fe77304c1fa49b819893a-json.log
3 K1 D7 W6 j+ a: B" I清理节点不用的 images,释放磁盘空间 k) }; e- }7 x
+ `1 s2 Q9 B" ^, m3 S) A1 H" B! ^
# 查看 docker 镜像$ docker images# 删除不用的镜像$ docker rmi ${images_id}
2 D. Q# o4 ^4 Q; c. r+ f上面步骤操作完后(上面清理日志方法,可能对于收集日志程序会丢失一些日志,但一般情况能接受),可以选择驱赶节点上所有pod(kubectl drain ${node-name} )再优化Docker配置。也可以不驱赶节点上pod,在现基础上优化容器日志方法,优化配置后重启 Docker,这会导致节点上pod中断一会,如果前端反向代理具备重试机制一般不会影响业务正常访问。
7 S0 _0 h( }: {2 R- N# @& B5 ^* @' n7 E
优化完 Docker配置后,把节点加入到k8s集群中,正常服务。
% m( ?8 _5 w6 q' ]6 ^% M& a$ a. k. T4 a
# 取消不可调度的标记$ kubectl uncordon ${node-name}
5 b2 t7 C* W$ a, P0 D' X5 l定位问题根本原因及解决思路
3 P' s0 O1 s+ G日志输出量大,导致磁盘写满
5 F9 ]! @+ b+ @( p4 B5 K$ y% O% y3 M: A3 U) W t3 H
减少日志输出,调整应用日志输出级别; d! H# {/ N5 P, I% u+ Q
增大磁盘空间0 ?1 s/ [6 t" Y3 [' `; L* F# ]" v
日志输出到统一日志收集中心" g6 Z; X+ q1 Z
容器镜像占满磁盘
. W1 e# y/ I. N( g
" r6 j; j9 o8 T2 _+ U$ r3 c# c配置k8s垃圾回收策略
0 ?5 W* Q' O9 f( C/ W6 ~9 s节点运行 images 定时清理脚本% ^% \+ z: B! I# @* [
可写层量大导致磁盘写满: 优化程序逻辑,不写文件到容器内或控制写入文件的大小与数量
- d2 A- ]7 E4 Y# E- X2 r/ ^& O ?2 M5 }! N/ g8 \0 v2 A; V5 n
具体优化方法
6 Y% s$ D9 Q& O( L配置 Docker日志轮转,数据目录不要存放在系统盘, B0 {, Y- w2 w/ a6 |- ]7 [
$ c9 z1 n: e3 M1 p) C
$ vim /etc/docker/daemon.json{"registry-mirrors": ["https://4xr1qpsp.mirror.aliyuncs.com"], "graph": "/data/docker", "log-opts": {"max-size":"500m", "max-file":"3"}}
- ?5 w5 C' X0 D9 p配置解释:
% ^! e' q; E4 S* L" h' L& j5 A+ v! }1 Z9 ]
配置完,重启 docker才能生效,日志轮转只对以后新创建的容器有效。3 N$ A1 y9 v' x z0 b
* G% p: {. I& ?* F; L
registry-mirrors 镜像加速配置; Y. I1 C+ o/ l, [; V3 g3 I
graph 定义数据存储目录
8 [$ b6 ~! F& F( n5 a9 wmax-size=500m 意味着一个容器日志大小上限是500M- m$ s4 F) V* }+ ]1 L( T- T& \4 l
max-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json: S4 Q9 ]! ~9 Y8 W0 e
清理 docker images* G" y* _' [& T) ^6 u
1 q7 \- [4 ]+ t
定时清理脚本3 i& l. b5 w8 K
5 Z, \( {, b$ t' r9 n4 k$ 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% G' K( I4 t" O
kubernetes 垃圾回收配置,这里不在细讲,具体参考官方配置文档 https://kubernetes.io/docs/conce ... garbage-collection/& K) s# r( t# o0 Z. i
|