除了kubectl logs、events,kubectl describe 也是K8s排查问题必备命令,有点类似docker inspect,它返回结果比 kubectl get 详细,比YAML直观,用过都说好。本文内容较长,但都是干货,坚持看完一定会有收获!
1. 基础用法
1.1 查看Pod详情
# 查看Pod完整信息(opsnot最常用)
kubectl describe pod opsnot-postgresql
# 指定命名空间
kubectl describe pod my-pod -n opsnot-postgresql
# 查看所有Pod(opsnot.com提醒:要慎用!输出太多!)
kubectl describe pods
1.2 查看不同资源
# 查看Deployment(opsnot.com常用)
kubectl describe deployment opsnot-mariadb
# 查看Service
kubectl describe service opsnot-service
# 查看Node
kubectl describe node node-mariadb
# 查看ConfigMap
kubectl describe configmap mariadb-config
# 查看Secret(敏感信息会隐藏)
kubectl describe secret mariadb-secret
2. Pod排查技巧
2.1 查看Pod事件(重点关注)
# 直接看Pod信息,重点看最底部的Events
kubectl describe pod ops-elasticsearch -n prod
# opsnot.com经验:Events是排查问题的关键!
# 看到ImagePullBackOff、CrashLoopBackOff都能找到原因
实操案例:某Pod一直Pending,用describe一看Events:
Warning FailedScheduling node didn't have enough memory
很明显内存不足,调整下requests轻松解决。
2.2 查看容器状态
# Pod describe里会显示:
- 容器状态(Running/Waiting/Terminated)
- 重启次数
- 退出码
- 最后一次重启原因
kubectl describe pod my-elasticsearch | grep -A 10 "State:"
kubectl describe pod my-elasticsearch | grep "Restart Count"
实操案例:容器反复重启,describe显示:
Last State: Terminated
Reason: Error
Exit Code: 137
容器退出码137,那就是OOM killed了,内存调大些就ok了。
2.3 查看资源使用情况
# describe会显示requests和limits
kubectl describe pod opsnot-redis | grep -A 5 "Limits:"
kubectl describe pod opsnot-redis | grep -A 5 "Requests:"
# 查看实际分配的资源
kubectl describe pod ops-not-kafka | grep "QoS Class"
实操案例:集群资源紧张,这个命令可以找到那些设置了过高的requests但实际用不到的Pod,优化资源,节能提效
3. Node排查
3.1 查看Node健康状态
# 查看Node详情
kubectl describe node worker-node-1
# 重点看Conditions部分
kubectl describe node worker-node-1 | grep -A 10 "Conditions:"
# 常见状态:
# Ready: True/False
# MemoryPressure: True/False
# DiskPressure: True/False
# PIDPressure: True/False
实操案例:Pod调度不上node节点,describe node发现:
DiskPressure: True
Message: kubelet has disk pressure
很明显是磁盘占满了,清理即可,一般都是日志爆了。
3.2 查看Node资源分配
# 查看Node上的资源使用情况(加班哥推荐)
kubectl describe node worker-node-1 | grep -A 20 "Allocated resources:"
# 会显示:
# CPU Requests: 1200m (60% of 2 cores)
# Memory Requests: 4Gi (50% of 8Gi)
3.3 查看Node上的Pod
# describe node会列出该节点上的所有Pod及其资源占用情况(加班哥墙裂推荐:非常好用!!!)
kubectl describe node worker-node-1 | grep -A 50 "Non-terminated Pods:"
# 返回一般是这样的:
Non-terminated Pods: (10 in total)
Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits Age
--------- ---- ------------ ---------- --------------- ------------- ---
default nginx-opsnot-abc12 100m (2%) 200m (5%) 128Mi (1%) 256Mi (3%) 5d
default redis-xyz34 50m (1%) 100m (2%) 64Mi (0%) 128Mi (1%) 3d
kube-system kube-proxy-5678 100m (2%) 0 (0%) 64Mi (0%) 0 (0%) 15d
kube-system coredns-1234 100m (2%) 200m (5%) 70Mi (0%) 170Mi (2%) 15d
4. Service排查
4.1 查看Service配置
# 查看Service详情
kubectl describe service ops-not-service
# 重点看:
# - Selector: 匹配哪些Pod
# - Endpoints: 实际关联的Pod IP
# - Port配置
kubectl describe svc my-service | grep Selector
kubectl describe svc my-service | grep Endpoints
实操案例:Service访问不通,describe发现Endpoints是空的:
Endpoints: <none>
一般是Selector写错了,Pod的Label不匹配,改下Label就行了
4.2 检查Service类型和端口
# 查看Service暴露方式
kubectl describe svc ops-not-service | grep Type
# Type: ClusterIP / NodePort / LoadBalancer
# 查看端口映射
kubectl describe svc ops-not-service | grep Port
5. Deployment/StatefulSet排查
5.1 查看副本状态
# 查看Deployment
kubectl describe deployment opsnot-rabbitmq
# 重点关注:
# - Replicas: 期望数量 vs 实际运行数量
# - Conditions: 部署状态
# - Events: 滚动更新记录
kubectl describe deploy opsnot-rabbitmq | grep Replicas
kubectl describe deploy opsnot-rabbitmq | grep -A 5 "Conditions:"
实操案例:发版后只有一部分Pod更新成功,describe显示:
Replicas: 3 desired | 2 updated | 3 total | 2 available
Conditions:
Progressing: False
Reason: ProgressDeadlineExceeded
这种情况基本是新版本镜像有问题导致Pod起不来,直接回滚
5.2 查看滚动更新策略
# 查看更新策略
kubectl describe deploy opsnot-rabbitmq | grep -A 3 "StrategyType:"
# 输出示例:
# StrategyType: RollingUpdate
# RollingUpdateStrategy:
# Max Surge: 25%
# Max Unavailable: 25%
6. PVC/PV存储排查
6.1 查看PVC状态
# 查看PVC
kubectl describe pvc opsnot-pvc
# 重点看:
# - Status: Bound/Pending
# - Volume: 绑定的PV名称
# - Capacity: 实际容量
# - Events: 绑定失败原因
实操场景:PVC一直Pending,describe显示:
Events:
Warning ProvisioningFailed no volume plugin matched
基本是StorageClass配置错误,改一下就行了
6.2 查看PV详情
# 查看PV
kubectl describe pv opsnot-pv-name
# 重点看:
# - Status: Available/Bound/Released
# - Claim: 被哪个PVC使用
# - Reclaim Policy: Delete/Retain
# - Access Modes: ReadWriteOnce/ReadWriteMany
7. ConfigMap/Secret排查
7.1 查看ConfigMap
# 查看ConfigMap详情
kubectl describe configmap my-config
# 会显示所有键值对(opsnot.com提醒:数据量大的话会截断)
kubectl describe cm my-config | grep -A 20 "Data"
#为什么会截断?
kubectl describe 命令有输出长度限制,主要是为了:
防止终端被大量输出淹没
提高命令响应速度
避免网络传输过大数据
#查看cm被截断了怎么办?
看yaml呗,这玩意是完整的
7.2 查看Secret
# 查看Secret(数据会被隐藏)
kubectl describe secret my-secret
# 输出示例:
# Data
# ====
# password: 16 bytes
# username: 8 bytes
# 提示:真实数据不会显示,只显示大小
8. Ingress排查
8.1 查看Ingress规则
# 查看Ingress
kubectl describe ingress my-ingress
# 重点看:
# - Rules: 路由规则
# - Backend: 后端Service
# - Events: 配置更新记录
kubectl describe ing my-ingress | grep -A 20 "Rules:"
8.2 查看Ingress地址
# 查看Ingress分配的IP
kubectl describe ingress opsnot-ingress | grep Address
# 查看TLS配置
kubectl describe ing opsnot-ingress | grep -A 5 "TLS:"
9. 实战技巧
9.1 快速定位问题Pod
# 故障排查脚本
#!/bin/bash
NS=${1:-default}
echo "=== 查找 $NS 命名空间中的异常 Pod ==="
# 检查命名空间是否存在
if ! kubectl get ns $NS &> /dev/null; then
echo "错误: 命名空间 $NS 不存在!"
exit 1
fi
# 获取异常 Pod 列表
PODS=$(kubectl get pods -n $NS --field-selector=status.phase!=Running -o name 2>/dev/null)
if [ -z "$PODS" ]; then
echo "加班哥没有发现异常 Pod"
exit 0
fi
for pod in $PODS; do
echo "--- $pod ---"
kubectl describe $pod -n $NS | grep -A 15 "Events:"
echo "================================"
done
9.2 批量检查资源
# 检查所有Node状态
for node in $(kubectl get nodes -o name); do
echo "=== $node ==="
kubectl describe $node | grep -A 5 "Conditions:"
done
# 检查命名空间内所有Service的Endpoints
kubectl get svc -n prod -o name | while read svc; do
echo "$svc:"
kubectl describe $svc -n prod | grep Endpoints
done
9.3 查看最近的事件
# Pod最近的事件(按时间排序)
kubectl describe pod ops-not-pod | grep -A 50 "Events:" | tail -20
# 所有资源的事件
kubectl get events --sort-by=.metadata.creationTimestamp
# opsnot经验:结合describe和events一起看
kubectl describe pod ops-not-pod && kubectl get events --field-selector involvedObject.name=my-pod
9.4 导出完整信息用于排查
# 导出Pod完整信息
kubectl describe pod ops-not-pod > pod-describe.txt
# 导出所有资源信息
kubectl describe all -n production > cluster-info.txt
10. 常见问题排查清单
10.1 Pod起不来
# 1. 先看Pod状态
kubectl get pod ops-not-mysql
# 2. describe看Events
kubectl describe pod ops-not-mysql
# 常见原因:
- ImagePullBackOff: 镜像拉取失败
- CrashLoopBackOff: 容器启动后立即退出
- Pending: 资源不足或调度失败
- Error: 配置错误
10.2 Service不通
# 1. 检查Service的Endpoints
kubectl describe svc opsnot-nginx-service | grep Endpoints
# 2. 如果Endpoints为空,检查Selector
kubectl describe svc opsnot-nginx-service | grep Selector
kubectl get pods --show-labels
# 3. 检查Pod是否Ready
kubectl get pods -l app=opsnot-blog
10.3 网络问题
# 1. 检查Pod IP
kubectl describe pod my-pod | grep "IP:"
# 2. 检查Service ClusterIP
kubectl describe svc my-service | grep "IP:"
# 3. 检查DNS
kubectl describe pod my-pod | grep -A 5 "DNS"
# 加班哥排查流程:
# Pod -> Service -> Ingress 逐层排查
10.4 资源不足
# 1. 检查Node资源
kubectl describe nodes | grep -A 10 "Allocated resources:"
# 2. 检查Pod资源配置
kubectl describe pod opsnot-pod | grep -A 5 "Limits:"
# 3. 看Events里有没有资源不足的告警
kubectl describe pod opsnot-pod | grep "Insufficient"
11. 进阶用法
11.1 结合其他命令使用
# describe + logs 组合排查
kubectl describe pod my-pod && kubectl logs my-pod --tail=50
# describe + exec 组合
kubectl describe pod my-pod
kubectl exec -it my-pod -- sh
# describe + top 查看资源使用
kubectl describe pod my-pod
kubectl top pod my-pod
11.2 使用watch实时监控
# 实时监控Pod变化(加班哥常用)
watch -n 2 'kubectl describe pod opsnot-pod | grep -A 10 "Events:"'
# 实时监控Node状态
watch kubectl describe node worker-1 | grep "Allocated resources:" -A 20
11.3 格式化输出关键信息
# 自用脚本:快速查看Pod关键信息
#!/bin/bash
POD=$1
NS=${2:-default}
echo "=== 基本信息 ==="
kubectl describe pod $POD -n $NS | grep "Status:\|IP:\|Node:"
echo -e "\n=== 容器状态 ==="
kubectl describe pod $POD -n $NS | grep "State:" -A 3
echo -e "\n=== 重启信息 ==="
kubectl describe pod $POD -n $NS | grep "Restart Count"
echo -e "\n=== 最近事件 ==="
kubectl describe pod $POD -n $NS | grep "Events:" -A 15 | tail -10
12. 性能优化提示
# describe输出很多,用管道过滤关键信息
kubectl describe pod ops-not-pod | grep -E "Status:|Events:|State:|Restart"
# 只看特定命名空间,避免全局搜索
kubectl describe pods -n opsnot-namespace
# 结合-o wide查看更多信息
kubectl get pods -o wide
kubectl describe pod ops-not-pod
# opsnot.com建议:先用get快速定位,再用describe详细排查
13. 最后
kubectl describe 输出内容极其丰富,实为排查问题一利器,以上内容基本涵盖describe所有场景。 感谢大家耐心看完,如果觉得有帮助,请帮忙点赞转发,加班哥继续加班输出干货!
免责申明:本站不以盈利为目的,下载资源均来源于网络,只做学习和交流使用,版权归原作者所有。若作商业用途,请购买正版。由于未及时购买
和付费发生的侵权行为,与本站无关。如果侵犯了您的合法权益,请联系522390482@qq.com删除,提供版权证明文件和侵权内容的具体链接。
如若转载,请注明出处:https://byteooo.cn/archives/1991
共有 0 条评论