作为云原生时代的核心技术栈,Kubernetes已经成为运维工程师和架构师的必备技能。我在过去三年面试过上百位K8s相关岗位候选人,发现大多数人在准备面试时存在两个误区:要么死记硬背概念缺乏深度理解,要么只关注命令操作而忽视设计原理。本文将基于真实面试场景,系统梳理K8s知识体系,带你建立结构化认知框架。
面试官常以"请用通俗语言解释K8s"作为开场问题。最佳回答应包含三个层次:
注意:避免直接背诵官方定义。我曾遇到候选人机械回答"K8s是CNCF项目",却说不清它具体解决了什么问题。建议用"以前运维怎么做→现在K8s如何改进"的对比方式阐述。
这是K8s区别于传统运维工具的核心特征,需要理解其背后的工程思想:
yaml复制# 传统命令式操作(Imperative):
kubectl run nginx --image=nginx:1.14
# 声明式操作(Declarative):
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
template:
spec:
containers:
- name: nginx
image: nginx:1.14
关键差异在于:
K8s通过API对象对基础设施进行抽象,常见误解是混淆不同资源类型:
我曾让候选人画图说明这些对象的关系,优秀回答通常会标注出控制循环(如Deployment→ReplicaSet→Pod的级联关系)。
面试中经常要求解释组件交互流程,建议从客户端请求视角说明:
常见陷阱问题:"etcd存储了什么数据?"正确答案应包括:
作为节点上的"超级管家",kubelet的功能常被低估。在面试中可突出以下要点:
实操建议:遇到"kubelet无法启动容器"的问题时,按以下顺序排查:
bash复制# 查看kubelet日志
journalctl -u kubelet -n 100
# 检查容器运行时状态
crictl ps -a
# 验证镜像拉取权限
crictl pull nginx:latest
这是生产环境必须掌握的配置项,但80%的候选人存在理解偏差:
yaml复制resources:
requests:
cpu: "500m" # 0.5核,调度依据
memory: "1Gi" # 最小保障资源
limits:
cpu: "2" # 硬上限,超过会被throttle
memory: "4Gi" # 超过会被OOM kill
关键知识点:
常见误区:认为CPU limits应该总是设置。实际上对于延迟敏感型应用(如交易系统),建议只设requests避免CPU节流。
Horizontal Pod Autoscaler的考核重点在于指标选择和算法理解:
yaml复制apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
spec:
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
minReplicas: 2
maxReplicas: 10
扩缩容行为取决于:
实战技巧:对于突发流量场景,可结合KEDA使用自定义指标(如RabbitMQ队列长度)实现快速扩容。
这是面试最高频的难点问题,需要分层次解释:
ClusterIP原理:
DNS服务发现:
<service>.<ns>.svc.cluster.local解析网络策略实践:
yaml复制apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
spec:
podSelector:
matchLabels:
role: db
ingress:
- from:
- podSelector:
matchLabels:
role: app
ports:
- protocol: TCP
port: 5432
该策略只允许带有role=app标签的Pod访问5432端口。
常见面试题:"Nginx Ingress与Traefik如何选型?"可从以下维度分析:
| 特性 | Nginx Ingress | Traefik |
|---|---|---|
| 配置热更新 | 需要reload | 动态生效 |
| 协议支持 | HTTP/gRPC | 支持HTTP/2、gRPC、TCP |
| 监控集成 | 需配置Prometheus | 内置Metrics |
| 适用场景 | 传统Web应用 | 云原生微服务 |
生产环境建议:流量稳定的传统应用用Nginx,需要频繁变更路由规则的选择Traefik。
存储管理常让初学者困惑,可用"租房模型"类比:
典型问题:"PVC一直处于Pending状态怎么办?"
排查步骤:
bash复制kubectl get storageclass
bash复制kubectl describe pvc myclaim
有状态应用的存储需要特别注意:
yaml复制volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "ssd"
resources:
requests:
storage: 100Gi
关键特性:
<claim>-<pod>)资深K8s工程师的排查流程:
bash复制kubectl get pods -o wide
kubectl describe pod <name>
bash复制kubectl logs -f <pod> -c <container>
bash复制kubectl exec -it <pod> -- sh
bash复制kubectl debug node/<name> -it --image=busybox
收集的常见生产环境问题:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| Pod一直CrashLoopBackOff | 应用启动失败/健康检查不通过 | 查看日志调整探针参数 |
| Service无法访问 | 标签选择器不匹配 | 检查svc的selector与pod标签 |
| Node处于NotReady状态 | kubelet进程异常 | 重启kubelet检查证书有效期 |
| PVC绑定失败 | 无可用PV或StorageClass错误 | 创建合适PV或设置默认StorageClass |
这是K8s高级开发的必备技能,核心要点:
面试时可要求解释Operator的工作流程:
RBAC是安全领域的必问题目:
yaml复制apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
- kind: User
name: dev-user
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
该配置允许dev-user用户在default命名空间读取Pod信息。
面试官常考察系统设计能力,例如:"如何零停机升级生产集群?"
标准答案应包含:
分享一个真实优化经验更能体现价值:
"某次API响应变慢排查发现:
最后给准备K8s面试的工程师三个实用建议:
我在技术评审中最看重的不是候选人知道多少命令,而是能否建立系统化的知识框架,以及遇到未知问题时的排查思路。建议用本文的分类体系作为学习路线图,逐层深入掌握K8s核心能力。