K8S常见错误、原因及处理方法
- 需要给每个 Pod 加上 resources.requests,这样资源不足时,后续 Pod 会停止调度,直到资源恢复正常。
Pod 无法删除
可能是某些资源无法被GC,这会导致容器已经 Exited 了,但是 Pod 一直处于 Terminating 状态。
这个问题在网上能搜到很多案例,但大都只是提供了如下的强制清理命令,未分析具体原因:
kubectl delete pods <pod> --grace-period=0 --force最近找到几篇详细的原因分析文章,值得一看:
- 腾讯云原生 -【Pod Terminating原因追踪系列】之 containerd 中被漏掉的 runc 错误信息
- 腾讯云原生 -【Pod Terminating原因追踪系列之二】exec连接未关闭导致的事件阻塞
- 腾讯云原生 -【Pod Terminating原因追踪系列之三】让docker事件处理罢工的cancel状态码
- Pod terminating - 问题排查 - KaKu Li
大致总结一下,主要原因来自 docker 18.06 以及 kubernetes 的 docker-shim 运行时的底层逻辑,已经在新版本被修复了。
节点常见错误
网络常见错误
1. Ingress/Istio Gateway 返回值
Ingress 相关网络问题的排查流程:
名字空间常见错误
名字空间无法删除
这通常是某些资源如 CR(custom resources)/存储等资源无法释放导致的。
比如常见的 monitoring 名字空间无法删除,应该就是 CR 无法 GC 导致的。
可手动删除 namespace 配置中的析构器(spec.finalizer,在名字空间生命周期结束前会生成的配置项),这样名字空间就会直接跳过 GC 步骤:
# 编辑名字空间的配置 kubectl edit namespace <ns-name> # 将 spec.finalizers 改成空列表 []如果上述方法也无法删除名字空间,也找不到具体的问题,就只能直接从 etcd 中删除掉它了(有风险,谨慎操作!)。方法如下:
# 登录到 etcd 容器中,执行如下命令: export ETCDCTL_API=3 cd /etc/kubernetes/pki/etcd/ # 列出所有名字空间 etcdctl --cacert ca.crt --cert peer.crt --key peer.key get /registry/namespaces --prefix --keys-only# (谨慎操作!!!)强制删除名字空间 `monitoring`。这可能导致相关资源无法被 GC! etcdctl --cacert ca.crt --cert peer.crt --key peer.key del /registry/namespaces/monitoringkubectl/istioctl 等客户端工具异常
批量清理 Evicted 记录
有时候 Pod 因为节点选择器的问题,被不断调度到有问题的 Node 上,就会不断被 Evicted,导致出现大量的 Evicted Pods。
排查完问题后,需要手动清理掉这些 Evicted Pods.
批量删除 Evicted 记录:
kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod容器镜像GC、Pod驱逐以及节点压力
节点压力 DiskPressure 会导致 Pod 被驱逐,也会触发容器镜像的 GC。
根据官方文档 配置资源不足时的处理方式,Kubelet 提供如下用于配置容器 GC 及 Evicetion 的阈值:
问:能否为 ImageGC 设置一个比 DiskPressure 更低的阈值?因为我们希望能自动进行镜像 GC,但是不想立即触发 Pod 驱逐。
答:这应该可以通过设置 eviction-soft 和长一点的 eviction-soft-grace-period 来实现。
另外 --eviction-minimum-reclaim 也可以设小一点,清理得更干净。示例如下:
其他问题
如何重新运行一个 Job?
我们有一个 Job 因为外部原因运行失败了,修复好后就需要重新运行它。
方法是:删除旧的 Job,再使用同一份配置重建 Job.
或者建议不要定义 job 的 nane,改成定义 generateName.
如果你使用的是 fluxcd 这类 GitOps 工具,就只需要手工删除旧 Pod,fluxcd 会定时自动 apply 所有配置,这就完成了 Job 的重建。
参考
- Kubernetes管理经验
- 504 Gateway Timeout when accessing workload via ingress
- Kubernetes Failure Stories
总结
以上是生活随笔为你收集整理的K8S常见错误、原因及处理方法的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: Spark常规性能调优三:并行度调节
- 下一篇: Spark3.1.1 Docker镜像中