[置顶]K8s面试题目

Kubernetes 面试全解(高可用+扩缩容+Jenkins+监控+日志)
整理为可直接复制的MD格式,面试可直接背诵、条理清晰、通俗易懂,完全覆盖所有问题。
一、K8S 高可用环境部署

  1. K8S 核心组件及作用(必背)
    控制平面组件(Master)
  2. kube-apiserver
    • 集群唯一入口,所有组件都通过它通信
    • 认证、授权、访问控制、数据持久化(etcd)
  3. etcd
    • 键值存储数据库,保存集群所有配置、状态数据
    • 必须高可用,一般 3/5 节点
  4. kube-scheduler
    • 负责把新建 Pod 调度到合适的 Worker 节点
  5. kube-controller-manager
    • 控制器合集:节点、副本、端点、服务账号等控制器
  6. cloud-controller-manager(可选)

    • 对接云厂商资源(负载均衡、云存储)
      节点组件(Worker)
  7. kubelet
    • 节点代理,管理本机 Pod 生命周期
  8. kube-proxy
    • 维护节点网络规则,实现 Service 访问
  9. 容器运行时
    • 如 containerd、docker,负责运行容器
      附加组件
  • CoreDNS:集群内部 DNS
  • Ingress Controller:七层流量入口
  • Metrics Server:资源指标采集
  1. K8S 高可用架构怎么做?
    一句话总结:所有单点组件都做成多副本 + 负载均衡。
    高可用方案:
  2. Master 节点至少 3 台
  3. etcd 集群 3 节点(和 Master 混部)
  4. kube-apiserver 前面挂 LB(负载均衡)

    • Nginx/HAProxy + Keepalived(自建)
    • 云厂商 SLB(云上)
  5. 控制器组件多副本运行

    • kube-scheduler、kube-controller-manager 一主多备,自动选主
  6. Worker 节点多副本

    • 业务 Pod 多副本 + 反亲和,避免单点故障
  7. 某个 Master 挂了,LB 怎么操作?
  8. LB 自动健康检查

    • 检测 apiserver 端口 6443 不通
  9. 自动摘除故障节点

    • 不再把流量转发到挂掉的 Master
  10. 剩余 Master 正常提供服务

    • 集群无感知,kubectl、业务都不受影响
  11. 节点恢复后

    • LB 自动加回节点
      面试一句话答案:LB 通过健康检查自动剔除不可用的 Master 节点,流量只转发到健康节点,集群自动容错。
  12. kubectl get pods 偶尔卡顿原因
  13. apiserver 压力大

    • 请求量高、GC 卡顿、etcd 同步慢
  14. etcd 性能问题

    • 磁盘 IO 高、节点负载高、选举阻塞
  15. 网络延迟

    • LB 转发慢、Master 节点网络抖动
  16. kubelet/metrics 压力大

    • 节点负载高,返回数据慢
  17. 集群对象过多

    • Pod/ConfigMap/Secret 太多,查询慢
  18. DNS 解析异常

    • kubectl 访问 apiserver 域名解析卡住
      二、K8S 集群扩缩容
  19. 如何扩容 K8S 节点
  20. 准备新机器,安装 kubelet、kubeadm、containerd
  21. 从 Master 获取加入命令
     kubeadm token create --print-join-command
    
  22. 在新节点执行 join 命令
  23. 节点自动注册到集群,变为 Ready 状态
  24. 调度器可将 Pod 调度到新节点
  25. Worker 节点加入集群 bootstrap 流程(面试高频)
  26. kubelet 启动,向 LB 的 apiserver 发起注册请求
  27. 使用 token + 证书哈希完成身份认证
  28. apiserver 下发证书给节点
  29. 节点创建 CSR(证书签名请求)
  30. Master 自动/手动批准 CSR
  31. 节点获得永久证书,完成认证
  32. 下载并运行 DaemonSet(如 kube-proxy、CNI、node-exporter)
  33. 节点状态变为 Ready,可以接收 Pod
  34. 如何缩容 K8S 节点(标准流程)
  35. 标记节点不可调度
     kubectl cordon <节点名>
    
  36. 驱逐节点上所有 Pod
     kubectl drain <节点名> --ignore-daemonsets --delete-emptydir-data
    
  37. 打污点(可选,强化驱逐)
     kubectl taint nodes <节点名> key=value:NoSchedule
    
  38. 从集群删除节点
     kubectl delete node <节点名>
    
  39. 节点重置/重装系统
    kubeadm reset
    systemctl stop kubelet
    三、Jenkins 集成 K8S
  40. 公司如何集成 Jenkins + K8S
  41. Jenkins 部署在 K8S 内
  42. 安装 Kubernetes Plugin
  43. 配置 Jenkins 连接 apiserver
  44. Jenkins 动态创建 Pod 作为构建机

    • 代码拉取 → 编译 → 构建镜像 → 推送仓库 → 调用 kubectl 发布
  45. 构建完成 Pod 自动销毁,节省资源
  46. K8S Pod 访问流程
    外部访问:
    用户 → 域名 → LB → Ingress Controller → Service → Pod
    内部访问:
    Pod A → Service 域名 → kube-proxy → 目标 Pod
  47. 业务 Pod 无法访问(www.oldboyedu.com)排查思路
  48. 看 Pod 是否运行
    kubectl get pods
    kubectl describe pod <pod>
  49. 看 Pod 日志
     kubectl logs <pod>
    
  50. 检查 Service 是否正常
     kubectl get svc
    
    kubectl get endpoints
  51. 检查 Ingress
     kubectl get ingress
    
  52. 进入 Pod 内部 curl 测试
     kubectl exec -it <pod> -- curl localhost
    
  53. 检查网络插件(CNI)
  54. 检查节点健康、资源、防火墙、安全组
    四、Prometheus 监控 K8S
    如何监控 K8S
    使用 kube-prometheus-stack(prometheus-operator)
    部署命令(官方标准):
    kubectl apply —server-side -f manifests/setup
    kubectl wait —for condition=Established —all CustomResourceDefinition —namespace=monitoring
    kubectl apply -f manifests/
    监控内容:
  • Node 节点(CPU、内存、磁盘、网络)
  • Pod 容器指标
  • apiserver、etcd、scheduler 状态
  • Service、Deployment 状态
  • 告警规则 + Grafana 看板
    五、ELK 集成 K8S 日志采集(极简版)
    方案:Filebeat + Elasticsearch + Kibana
  1. 采集原理
  • Filebeat 以 DaemonSet 运行在每个节点
  • 采集 /var/log/containers/ 下的容器日志
  • 发送到 ES
  • Kibana 展示
  1. 极简配置(面试直接说)
  2. 部署 Filebeat DaemonSet
  3. 挂载节点 /var/log/containers
  4. 配置输出到 ES
  5. Kibana 创建索引模式查看日志
    极简 Filebeat 配置(核心)
    filebeat.inputs:
  • type: container
    paths:
    • /var/log/containers/*.log

output.elasticsearch:
hosts: [“elasticsearch:9200”]
面试万能总结(可直接背)
K8S 高可用

  • Master 多节点 + etcd 集群 + apiserver 挂 LB
  • 节点挂了 LB 自动剔除,集群无感知
    节点扩容
  • 安装环境 → join 集群 → 自动认证 → 运行 DS → 就绪
    节点缩容
  • cordon → drain → delete node → 重置节点
    Jenkins + K8S
  • 插件动态生成 Pod 构建机,完成 CI/CD
    无法访问排查
  • Pod → 日志 → Service → Endpoints → Ingress → 网络
    监控
  • kube-prometheus 监控节点、组件、容器
    日志
  • Filebeat DaemonSet 采集容器日志 → ES → Kibana