1. 首页 > Kubernetes教程 > 正文

Kubernetes教程FG082-Kubernetes故障排查与调试实战解析

目录大纲

Part01-基础概念与理论知识

1.1 故障排查基础

Kubernetes故障排查涉及多个方面,包括:

  • Pod故障:Pod无法启动、运行中崩溃等
  • 节点故障:节点不可用、资源不足等
  • 网络故障:网络不通、服务访问失败等
  • 存储故障:存储卷挂载失败、数据丢失等
  • 控制平面故障:API服务器、etcd等组件故障
  • 调度故障:Pod调度失败、调度延迟等

1.2 故障排查工具

  • kubectl:Kubernetes命令行工具
  • logs:查看Pod日志
  • describe:查看资源详细信息
  • exec:进入Pod执行命令
  • port-forward:端口转发
  • proxy:API服务器代理
  • events:查看集群事件
  • top:查看资源使用情况

1.3 故障排查流程

,风哥提示:。

  • 识别问题:确定故障的现象和范围
  • 收集信息:使用kubectl等工具收集相关信息
  • 分析问题:根据收集的信息分析故障原因
  • 验证假设:通过测试验证故障原因
  • 解决问题:实施解决方案
  • 验证解决方案:确认故障已解决
  • 记录总结:记录故障原因和解决方案

Part02-生产环境规划与建议

2.1 故障预防

在生产环境中,预防故障比排查故障更重要,风哥提示:。

  • 监控系统:部署Prometheus和Grafana监控集群
  • 告警系统:配置合理的告警规则
  • 备份策略:定期备份etcd和应用数据
  • 高可用设计:部署多副本应用和控制平面
  • 资源管理:合理设置资源请求和限制
  • 网络策略:配置安全的网络策略
  • 版本管理:定期升级集群和应用

2.2 故障排查准备

为了快速排查故障,需要做好以下准备。。

  • 文档化:记录集群配置和应用部署信息
  • 工具准备:安装必要的故障排查工具
  • 知识储备:了解Kubernetes架构和常见故障
  • 应急方案:制定故障应急处理流程
  • 演练:定期进行故障演练

2.3 常见故障类型

  • 配置错误:YAML配置文件错误
  • 资源不足:CPU、内存、存储等资源不足
  • 网络问题:网络不通、DNS解析失败等
  • 存储问题:存储卷挂载失败、权限问题等
  • 镜像问题:镜像拉取失败、镜像损坏等
  • 依赖问题:应用依赖服务不可用
  • 安全问题:权限不足、安全策略限制等
,学习交流加群风哥微信: itpux-com。

Part03-生产环境项目实施方案

3.1 Pod故障排查

3.1.1 查看Pod状态

# 查看Pod状态
kubectl get pods
# 查看Pod详细信息
kubectl describe pod <pod-name>
# 查看Pod日志
kubectl logs <pod-name>
# 查看Pod容器日志
kubectl logs <pod-name> -c <container-name>
# 进入Pod执行命令
kubectl exec -it <pod-name> -- /bin/bash

3.2 节点故障排查

3.2.1 查看节点状态

# 查看节点状态
kubectl get nodes
# 查看节点详细信息
kubectl describe node <node-name>
# 查看节点资源使用情况
kubectl top node <node-name>
# 查看节点上的Pod
kubectl get pods -o wide --field-selector spec.nodeName=<node-name>

3.3 网络故障排查

3.3.1 网络连通性测试

# 测试Pod间网络连通性
kubectl exec -it <pod-name> -- ping <other-pod-ip>
# 测试Pod到服务的连通性
kubectl exec -it <pod-name> -- curl <service-name>.<namespace>.svc.cluster.local
# 测试节点间网络连通性
ssh <node-name> ping <other-node-ip>
# 查看网络策略
kubectl get networkpolicies

3.4 存储故障排查

3.4.1 存储卷检查

,学习交流加群风哥QQ113257174。

# 查看PersistentVolume
kubectl get pv
# 查看PersistentVolumeClaim
kubectl get pvc
# 查看存储类
kubectl get storageclasses
# 查看Pod存储卷挂载情况
kubectl describe pod <pod-name> | grep -A 10 Volumes

Part04-生产案例与实战讲解

4.1 实战案例:Pod无法启动

4.1.1 排查步骤

# 查看Pod状态
kubectl get pods
# 查看Pod详细信息
kubectl describe pod fgedu-app-6548b8c8d9-7k2z7
# 查看Pod日志
kubectl logs fgedu-app-6548b8c8d9-7k2z7
# 查看事件
kubectl get events | grep fgedu-app

执行 →

NAME                        READY   STATUS             RESTARTS   AGE
fgedu-app-6548b8c8d9-7k2z7   0/1     ImagePullBackOff   0          5m
Events:
  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  5m                 default-scheduler  Successfully assigned default/fgedu-app-6548b8c8d9-7k2z7 to node1
  Normal   Pulling    5m                 kubelet            Pulling image "nginx:latest1"
  Warning  Failed     5m                 kubelet            Failed to pull image "nginx:latest1": rpc error: code = NotFound desc = failed to pull and unpack image "docker.io/library/nginx:latest1": failed to resolve reference "docker.io/library/nginx:latest1": pull access denied, repository does not exist or may require authorization
  Warning  Failed     5m                 kubelet            Error: ErrImagePull
  Normal   BackOff    5m                 kubelet            Back-off pulling image "nginx:latest1"
  Warning  Failed     5m                 kubelet            Error: ImagePullBackOff

4.1.2 解决方案

# 修正镜像名称
kubectl edit deployment fgedu-app
# 查看更新后的Pod状态
kubectl get pods

,更多视频教程www.fgedu.net.cn。

执行 →

deployment.apps/fgedu-app edited
NAME                        READY   STATUS    RESTARTS   AGE
fgedu-app-6548b8c8d9-7k2z7   1/1     Running   0          10m

4.2 实战案例:服务访问失败

4.2.1 排查步骤

# 查看服务状态
kubectl get services
# 查看服务详细信息
kubectl describe service fgedu-service
# 查看Endpoints
kubectl get endpoints fgedu-service
# 测试服务访问
kubectl run -it --rm --image=busybox:1.28 test-pod -- curl fgedu-service.default.svc.cluster.local:80

执行 →

NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
fgedu-service   ClusterIP   10.96.123.45   <none>        80/TCP    5m
Name:              fgedu-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=fgedu-app
Type:              ClusterIP
IP:                10.96.123.45
Port:              <unset>  80/TCP
TargetPort:        8080/TCP
Endpoints:         <none>
Session Affinity:  None
Events:            <none>
NAME            ENDPOINTS   AGE
fgedu-service   <none>      5m
Error: Failed to connect to fgedu-service.default.svc.cluster.local port 80: Connection refused

4.2.2 解决方案

# 查看Pod标签
kubectl get pods --show-labels
# 查看Deployment配置
kubectl get deployment fgedu-app -o yaml
# 修正服务配置
kubectl edit service fgedu-service
# 查看更新后的Endpoints,更多学习教程公众号风哥教程itpux_com。
kubectl get endpoints fgedu-service

执行 →

NAME                        READY   STATUS    RESTARTS   AGE   LABELS
fgedu-app-6548b8c8d9-7k2z7   1/1     Running   0          15m   app=fgedu-app,pod-template-hash=6548b8c8d9
# 发现Deployment的容器端口是80,而服务的TargetPort是8080
# 修正服务的TargetPort为80
NAME            ENDPOINTS                         AGE
fgedu-service   10.244.1.2:80,10.244.2.3:80   10m

4.3 实战案例:节点资源不足

4.3.1 排查步骤

# 查看节点状态
kubectl get nodes
# 查看节点详细信息
kubectl describe node node1
# 查看节点资源使用情况
kubectl top node node1
# 查看节点上的Pod
kubectl get pods -o wide --field-selector spec.nodeName=node1

执行 →

NAME     STATUS                     ROLES    AGE   VERSION
node1    Ready,SchedulingDisabled   <none>   10d   v1.27.0
node2    Ready                      <none>   10d   v1.27.0
node3    Ready                      <none>   10d   v1.27.0
# 节点node1的资源使用情况:
# CPU Requests: 950m (95%)
# CPU Limits: 2000m (200%)
# Memory Requests: 1.5Gi (75%)
# Memory Limits: 3Gi (150%)
NAME                        READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
fgedu-app-6548b8c8d9-7k2z7   1/1     Running   0          20m   10.244.1.2   node1    <none>           <none>
fgedu-db-5678b9c8d9-8x3y7    1/1     Running   0          15m   10.244.1.3   node1    <none>           <none>
fgedu-cache-7890b1c2d3-9z4w8  1/1     Running   0          10m   10.244.1.4   node1    <none>           <none>

4.3.2 解决方案

# 扩容集群,添加新节点
# 或调整Pod的资源配置
kubectl edit deployment fgedu-cache
# 查看更新后的Pod。
kubectl get pods -o wide

执行 →

deployment.apps/fgedu-cache edited,from K8S+DB视频:www.itpux.com。
NAME                        READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
fgedu-app-6548b8c8d9-7k2z7   1/1     Running   0          25m   10.244.1.2   node1    <none>           <none>
fgedu-db-5678b9c8d9-8x3y7    1/1     Running   0          20m   10.244.1.3   node1    <none>           <none>
fgedu-cache-7890b1c2d3-5a6b7  1/1     Running   0          5m    10.244.2.4   node2    <none>           <none>

Part05-风哥经验总结与分享

5.1 故障排查最佳实践

  • 保持冷静:遇到故障时保持冷静,有条理地进行排查
  • 收集信息:全面收集相关信息,包括日志、事件、配置等
  • 分析问题:根据收集的信息分析故障原因,不要盲目猜测
  • 验证假设:通过测试验证故障原因,确保解决方案正确
  • 记录过程:记录故障排查过程和解决方案,便于后续参考
  • 持续学习:不断学习Kubernetes的新特性和故障排查技巧
  • 预防为主:加强监控和预防措施,减少故障发生
  • 团队协作:与团队成员协作排查故障,分享经验

5.2 常见故障解决方案

  • Pod无法启动:检查镜像名称、配置文件、资源限制等
  • 服务访问失败:检查服务配置、Endpoints、网络策略等
  • 节点资源不足:扩容节点、调整资源配置、使用水平扩展
  • 网络故障:检查网络插件、网络策略、DNS配置等
  • 存储故障:检查存储卷配置、权限、存储类等
  • 控制平面故障:检查API服务器、etcd、调度器等组件

5.3 风哥提示

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息