马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
kubernets 的容器中日志大kubectl 如何清理容器日志
2 ?( K$ m$ I5 H* h' C! j
" A3 _3 \/ ^( p$ S' A, @4 R) l: P
1 H1 I) i3 X* \; d# K创建一个定时任务(CronJob)来定期清理Pod的日志文件。可以使用kubectl create cronjob命令来创建一个定时任务。 在CronJob中使用kubectl delete pod <pod-name>命令来删除指定Pod的日志文件。可以通过标签选择器来选择需要清理的Pod。 可以在CronJob中使用kubectl logs <pod-name> --tail=0命令来清空Pod的日志文件,然后再删除Pod。 设置合适的定时任务调度规则,比如每天凌晨执行清理操作。 , i/ l& g8 {& n
请注意,在清理Pod的日志文件之前,请确保备份重要的日志数据以防丢失。另外,建议在清理操作之前先测试一下命令是否能够正确执行。
1 `& u; u6 ]9 }. C
0 K# a- _3 r' a ?' ?0 y9 V( U
/ P) V0 v1 `1 x6 R, k4 P
0 g/ d* r) S, d8 F0 S. k
$ J7 A6 {1 j7 a* A! S磁盘写满引发的后果
& t" M; v( x$ ]) D4 z7 l2 {, x容器数据磁盘写满造成的后果:* A! n6 z6 @: z' T
+ @, w/ W* M! M d& M' b) y) g2 Y; K
Pod 不能删除 (一直 Terminating)
% H) r1 O% R% s& b! W4 z$ t, cPod 不能被创建 (一直 ContainerCreating)! j C; Q2 o7 W$ o
磁盘写满分两种情况:
. e% ]6 H2 O' ?% x& S, `1 P6 D# F; Z* n
磁盘空间全部使用完# g+ Y6 ]$ z8 h9 D- M* `
- t" H1 o5 O( I0 W
# 系统盘被占满$ df -Th文件系统 类型 容量 已用 可用 已用% 挂载点/dev/vda1 ext4 50G 50G 0G 100% //dev/vdb1 ext4 100G 10G 90G 10% /data1 e- ]- Q) x1 E; y$ S
磁盘 Inode 全部使用完! G7 |/ @) ?5 X
; G, w g5 N% {! \' o
# 数据盘 Inode 被占满$ df -i文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点/dev/vda1 3276800 3276800 0 100% /
% x2 Y2 z# v; T) G' g6 u0 d( T! r判断磁盘写满方法
: o4 [, X0 [ ^, E: s下面命令能快速的排查磁盘占满原因:
7 r0 c/ _" i/ {4 _" c) a; t; m: }1 z9 j& `$ w5 F. u1 G
docker info | grep 'Docker Root Dir' # 检查 Docker 存储目录& f3 A" f% t' f
docker system df # 查看容器磁盘使用情况9 o c' ?) @# V! A U
df -hT # 检查宿主机 磁盘空间 使用情况) @9 Q6 D# h4 D9 f, m6 l" h9 a$ h
df -i # 检查宿主机 Inode 使用情况
) h, s: ]) U) x& u$ E' w. C解决方法
3 k; N+ t3 \0 a* V; D" A, jPS:保证业务能正常使用为第一原则解决问题
0 d. X( r* `: W2 R P5 G! m
) z' f( G; O4 N标记 Node 为不可调度
; C5 h8 Z& u3 S) r
' T1 _# F" x0 o9 b5 ?8 t% Z$ kubectl drain ${node-name}
7 b+ e& M' E+ c9 N! b; }查找那个容器输出日志占用最大; a7 w$ t$ O; N3 Z: T
; a# m$ S' _8 S3 O1 t
$ 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
8 Q/ @! k K0 M4 i1 g清空容器日志文件( _- U z8 J2 F" ~( g7 q
( |- H3 |$ W0 i! \8 M/ [
注意:如果需要重启 docker服务,首先腾出一点磁盘空间,不然重启 docker 会失败。不能直接使用 rm 删除日志文件,这样磁盘空间是不会释放的。不小心这样操作,那只能通过 systemctl restart docker 重启 Docker 服务释放磁盘空间,如果磁盘还是没有释放,可以通过 lsof | grep -i delete 查找已删除的文件进程,找到后直接 kill掉。" u2 K* ] x' i+ \) j* |
1 y* _8 Y8 \# V" T' m. d- y! J
# 通过 echo 命令 清空日志文件$ echo > /var/lib/docker/containers/d0e330944a074268a1f0998fd66ee73f584642352a2fe77304c1fa49b819893a/d0e330944a074268a1f0998fd66ee73f584642352a2fe77304c1fa49b819893a-json.log6 r4 c7 x8 t5 ^0 @5 I
清理节点不用的 images,释放磁盘空间8 L" [( K# g7 x$ e! F, S
M% p, ?$ t# p7 @2 s/ Z
# 查看 docker 镜像$ docker images# 删除不用的镜像$ docker rmi ${images_id}
+ r! o- q: n4 m上面步骤操作完后(上面清理日志方法,可能对于收集日志程序会丢失一些日志,但一般情况能接受),可以选择驱赶节点上所有pod(kubectl drain ${node-name} )再优化Docker配置。也可以不驱赶节点上pod,在现基础上优化容器日志方法,优化配置后重启 Docker,这会导致节点上pod中断一会,如果前端反向代理具备重试机制一般不会影响业务正常访问。! o( g1 U& P: |8 Y) r
- i; ~" Z+ c* ~" a% @: B' H优化完 Docker配置后,把节点加入到k8s集群中,正常服务。
9 `7 h. ]( K* b G
7 d$ S: V& c0 r W' e: U# 取消不可调度的标记$ kubectl uncordon ${node-name}. d" E9 c1 ]! ~3 ~4 n2 D
定位问题根本原因及解决思路
9 g$ _% Z( V# i4 B" {% P日志输出量大,导致磁盘写满# L# Z+ m2 P' a! y
: m6 L+ z! |+ e& x
减少日志输出,调整应用日志输出级别 z4 `& _, _- t, F
增大磁盘空间' i9 w: S, F/ d3 J7 B; a2 N
日志输出到统一日志收集中心
( W% t% h5 |& B3 v- D `4 k容器镜像占满磁盘
4 T/ W Q+ Q( r& \, C: u' A( w" d/ m8 l, z. M
配置k8s垃圾回收策略
" q2 [+ [) G' `' [& ^9 ^节点运行 images 定时清理脚本; f) y$ ^$ x. z/ t
可写层量大导致磁盘写满: 优化程序逻辑,不写文件到容器内或控制写入文件的大小与数量; p0 r: G( g/ S) D% ^* {" C, t
z- l2 X. d; P, ?# d1 Z) w4 ~具体优化方法9 O9 k8 Y' d0 e$ n4 X% i9 z; [+ F
配置 Docker日志轮转,数据目录不要存放在系统盘
. C. M V: X: L# X% @' d. v2 P% S% f& B& m
$ vim /etc/docker/daemon.json{"registry-mirrors": ["https://4xr1qpsp.mirror.aliyuncs.com"], "graph": "/data/docker", "log-opts": {"max-size":"500m", "max-file":"3"}}
: ?7 P" {+ m6 X i配置解释:$ r$ V% ]6 M1 c
5 K, T1 [8 H6 n' V配置完,重启 docker才能生效,日志轮转只对以后新创建的容器有效。
! y/ B+ r* p/ i4 L3 C8 k4 j
8 r, K1 Y2 g- \2 o3 ]! t- qregistry-mirrors 镜像加速配置: ~( Z( H( |7 N$ L' |5 I' N( M% x
graph 定义数据存储目录
# ~# d6 H, L6 [max-size=500m 意味着一个容器日志大小上限是500M
! m, Q# D# }& omax-file=3,意味着一个容器有三个日志,分别是id+.json、id+1.json、id+2.json
! g+ m4 h/ o8 T2 K% r/ c) g清理 docker images8 a% M8 Q9 T2 ^: [
* L/ }4 q# P4 C9 K, L定时清理脚本
1 Z2 v$ P( j" ^: Z$ n: R
7 _) M: N6 Z- C' h) d/ ~# \! g$ 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, O9 T9 j# S1 ^) A7 Y% t& i& @
kubernetes 垃圾回收配置,这里不在细讲,具体参考官方配置文档 https://kubernetes.io/docs/conce ... garbage-collection/' e( K9 N+ |: E" V& X9 V( H9 |
|