前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【TKE】容器问题排错常用命令

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

原创
作者头像
Jokey
修改2022-07-19 11:26:53
8060
修改2022-07-19 11:26:53
举报
文章被收录于专栏:云原生搬运工云原生搬运工

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 &

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 容器环境中没有 shell 环境
  • 2. 常用排查命令
  • 3. 常用抓包命令
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档