1. 容器环境中没有 shell 环境
有时候我们想要查看下容器内部的一些东西,但是无奈容器没有shell 执行环境,比如想看看 coredns 容器中 /etc/resolv.conf 的内容是否正确继承了节点的配置,比较简单的操作步骤如下(以 docker 运行时为例):
登录到容器所在节点上,执行docker ps
查找到 coredns 容器 ID,然后再使用cp
命令把文件复制出来就可以看了:
docker ps | grep <容器名>
docker cp <容器ID>:/want/to/see/dir .
2. 常用排查命令
1.查看 kubelet 守护服务日志(运行时日志类似)
代码语言:txt复制# 查找相关 daemon 服务
systemctl list-units | grep <DAEMON_SERVICE_NAME>
# 显示 kubelet 滚动日志
journalctl -u kubelet -f
# 导出 kubelet 日志到文件
journalctl -u kubelet > k.log
# 查看 kubelet 2 小时之前到现在的日志
journalctl -u kubelet --since "2 hours ago" | less
2.获取当前资源配置的 YAML
代码语言:txt复制kubectl get <RESOURCE> <POD_NAME> -n <NAMESPACE> -o yaml
命令示例:
kubectl get pod nginx-xxx -n default -o yaml
kubectl get deploy nginx -n default -o yaml
3.查看资源当前状态描述
代码语言:txt复制kubectl describe <RESOURCE> <POD_NAME> -n <NAMESPACE>
命令示例:
kubectl describe pod nginx-xxx -n default
kubectl describe pvc nginx -n default
4.查看容器日志
代码语言:txt复制# 动态刷新查看 Pod 中指定容器的后 20 行日志
kubectl logs <POD_NAME> -c <CONTAINER_NAME> --tail 20 -f -n <NAMESPACE>
命令示例:
kubectl logs nginx-xxx -c nginx --tail 20 -f -n default
5.打印出资源指定的字段值(YAML结构)
代码语言:txt复制kubectl get <RESOURCE> -o custom-columns=<ALIAS_NAME_1>:<RESOURCE_KEY_1>,<ALIAS_NAME_2>:<RESOURCE_KEY_2>
命令示例:
# 分别打印资源中的 .metadata.name(别名 Name),.status.eniInfos(别名 eni) 字段值。
kubectl get nec -ocustom-columns=Name:.metadata.name,eni:.status.eniInfos
# 如果字段中有"."符号, 需要整体使用""扩起来再转译, 比如"tke.cloud.tencent.com/eni-ip" 写成 "tke.cloud.tencent.com/eni-ip"
kubectl get no -o=custom-columns=NAME:.metadata.name,Allocatable_eni-ip:.status.allocatable."tke.cloud.tencent.com/eni-ip"
6.使用 kubectl 执行容器命令
代码语言:txt复制kubectl exec -it <POD_NAME> -c <CONTAINER_NAME> -n <NAMESPACE> -- <COMMAND>
命令示例:
kubectl exec -it nginx-xxx -c nginx -n default -- sh
kubectl exec -it nginx-xxx -c nginx -n default -- sleep 100000
7.使用 kubectl 创建测试 Pod
代码语言:txt复制kubectl run busybox --image=busybox --overrides='{ "spec": { "nodeName": "<NODE_NAME>" } }' --command -- sleep 100000
命令示例:
# 测试 Pod 运行在指定的节点"10.0.5.3"上
kubectl run busybox --image=busybox --overrides='{ "spec": { "nodeName": "10.0.5.3" } }' --command -- sleep 100000
8.更多 kubectl 命令用法
代码语言:txt复制# 使用 shell 命令循环执行取消 pod 某个注解配置
for i in `kubectl get pod -n <NS> | grep <Keyword> | awk -F " " '{print $1}'`;do kubectl annotate pod $i <Annotation>- -n <NS>;done
kubectl 命令各种使用方法:
kubectl --help
9. 其他常用命令
代码语言:shell复制# 查看网卡缓冲区是否有溢出丢包
netstat -s
或
cat /proc/net/netstat | awk /TcpExt/ | awk '{print $21,$22}' # $21,$22 可根据实际情况修改
3. 常用抓包命令
代码语言:javascript复制tcpdump -i <INTERFACE_NAME> host <HOST> and port <PORT> -nve
命令示例:
# 查看在 eth0 接口 ip 为8.8.8.8,端口号为 53 的非域名显示详细包
tcpdump -i eth0 host 8.8.8.8 and port 53 -nvve
# 查看在 eth0 接口 src ip 为8.8.8.8, dst ip 为 1.1.1.1 的非域名显示详细包
tcpdump -i eth0 src 8.8.8.8 and dst 1.1.1.1 -nvve
# 可以使用 Wireshark 分析完整报文文件 dns.pcap
tcpdump -i eth0 host 8.8.8.8 and port 53 -s 0 -w dns.pcap
# 使用 root 权限循环抓每个包文件大小为10M, 文件数量为 100 的数据包, 并后台运行
tcpdump -nni eth0 host 8.8.8.8 and port 53 -w test.cap -C10M -Zroot -W100 &