kubernetes常见异常处理

一、kubernetes常见Pod异常状态的处理

  一)一般排查方式

  无论 Pod 处于什么异常状态,都可以执行以下命令来查看 Pod 的状态

  • kubectl get pod <pod-name> -o yaml 查看 Pod 的配置是否正确
  • kubectl describe pod <pod-name> 查看 Pod 的事件
  • kubectl logs <pod-name> [-c <container-name>] 查看容器日志

  二)Pod常见异常及处理

  1、Pod --Pending状态

  Pending 说明 Pod 还没有调度到某个 Node 上面。可以通过 
  kubectl describe pod <pod-name> 命令查看到当前 Pod 的事件,进而判断为什么没有调度。可能的原因包括

  • 资源不足,集群内所有的 Node 都不满足该 Pod 请求的 CPU、内存、GPU 等资源
  • HostPort 已被占用,通常推荐使用 Service 对外开放服务端口

  2、Pod --Waiting 或 ContainerCreating状态

  首先还是通过 kubectl describe pod <pod-name> 命令查看到当前 Pod 的事件。可能的原因包括

  • 镜像拉取失败,比如配置了镜像错误、Kubelet 无法访问镜像、私有镜像的**配置错误、镜像太大,拉取超时等
  • CNI 网络错误,一般需要检查 CNI 网络插件的配置,比如无法配置 Pod 、无法分配 IP 地址
  • 容器无法启动,需要检查是否打包了正确的镜像或者是否配置了正确的容器参数

  3、Pod -- ImagePullBackOff状态

  这也是我们测试环境常见的,通常是镜像拉取失败。这种情况可以使用 docker pull <image> 来验证镜像是否可以正常拉取。

  或者docker images | grep <images>查看镜像是否存在(系统有时会因为资源问题自动删除一部分镜像),

  4、Pod -- CrashLoopBackOff状态 

  CrashLoopBackOff 状态说明容器曾经启动了,但可能又异常退出了。此时可以先查看一下容器的日志

kubectl logs <pod-name> kubectl logs --previous <pod-name>

  这里可以发现一些容器退出的原因,比如

  • 容器进程退出
  • 健康检查失败退出

  5、Pod --Error 状态

  通常处于 Error 状态说明 Pod 启动过程中发生了错误。常见的原因包括

  • 依赖的 ConfigMap、Secret 或者 PV 等不存在
  • 请求的资源超过了管理员设置的限制,比如超过了 LimitRange 等
  • 违反集群的安全策略,比如违反了 PodSecurityPolicy 等
  • 容器无权操作集群内的资源,比如开启 RBAC 后,需要为 ServiceAccount 配置角色绑定

  6、Pod --Terminating 或 Unknown 状态

  从 v1.5 开始,Kubernetes 不会因为 Node 失联而删除其上正在运行的 Pod,而是将其标记为 Terminating 或 Unknown 状态。想要删除这些状态的 Pod 有三种方法:

  • 从集群中删除该 Node。使用公有云时,kube-controller-manager 会在 VM 删除后自动删除对应的 Node。而在物理机部署的集群中,需要管理员手动删除 Node(如 kubectl delete node <node-name>。
  • Node 恢复正常。Kubelet 会重新跟 kube-apiserver 通信确认这些 Pod 的期待状态,进而再决定删除或者继续运行这些 Pod。
  • 用户强制删除。用户可以执行 kubectl delete pods <pod> --grace-period=0 --force 强制删除 Pod。除非明确知道 Pod 的确处于停止状态(比如 Node 所在 VM 或物理机已经关机),否则不建议使用该方法。
    特别是 StatefulSet 管理的 Pod,强制删除容易导致脑裂或者数据丢失等问题。

  7、Pod -- Evicted状态

  出现这种情况,多见于系统内存或硬盘资源不足,可df-h查看docker存储所在目录的资源使用情况,如果百分比大于85%,就要及时清理下资源,尤其是一些大文件、docker镜像。

  清除状态为Evicted的pod:

kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod

  删除所有状态异常的pod:

kubectl delete pods $(kubectl get pods | grep -v Running | cut -d ' ' -f 1)

  删除集群中没有在使用的docker镜像(慎用):

docker image prune -f

  查看pod对应的服务(镜像)版本:

kubectl --server=127.0.0.1:8888 get rc -o yaml | grep image: |uniq | sort | grep ecs-core

  附:

  删除某类历史镜像(仅保留当前使用的)

docker images | grep ecs-core | grep -v `docker images | grep ecs-core -m 1 | awk '{print $2}'` | awk '{print $3}' | xargs docker rmi -f

二、kubernetes网络问题

  一)flannel网络插件

  1、flannel插件安装失败:Error registering network: failed to acquire lease

  环境:单节点k8s

    问题描述

  部署flannel网络插件失败:

NAMESPACE      NAME                             READY   STATUS              RESTARTS   AGE
kube-flannel   kube-flannel-ds-55nbz            0/1     CrashLoopBackOff    3          3m48s

    查看日志和事件

  查看日志

# kubectl logs -f -n kube-flannel   kube-flannel-ds-zcg88
I1015 08:01:17.973247       1 match.go:259] Using interface with name ens33 and address 10.0.0.10
I1015 08:01:17.973300       1 match.go:281] Defaulting external address to interface address (10.0.0.10)
I1015 08:01:17.973485       1 vxlan.go:138] VXLAN config: VNI=1 Port=0 GBP=false Learning=false DirectRouting=false
E1015 08:01:17.974560       1 main.go:330] Error registering network: failed to acquire lease: node "k8s-node-1" pod cidr not assigned
W1015 08:01:17.974846       1 reflector.go:436] github.com/flannel-io/flannel/subnet/kube/kube.go:402: watch of *v1.Node ended with: an error on the server ("unable to decode an event from the watch stream: context canceled") has prevented the request from succeeding
I1015 08:01:17.974943       1 main.go:447] Stopping shutdownHandler...

  查看事件

# kubectl get events

    解决:修改controller配置文件

vim /etc/kubernetes/manifests/kube-controller-manager.yaml
增加参数:
--allocate-node-cidrs=true
--cluster-cidr=10.244.0.0/16

  重启kubelet

systemctl restart kubelet

<think>好的,用户想了解如何加快Kubernetes自动处理节点故障的速度,我需要根据提供的引用和我的知识来回答。首先,我应该回顾一下用户提供的引用内容,看看有没有直接相关的信息。 引用1提到Kubernetes是容器编排工具,负责部署、扩展和操作容器,常与Docker一起使用。这可能和节点故障处理的基础相关,比如自动调度和恢复机制。 引用2讨论了基于Git的工作流和CI/CD管道,以及容器大小优化。这部分可能和部署效率有关,但不确定是否直接影响节点故障处理速度。不过缩小容器大小可能间接影响启动时间,从而加快恢复。 引用3强调亲和性和反亲和性策略,确保Pod分布在不同的节点上,避免单点故障。这明显与节点故障处理相关,因为合理的Pod分布可以在节点故障时减少影响,提高恢复速度。 接下来,我需要结合这些引用和我的知识,整理出最佳实践。可能的方向包括: 1. 调整健康检查参数:比如就绪和存活探针的间隔和超时时间,让Kubernetes更快检测到节点问题。 2. 优化Pod驱逐时间:调整node-monitor-grace-period和pod-eviction-timeout,缩短故障检测和Pod重新调度的等待时间。 3. 使用亲和性/反亲和性策略:确保Pod分布在多个节点,避免单节点故障导致多个Pod同时不可用,引用3提到了这一点。 4. 容器镜像优化:减小镜像大小,加快Pod启动时间,引用2提到了缩小容器大小。 5. 预拉取镜像:在节点上预先拉取镜像,减少启动延迟。 6. 自动扩展:使用Cluster Autoscaler和HPA,确保有足够的资源快速调度Pod。 7. 监控与告警集成:快速发现故障并处理,可能结合CI/CD工具,如引用2中的Spacelift。 8. 使用分布式存储:避免存储单点故障影响恢复速度。 9. 定期演练:测试故障恢复流程,确保有效性。 需要确保每个实践都有依据,比如引用中的内容或常见的最佳实践。例如,亲和性策略来自引用3,容器优化来自引用2,健康检查和驱逐时间调整是常见的调优手段。另外,需要将这些点用中文清晰表达,结构分明,并在适当的地方添加引用标记。 可能的问题:用户是否已经了解这些配置的具体方法?是否需要提供示例配置,比如调整kube-controller-manager的参数?或者是否需要解释如何设置亲和性策略?根据用户的问题,他们可能希望具体的步骤或配置建议,因此可能需要包括示例代码或YAML片段,如引用3中的affinity配置。 最后,生成的相关问题应围绕Kubernetes的故障处理、优化策略和应用场景,比如询问如何配置健康检查、如何设计高可用部署,或者比较不同的存储解决方案。</think>### 如何加快 Kubernetes 自动处理节点故障的速度? Kubernetes 通过内置机制自动检测节点故障并重新调度 Pod,但优化处理速度需要结合配置调整和架构设计。以下是关键实践: --- #### 1. **缩短节点故障检测时间** Kubernetes 通过 `kube-controller-manager` 的 `node-monitor-grace-period`(默认 40 秒)和 `node-monitor-period`(默认 5 秒)检测节点状态。**缩短这些参数**可加快故障判定: ```yaml # 修改 kube-controller-manager 启动参数 --node-monitor-grace-period=20s --node-monitor-period=2s ``` 同时调整 `pod-eviction-timeout`(默认 5 分钟),减少 Pod 驱逐等待时间[^3]。 --- #### 2. **优化 Pod 调度策略** - **反亲和性(Anti-Affinity)**:确保 Pod 分布在多个节点,避免单节点故障导致服务中断: ```yaml affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: [my-app] topologyKey: kubernetes.io/hostname ``` 此配置强制相同应用的 Pod 不部署在同一节点。 - **优先级和抢占(Priority/Preeemption)**:为关键 Pod 设置高优先级,确保故障时优先调度。 --- #### 3. **加速 Pod 重启与调度** - **容器镜像优化**:缩小容器镜像体积,加快 Pod 启动速度(如使用 Alpine 基础镜像)[^2]。 - **预拉取镜像(Image Pre-pulling)**:通过 `InitContainer` 或 DaemonSet 在节点上预先拉取镜像。 - **使用就绪探针(Readiness Probe)和存活探针(Liveness Probe)**:合理配置探针间隔,避免误判并快速标记异常 Pod。 --- #### 4. **启用自动扩展机制** - **Cluster Autoscaler**:自动扩容节点池,确保有足够资源接收重新调度的 Pod。 - **Horizontal Pod Autoscaler (HPA)**:根据负载动态调整 Pod 副本数,提升故障时的弹性。 --- #### 5. **集成监控与告警** - **Prometheus + Alertmanager**:实时监控节点健康状态,触发告警后结合自动化工具(如 Argo Rollouts)触发修复流程。 - **Node Problem Detector(NPD)**:检测节点级别的硬件或内核问题,并上报至 Kubernetes。 --- #### 6. **存储与网络高可用** - **使用分布式存储(如 Ceph、Longhorn)**:避免存储单点故障导致 Pod 无法挂载卷。 - **多区域部署(Multi-AZ)**:将节点分布在多个可用区,通过拓扑感知调度降低区域故障影响。 --- #### 7. **定期故障演练** 通过混沌工程工具(如 Chaos Mesh)模拟节点宕机,验证故障恢复流程的有效性。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值