[置顶] K8s面试题目
Kubernetes 面试全解(高可用+扩缩容+Jenkins+监控+日志)
整理为可直接复制的MD格式,面试可直接背诵、条理清晰、通俗易懂,完全覆盖所有问题。
一、K8S 高可用环境部署
- K8S 核心组件及作用(必背)
控制平面组件(Master) - kube-apiserver
- 集群唯一入口,所有组件都通过它通信
- 认证、授权、访问控制、数据持久化(etcd)
- etcd
- 键值存储数据库,保存集群所有配置、状态数据
- 必须高可用,一般 3/5 节点
- kube-scheduler
- 负责把新建 Pod 调度到合适的 Worker 节点
- kube-controller-manager
- 控制器合集:节点、副本、端点、服务账号等控制器
cloud-controller-manager(可选)
- 对接云厂商资源(负载均衡、云存储)
节点组件(Worker)
- 对接云厂商资源(负载均衡、云存储)
- kubelet
- 节点代理,管理本机 Pod 生命周期
- kube-proxy
- 维护节点网络规则,实现 Service 访问
- 容器运行时
- 如 containerd、docker,负责运行容器
附加组件
- 如 containerd、docker,负责运行容器
- CoreDNS:集群内部 DNS
- Ingress Controller:七层流量入口
- Metrics Server:资源指标采集
- K8S 高可用架构怎么做?
一句话总结:所有单点组件都做成多副本 + 负载均衡。
高可用方案: - Master 节点至少 3 台
- etcd 集群 3 节点(和 Master 混部)
kube-apiserver 前面挂 LB(负载均衡)
- Nginx/HAProxy + Keepalived(自建)
- 云厂商 SLB(云上)
控制器组件多副本运行
- kube-scheduler、kube-controller-manager 一主多备,自动选主
Worker 节点多副本
- 业务 Pod 多副本 + 反亲和,避免单点故障
- 某个 Master 挂了,LB 怎么操作?
LB 自动健康检查
- 检测 apiserver 端口 6443 不通
自动摘除故障节点
- 不再把流量转发到挂掉的 Master
剩余 Master 正常提供服务
- 集群无感知,kubectl、业务都不受影响
节点恢复后
- LB 自动加回节点
面试一句话答案:LB 通过健康检查自动剔除不可用的 Master 节点,流量只转发到健康节点,集群自动容错。
- LB 自动加回节点
- kubectl get pods 偶尔卡顿原因
apiserver 压力大
- 请求量高、GC 卡顿、etcd 同步慢
etcd 性能问题
- 磁盘 IO 高、节点负载高、选举阻塞
网络延迟
- LB 转发慢、Master 节点网络抖动
kubelet/metrics 压力大
- 节点负载高,返回数据慢
集群对象过多
- Pod/ConfigMap/Secret 太多,查询慢
DNS 解析异常
- kubectl 访问 apiserver 域名解析卡住
二、K8S 集群扩缩容
- kubectl 访问 apiserver 域名解析卡住
- 如何扩容 K8S 节点
- 准备新机器,安装 kubelet、kubeadm、containerd
- 从 Master 获取加入命令
kubeadm token create --print-join-command - 在新节点执行 join 命令
- 节点自动注册到集群,变为 Ready 状态
- 调度器可将 Pod 调度到新节点
- Worker 节点加入集群 bootstrap 流程(面试高频)
- kubelet 启动,向 LB 的 apiserver 发起注册请求
- 使用 token + 证书哈希完成身份认证
- apiserver 下发证书给节点
- 节点创建 CSR(证书签名请求)
- Master 自动/手动批准 CSR
- 节点获得永久证书,完成认证
- 下载并运行 DaemonSet(如 kube-proxy、CNI、node-exporter)
- 节点状态变为 Ready,可以接收 Pod
- 如何缩容 K8S 节点(标准流程)
- 标记节点不可调度
kubectl cordon <节点名> - 驱逐节点上所有 Pod
kubectl drain <节点名> --ignore-daemonsets --delete-emptydir-data - 打污点(可选,强化驱逐)
kubectl taint nodes <节点名> key=value:NoSchedule - 从集群删除节点
kubectl delete node <节点名> - 节点重置/重装系统
kubeadm reset
systemctl stop kubelet
三、Jenkins 集成 K8S - 公司如何集成 Jenkins + K8S
- Jenkins 部署在 K8S 内
- 安装 Kubernetes Plugin
- 配置 Jenkins 连接 apiserver
Jenkins 动态创建 Pod 作为构建机
- 代码拉取 → 编译 → 构建镜像 → 推送仓库 → 调用 kubectl 发布
- 构建完成 Pod 自动销毁,节省资源
- K8S Pod 访问流程
外部访问:
用户 → 域名 → LB → Ingress Controller → Service → Pod
内部访问:
Pod A → Service 域名 → kube-proxy → 目标 Pod - 业务 Pod 无法访问(www.oldboyedu.com)排查思路
- 看 Pod 是否运行
kubectl get pods
kubectl describe pod <pod> - 看 Pod 日志
kubectl logs <pod> - 检查 Service 是否正常
kubectl get endpointskubectl get svc - 检查 Ingress
kubectl get ingress - 进入 Pod 内部 curl 测试
kubectl exec -it <pod> -- curl localhost - 检查网络插件(CNI)
- 检查节点健康、资源、防火墙、安全组
四、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
- 采集原理
- Filebeat 以 DaemonSet 运行在每个节点
- 采集 /var/log/containers/ 下的容器日志
- 发送到 ES
- Kibana 展示
- 极简配置(面试直接说)
- 部署 Filebeat DaemonSet
- 挂载节点 /var/log/containers
- 配置输出到 ES
- 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
