Kubernetes(简称 k8s)是容器编排领域的事实标准 ,也是后端、运维、云原生方向面试的核心考点。本文会从 「实操搭建(分学习 / 生产场景)」和「面试高频考点(原理 / 运维 / 故障排查)」 两个维度,系统性梳理知识,兼顾快速上手 和面试通关。
一、k8s 环境搭建(分场景选型,避坑指南)
k8s 搭建分 「学习场景」 和 「生产场景」,两者的目标和方案完全不同,面试中也会考察不同场景的选型思路。
场景 1:学习 / 本地测试环境(推荐 Minikube,零成本快速上手)
适合个人学习、本地验证 k8s 功能,无需多服务器,单台电脑即可搭建。
1. 前置条件
- 操作系统:Linux/macOS/Windows(Win 需开启 WSL2)
- 硬件:至少 2 核 CPU、4GB 内存、20GB 磁盘空间
- 必须开启虚拟化(BIOS 中开启 VT-x/AMD-V)
2. 安装步骤(以 Linux/macOS 为例)
(1)安装依赖工具(Docker 或 Containerd)
k8s 需要容器运行时,推荐用 Docker:
bash
# Ubuntu 安装 Docker
sudo apt-get update && sudo apt-get install docker.io -y
sudo systemctl enable docker && sudo systemctl start docker
sudo usermod -aG docker $USER # 免 sudo 使用 Docker
(2)安装 Minikube
bash
# 下载 Minikube 二进制包
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 启动 Minikube(指定 Docker 为运行时)
minikube start --driver=docker --image-mirror-country=cn # 国内镜像加速
(3)验证安装
bash
# 查看集群状态
minikube status
# 查看节点
kubectl get nodes
# 部署测试应用
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
minikube service nginx # 访问测试服务
3. 核心操作命令(面试常考)
bash
minikube start # 启动集群
minikube stop # 停止集群
minikube delete # 删除集群
minikube dashboard # 打开 k8s 可视化控制台
场景 2:生产环境多节点集群(推荐 kubeadm,企业标准方案)
适合线上业务部署,需要 至少 3 台服务器 (1 主 2 从,或 3 主高可用),面试中重点考察该方案。
1. 前置条件(所有节点必须满足)
| 配置项 | 要求 | 原因 |
|---|---|---|
| 操作系统 | CentOS 7/8、Ubuntu 20.04+ | 兼容性最好,官方推荐 |
| 硬件 | 2 核 CPU、4GB 内存、50GB 磁盘 | 满足 k8s 组件运行基础需求 |
| 网络 | 所有节点互通,禁用防火墙 / SELinux | 避免端口和网络策略阻塞 |
| 内核参数 | 关闭 Swap 分区 | k8s 要求关闭 Swap,否则会影响调度 |
| 主机名 | 各节点主机名唯一 | 避免节点识别冲突 |
2. 初始化所有节点(通用步骤)
bash
# 1. 关闭 Swap
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab # 永久关闭
# 2. 关闭防火墙和 SElinux
sudo systemctl stop firewalld && sudo systemctl disable firewalld
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 3. 配置内核参数(开启 IPVS/IPTABLES 转发)
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
# 4. 安装容器运行时(推荐 Containerd,比 Docker 更轻量)
# 以 Ubuntu 为例
sudo apt-get install containerd -y
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd && sudo systemctl enable containerd
3. 部署 k8s 集群(kubeadm 方式)
(1)安装 kubeadm、kubelet、kubectl
bash
# 配置 k8s 源(国内用阿里云镜像)
sudo apt-get update && sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/kubernetes.gpg
echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 安装指定版本(面试常考:版本选择需一致)
sudo apt-get update && sudo apt-get install -y kubelet=1.28.0-00 kubeadm=1.28.0-00 kubectl=1.28.0-00
sudo apt-mark hold kubelet kubeadm kubectl # 锁定版本,防止自动更新
(2)主节点初始化
bash
# 初始化集群(指定 Pod 网段、服务网段,国内镜像加速)
sudo kubeadm init \
--apiserver-advertise-address=主节点IP \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.28.0 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
# 配置 kubectl 权限(普通用户可用)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 安装网络插件(必须!否则 Pod 无法通信,面试高频坑点)
# 推荐 Calico(支持网络策略)
kubectl apply -f https://docs.projectcalico.org/v3.26/manifests/calico.yaml
(3)从节点加入集群
主节点初始化完成后,会输出加入命令,直接在从节点执行:
bash
sudo kubeadm join 主节点IP:6443 --token xxxxx.xxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
(4)验证集群
bash
# 查看节点状态(Ready 表示正常)
kubectl get nodes
# 查看集群组件状态
kubectl get pods -n kube-system
4. 生产环境核心优化(面试必问)
- Master 高可用:至少 3 个 Master 节点,搭配 etcd 集群 + 负载均衡器(HAProxy/Nginx)
- 存储方案:部署 CSI 插件(如 Rook/Ceph),实现持久化存储
- 监控告警:部署 Prometheus + Grafana,监控集群和应用状态
- 日志收集:部署 ELK 或 Loki,收集 Pod 日志
二、k8s 面试高频考点(原理 + 运维 + 故障排查)
k8s 面试考察分为 「核心概念」「核心组件」「运维实操」「故障排查」「实战场景」 五大模块,结合 Java 微服务场景的问题是重中之重。
模块 1:核心概念(面试必问,基础中的基础)
1. Pod 相关
-
**问题 1:什么是 Pod?为什么 k8s 最小调度单位是 Pod 而非容器?**答:Pod 是 k8s 最小部署 / 调度单元,包含一个或多个容器,共享网络、存储和 PID 命名空间。原因:
- 容器间协作:比如应用容器 + 日志收集容器,共享存储更高效;
- 原子调度:Pod 内所有容器必须运行在同一节点,避免跨节点通信开销。
-
问题 2:Pod 的生命周期阶段有哪些?常见异常状态(CrashLoopBackOff、ImagePullBackOff)是什么原因? 答:生命周期阶段:
Pending → Running → Succeeded/Failed/Unknown。CrashLoopBackOff:容器启动后立即崩溃,重复重启(原因:代码错误、配置错误、资源不足);ImagePullBackOff:镜像拉取失败(原因:镜像不存在、私有镜像未配置密钥、网络不通)。
2. 控制器相关
-
问题 1:Deployment、StatefulSet、DaemonSet、Job 的区别和适用场景?
控制器 核心特点 适用场景 Deployment 无状态服务,支持滚动更新、回滚 微服务(如 SpringBoot 应用)、Nginx StatefulSet 有状态服务,Pod 有固定名称、有序部署 / 删除、持久化存储 MySQL 集群、ZooKeeper 集群 DaemonSet 每个节点只运行一个 Pod 副本 日志收集(Fluentd)、监控(Node Exporter) Job 一次性任务,执行完成后退出 数据备份、批量计算 -
**问题 2:滚动更新和蓝绿部署的区别?k8s 如何实现?**答:
- 滚动更新:逐步替换旧 Pod,不中断服务(Deployment 默认策略),优点是无服务中断,缺点是新旧版本共存可能有兼容性问题;
- 蓝绿部署:同时部署新旧两个版本,切换流量(通过 Service 切换),优点是切换瞬间完成,缺点是资源消耗翻倍。
3. Service 相关
-
问题 1:Service 的作用是什么?有哪些类型? 答:Service 解决 Pod 动态漂移的问题,通过 Label Selector 关联 Pod,提供固定访问入口。类型:
ClusterIP:集群内访问,默认类型;NodePort:暴露端口到节点,集群外可访问(端口范围 30000-32767);LoadBalancer:对接云厂商负载均衡器(如阿里云 SLB);ExternalName:映射到外部服务(如数据库)。
-
问题 2:k8s 服务发现的原理是什么?CoreDNS 的作用? 答:服务发现核心是 Service Name → ClusterIP 的解析。CoreDNS 是 k8s 内置的 DNS 服务,Pod 启动时会配置 CoreDNS 的 IP 作为 DNS 服务器,通过
服务名.命名空间.svc.cluster.local即可访问服务。
模块 2:核心组件原理(面试高频难点)
1. k8s 核心组件架构(控制平面 + 节点组件)
-
控制平面(Master 节点):负责集群管理和决策
- kube-apiserver :集群唯一入口,提供 REST API,所有组件通过它通信(面试必问:所有操作都必须经过 apiserver,保证权限和一致性);
- etcd :分布式键值存储,存储集群所有状态数据(面试必问:etcd 是 k8s 的大脑,必须集群部署保证高可用);
- kube-controller-manager:包含多种控制器(如 Deployment 控制器、Node 控制器),负责维持集群期望状态;
- kube-scheduler:负责 Pod 调度,根据节点资源、亲和性等策略选择最优节点。
-
节点组件(Node 节点):负责运行 Pod
- kubelet:节点管家,监听 apiserver,管理 Pod 生命周期(启动 / 停止容器),上报节点状态;
- kube-proxy :负责 Service 流量转发,实现 Pod 负载均衡(两种模式:
iptables或ipvs,面试常考:ipvs 性能更高,适合高并发场景); - 容器运行时:如 Containerd、Docker,负责容器的创建和管理。
2. 面试高频:Pod 的创建流程(核心链路)
bash
用户执行 kubectl create deployment → 发送请求到 apiserver → apiserver 将 Deployment 信息存入 etcd
→ controller-manager 检测到 Deployment,创建 ReplicaSet → apiserver 将 ReplicaSet 存入 etcd
→ scheduler 检测到未调度的 Pod,根据策略选择节点 → apiserver 更新 Pod 的节点信息到 etcd
→ 目标节点的 kubelet 检测到 Pod,调用容器运行时创建容器 → kubelet 上报 Pod 状态到 apiserver
模块 3:运维实操(面试手撕命令)
1. 高频 kubectl 命令(必须熟练)
bash
# 查看资源
kubectl get pods -n 命名空间 # 查看 Pod
kubectl get deployments # 查看 Deployment
kubectl get services # 查看 Service
kubectl get pv/pvc # 查看持久化存储
# 查看详情(故障排查必备)
kubectl describe pod <pod-name> -n 命名空间 # 查看 Pod 详细信息(重点看 Events)
kubectl logs <pod-name> -n 命名空间 # 查看 Pod 日志
kubectl exec -it <pod-name> -n 命名空间 -- /bin/bash # 进入 Pod 容器
# 资源操作
kubectl apply -f <yaml-file> # 创建/更新资源
kubectl delete -f <yaml-file> # 删除资源
kubectl scale deployment <deployment-name> --replicas=3 # 扩缩容
kubectl rollout history deployment <deployment-name> # 查看更新历史
kubectl rollout undo deployment <deployment-name> # 回滚更新
2. 配置管理(ConfigMap/Secret)
- 问题:ConfigMap 和 Secret 的区别?如何使用? 答:
- ConfigMap:存储非敏感配置(如应用配置文件、环境变量);
- Secret:存储敏感信息 (如密码、Token、证书),数据会 Base64 编码(注意:Base64 不是加密,生产需配合加密插件)。使用方式:通过
env注入环境变量,或volumeMounts挂载为文件。
模块 4:故障排查(面试压轴题,考察实战能力)
1. 通用排查思路(面试必背)
1. 查看节点状态:kubectl get nodes → 确保节点 Ready
2. 查看 Pod 状态:kubectl get pods → 定位异常 Pod
3. 查看 Pod 详情:kubectl describe pod <pod-name> → 重点看 Events 字段(如镜像拉取失败、资源不足)
4. 查看 Pod 日志:kubectl logs <pod-name> → 看应用层错误
5. 查看组件日志:如 kubelet 日志(/var/log/kubelet.log)→ 排查节点级问题
2. 常见故障及解决方案
| 故障现象 | 排查方向 | 解决方案 |
|---|---|---|
| Pod 一直 Pending | 1. 资源不足;2. 调度策略冲突;3. 网络插件未安装 | 1. 扩容节点资源;2. 检查亲和性 / 污点配置;3. 安装网络插件 |
| Pod 一直 CrashLoopBackOff | 1. 应用代码错误;2. 配置错误;3. 健康检查失败 | 1. 查看应用日志;2. 检查 ConfigMap 配置;3. 调整健康检查参数 |
| Service 无法访问 Pod | 1. Label Selector 不匹配;2. Pod 网络不通;3. kube-proxy 异常 | 1. 检查 Service 和 Pod 的 Label;2. 验证 Pod 间通信;3. 重启 kube-proxy |
模块 5:实战场景(Java 微服务结合,后端面试重点)
1. 如何在 k8s 部署 SpringBoot 应用?
答:核心步骤:
- 编写 Dockerfile,将 SpringBoot 应用打包为镜像;
- 编写 Deployment YAML,指定镜像、资源限制、健康检查;
- 编写 Service YAML,暴露应用端口;
- 部署 Ingress,实现 HTTP 路由和负载均衡。
2. 如何实现微服务的灰度发布?
答:
- 方案 1:通过 Deployment 的 金丝雀发布,创建两个 Deployment(主版本 + 灰度版本),通过 Service 权重分配流量;
- 方案 2:使用 Istio 服务网格,实现更精细的流量控制(如按用户、按比例分流)。
三、面试加分项(体现技术深度)
- k8s 网络模型:理解 CNI 插件(Calico/Flannel)的原理,Pod 网络的通信流程(容器间 → Pod 间 → 跨节点 Pod 间)。
- 持久化存储:理解 PV/PVC 的生命周期,CSI 插件的作用,StatefulSet 如何实现数据持久化。
- 安全机制:RBAC 权限控制(Role/ClusterRole)、PodSecurityPolicy、镜像仓库认证。
- 云原生生态:了解 k8s 周边工具(如 Helm 包管理、Prometheus 监控、ArgoCD 持续部署)。
四、核心总结
- 搭建层面:学习用 Minikube,生产用 kubeadm,重点关注网络插件和高可用;
- 面试层面:核心概念是基础,组件原理是难点,故障排查是亮点,结合 Java 微服务是加分项;
- 学习建议:先实操部署应用,再深入原理,多做故障排查练习。