🛠️K8s外联应急排查思路全解析
🤔K8S删除pod之后又自动新建一个pod?
查看所有pod
kubectl get pods -A -owide
删除pod
kubectl delete pod <podname> -n <namespace>
执行上述操作后,再查看所有pod,会发现又新建了一个pod。这是因为deployment.yaml
文件中定义了副本数量,所以还需要删除副本。
查看所有deployment
kubectl get deployment -A
删除副本
kubectl delete deployment <name> -n <namespace>
删除副本后,此时对应的pod也会被删除。
原因分析
在yaml中设置了副本数量,当pod被删除时,K8S就会根据配置创建新的pod来保证副本数量达到设定值。
💪K8S强制删除pod的方法
kubectl get rc
有rc的情况
如果存在rc,需要先删除rc,再删除pod。
无rc的情况
如果没有rc,直接执行以下命令:
kubectl delete pod <name> --grace-period=0 --force -n <namespace>
🕵️♂️K8S排查外联思路整理
🌟思路一:开启coreDNS解析日志
找到coredns所在的容器
kubectl get pods -A -o wide | grep dns
默认情况下,coredns未开启日志,执行logs
命令不会有解析记录。注意:执行命令要带上-n kube-system
(命名空间)。
修改coredns配置文件加入log
kubectl edit configmap coredns -n kube-system
coredns默认配置:
加入log
,不添加配置会有默认规则。修改配置后,coredns会自动重启。
注意开启日志可能的影响
-
重启coredns可能短暂影响集群域名解析。 -
域名解析量大,开启日志可能会影响到服务性能。
测试域名解析来自哪个pod?
开启日志后,使用另一个容器发起dns请求,可以看到对应的容器ip。
🌟思路二:tcpdump抓包
在coredns的宿主机上抓53端口的流量,但需要结合恶意请求的告警定位到准确时间的报文信息。
在K8S场景下,容器内部很多命令都是没有的,这个时候就需要用到nsenter
进入容器内部的网络空间进行抓包。
nsenter 安装
nsenter
位于util-linux
包中,一般常用的Linux发行版都已经默认安装。如果系统没有安装,可以使用以下命令进行安装:
yum install util-linux -y
nsenter 进入容器网络空间
nsenter -t <PID> -n bash
抓包命令
tcpdump -i any port 53 -C 20 -W 200 -w /tmp/client_dns.pcap
在正常情况下,抓包对业务无影响,仅会增加小部分的CPU负载和磁盘写入。该命令会对抓取到的包进行rotate,最多可以写200个20 MB的.pcap
文件。
如果不想要完整的数据包,可以用下面的命令,此时也能捕获到coredns内部的域名请求ip。
tcpdump -i any port 53 -vvv | tee -a /tmp/dns.log
原文始发于微信公众号(事件响应回忆录):K8s外联应急排查思路全解析
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论