【TKE】容器问题排错常用命令

2022-07-19 11:26:53 浏览数 (1)

1. 容器环境中没有 shell 环境

有时候我们想要查看下容器内部的一些东西,但是无奈容器没有shell 执行环境,比如想看看 coredns 容器中 /etc/resolv.conf 的内容是否正确继承了节点的配置,比较简单的操作步骤如下(以 docker 运行时为例):

登录到容器所在节点上,执行docker ps查找到 coredns 容器 ID,然后再使用cp命令把文件复制出来就可以看了:

代码语言:txt复制
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 &

0 人点赞