• k8s,kubernetes关于pod的报错


    在学习k8s过程中会发现pod会有很多状态,今天就pod的异常状态总结一下;

    pod运行异常排错

    常用的几种命令来进行pod状态查看

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

    通过上述事件和日志基本上能排除大部分pod的问题。

    Pod 一直处于 Pending 状态

    Pending状态的pod 还没有被调度到某个node上,可以通过
    kubectl describe pod 命令查看到当前 Pod 的事件,进而判断为什么没有调度。可能的原因包括

    • 资源不足,集群内所有的 Node 都不满足该 Pod 请求的 CPU、内存、GPU 等资源
    • HostPort 已被占用,通常推荐使用 Service 对外开放服务端口
    • 如果只有一个node节点或者配置中指定了node信息,还有观察kubelet的状态

    Pod 一直处于 Waiting 或 ContainerCreating 状态

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

    1. 镜像拉取失败,比如
    • 配置了错误的镜像
    • Kubelet 无法访问镜像(国内环境访问 gcr.io 需要特殊处理)
    • 私有镜像的密钥配置错误
    • 镜像太大,拉取超时(可以适当调整 kubelet 的 --image-pull-progress-deadline 和 --runtime-request-timeout 选项)
    1. CNI 网络错误,一般需要检查 CNI 网络插件的配置,比如
    • 无法配置 Pod 网络
    • 无法分配 IP 地址
    1. 容器无法启动,需要检查是否打包了正确的镜像或者是否配置了正确的容器参数

    Pod 处于 Error 状态

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

    Pod 处于 Terminating 或 Unknown 状态

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

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

    Pod 行为异常

    这里所说的行为异常是指 Pod 没有按预期的行为执行,比如没有运行 podSpec 里面设置的命令行参数。这一般是 podSpec yaml 文件内容有误,可以尝试使用 --validate 参数重建容器,比如

    kubectl delete pod mypod
    kubectl create --validate -f mypod.yaml
    

    也可以查看创建后的 podSpec 是否是对的,比如

    kubectl get pod mypod -o yaml
    

    修改静态 Pod 的 Manifest 后未自动重建

    Kubelet 使用 inotify 机制检测 /etc/kubernetes/manifests 目录(可通过 Kubelet 的 --pod-manifest-path 选项指定)中静态 Pod 的变化,并在文件发生变化后重新创建相应的 Pod。但有时也会发生修改静态 Pod 的 Manifest 后未自动创建新 Pod 的情景,此时一个简单的修复方法是重启 Kubelet。

    参考文档:
    知乎
    官网

    现在学习还不晚;
  • 相关阅读:
    LeetCode
    LeetCode
    一篇真正教会你开发移动端页面的文章(一)
    移动端页面开发资源总结
    Vue 模板
    使用 concurrently 并行地运行多个命令(同时跑前端和后端的服务)
    值得H5前端学习的60个JS插件(含DEMO演示)
    解读浮动闭合最佳方案:clearfix
    JavaScript 如何工作的: 事件循环和异步编程的崛起 + 5 个关于如何使用 async/await 编写更好的技巧
    JavaScript 运行机制详解:再谈Event Loop
  • 原文地址:https://www.cnblogs.com/ainimore/p/12191588.html
Copyright © 2020-2023  润新知