k8s面试题

2026-04-03 119 阅读 1 分钟 admin

Pod的完整创建流程

  • Pod的完整创建流程
    • k8s中各组件间协同都采用list-watch机制进行通信 首先控制平面的组件都watch( 利用 HTTP/1.1 的 分块传输 )监听apiserver 、只要有更新,apiserver就会上报该更新给对应的组件
    • kubectl提交创建pod的请求
    • apiserver收到该请求后,会依次执行认证 授权 准入控制,将 Pod 对象的元数据持久化存储到 Etcd 中,上报事件
    • controller-mamanger收到事件,进入调谐
      • 调谐 :是 Kubernetes 控制器的核心机制,用于确保集群的‌实际状态‌始终与用户声明的‌期望状态‌一致。
    • 发起要创建一个pod的请求给apiserver将创建pod的事件存入etcd中,上报Pod created事件
    • scheduler组件收到Pod created事件根据调度策略,预选优选,选择资源最优选的物理节点,把调度结果发送给apiserver。将事件存入etcd中,上报该事件
    • 物理节点上的kubelet会收到该事件,进入pod创建环节
    • kubelet会先调用容器引擎创建出一个pause容器,调用网络插件把pause容器的网络打通
    • 调用容器引擎来创建出业务容器,并且业务容器采用的container网络模式与pause容器共享网络
    • 生命周期
    • 串行业务init容器初始化
    • 启动业务容器,启动那一刻会同时运行主容器上定义的Poststart钩子事件
    • startupProbe健康状态监测,判断容器是否启动成功
    • 结束时,在容器结束之前会先执行prestop钩子事件,然后才终止容器
    • kubelet会帮当前节点的pod信息上报给API Server将Pod信息存储到etcd系统中。
    • 在etcd确认写入操作完成,API Server将确认信息发送到相关的kubelet。

删除一个pod时会发生什么

当你执行 kubectl delete pod 删除一个 Pod 时,发生的事情取决于这个 Pod 是如何创建的。主要有两种情况:

情况一:直接创建的独立 Pod(没有控制器)
比如用 kubectl run my-pod --image=nginx 创建的,没有 Deployment 包裹。

流程

  1. 用户执行 kubectl delete pod my-pod
  2. API Server 收到请求,Pod 状态变为 Terminating
  3. Kubelet 执行优雅终止(同上:PreStop → SIGTERM → 等待 → SIGKILL)
  4. API Server 从 etcd 删除 Pod 对象
  5. 结束。没有控制器会重建它

情况一:Pod 是由控制器管理的(最常见)
比如通过 Deployment、ReplicaSet、StatefulSet、DaemonSet 等控制器创建的 Pod。
除了上面的终止流程,控制器会发现副本数少了, 期望副本数,当前副本不一致触发 调谐动作:创建新的替代 Pod
追问
Q1:如何让 Pod 被删后不复活?
删除对应的 Deployment/ReplicaSet,或者直接使用独立 Pod

    Q2:如何强制立即删除(跳过优雅终止)?
                    kubectl delete pod my-pod --force --grace-period=0
---

pod的状态都有哪些

pending 正处于调度阶段
Init:Error:kubelet创建init容器失败
Containering 正在创建:拉镜像、关联存储卷
ImagePullBackOff、ErrImagePull
completed:pod内的容器正常运行完毕了
unkown pod所在的节点有问题(节点notready了:网络出问题、kubelet挂掉、节点宕机
evicted 驱逐,因为某个物理节点资源不足(不可压缩资源:磁盘、内存)而驱逐该pod
OOMkilled: 系统级别的OOM:杀进程的范围是系统中所有的进程,k8s级别的OOM:针对某个Pod,该pod的容器对内存的使用达到limits的限定
Terminating: pod正在被终止(pod被终止需要做两件事:杀掉容器的进程、清理etcd中数据)

pod异常状态以及排查思路

先获取pod状态异常 使用 kubectl describe pod 分析Events事件
在定位问题 如果是 调度问题pending状态需要检查资源配额 检查节点选择器/亲和性 检查污点容忍
如果是运行问题 crashLOOPbackoff 排查容器自身问题 查看容器日志 进入容器调试 分析应用配置 环境变量 配置文件 如果是镜像问题 imagepullbackoff 检查镜像名称/标签 检查镜像拉取密钥 检查仓库权限与网络 如果是节点问题 检查node状态与资源,kubelet状态 ,网络插件。

三种探针

  • startupProbe:启动探针 用于启动场景的检测

    • 检测通过/成功之后重复执行livenessProbe探针和,readinessProbe探针

    • 检测失败会根据重启策略重启POD

  • livenessProbe存活探针 用于启动之后的检测

    • 周期性检测,检查失败就根据重启策略重启pod
  • readinessProbe 就绪探针 用于启动之后的检测

    • 周期性检测,检测失败 reday 会显示为0 如果pod关联了svc svc 会把pod 的 endpoint 剔除