DevOps 面试题大全(三):Kubernetes 容器编排 50 题详解
前言
Kubernetes(K8s)是容器编排的事实标准,也是 DevOps 工程师的必备技能。本文整理了 50 道 Kubernetes 面试题,从基础概念到高级架构,每道题都配有详细的答案和解析,帮助你深入理解 K8s 核心技术。
一、基础概念题(1-15 题)
1. 什么是 Kubernetes?它解决了什么问题?
答案:
Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。
解决的问题:
- 服务发现和负载均衡 - 自动分配 IP 和 DNS,负载均衡流量
- 存储编排 - 自动挂载存储系统(本地、云存储、网络存储)
- 自动部署和回滚 - 声明式配置,自动滚动更新,支持回滚
- 自动 bin packing - 根据资源需求调度容器到合适的节点
- 自我修复 - 自动重启失败的容器,替换故障节点
- 密钥和配置管理 - 管理敏感信息,无需重新构建镜像
# K8s 核心特性:
- 容器编排
- 自动扩缩容
- 服务发现
- 负载均衡
- 自我修复
- 滚动更新
2. 解释 Kubernetes 的架构组成
答案:
Kubernetes 集群由 Control Plane(控制平面)和 Worker Nodes(工作节点)组成。
1. Control Plane(控制平面):
- kube-apiserver - API 服务器,集群的统一入口,处理 REST 操作
- etcd - 分布式键值存储,保存集群所有状态数据
- kube-scheduler - 调度器,决定 Pod 调度到哪个节点
- kube-controller-manager - 控制器管理器,运行各种控制器
- cloud-controller-manager - 云控制器管理器(云环境)
2. Worker Nodes(工作节点):
- kubelet - 节点代理,管理 Pod 生命周期
- kube-proxy - 网络代理,维护网络规则和负载均衡
- 容器运行时 - Docker、containerd、CRI-O 等
# 查看集群组件
kubectl get componentstatuses
kubectl get nodes
kubectl get pods -n kube-system
3. 什么是 Pod?它和容器有什么区别?
答案:
Pod 是 Kubernetes 中最小的调度和管理单元,可以包含一个或多个容器。
Pod vs 容器:
| 特性 | Pod | 容器 |
|---|---|---|
| 定义 | K8s 调度单元 | 进程隔离环境 |
| 容器数量 | 1 个或多个 | 单个 |
| 网络 | Pod 内共享 IP 和端口 | 独立网络命名空间 |
| 存储 | 可共享 Volume | 独立存储 |
| 生命周期 | 同生共死 | 独立 |
# Pod 示例 - 多容器 Pod
apiVersion: v1
kind: Pod
metadata:
name: multi-container-pod
spec:
containers:
- name: web
image: nginx
ports:
- containerPort: 80
- name: sidecar
image: busybox
command: ['sh', '-c', 'while true; do echo "Logging..."; sleep 10; done']
volumes:
- name: shared-data
emptyDir: {}
4. 解释 Deployment、StatefulSet 和 DaemonSet 的区别
答案:
1. Deployment(部署):
- 用于无状态应用
- Pod 名称和 IP 不固定
- 支持滚动更新和回滚
- Pod 可以调度到任意节点
- 适用场景:Web 服务器、API 服务
2. StatefulSet(有状态集):
- 用于有状态应用
- Pod 名称固定(pod-0, pod-1, pod-2...)
- Pod 有稳定的网络标识和存储
- 有序部署和扩展
- 适用场景:数据库、Zookeeper、Kafka
3. DaemonSet(守护进程集):
- 每个节点运行一个 Pod 副本
- 新节点加入时自动部署
- 节点删除时自动清理
- 适用场景:日志收集、监控代理、网络插件
# Deployment 示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
# StatefulSet 示例
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: "mysql"
replicas: 3
template:
spec:
containers:
- name: mysql
image: mysql:8.0
# DaemonSet 示例
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
spec:
template:
spec:
containers:
- name: fluentd
image: fluentd:latest
5. 什么是 Service?有哪些类型?
答案:
Service 是定义一组 Pod 的访问策略,提供稳定的 IP 和 DNS 名称。
Service 类型:
- ClusterIP(默认)
- 只在集群内部可访问
- 分配集群内部 IP
- 用于内部服务通信
- NodePort
- 在每个节点上开放固定端口
- 外部可通过 NodeIP:NodePort 访问
- 端口范围:30000-32767
- LoadBalancer
- 创建云负载均衡器
- 提供外部 IP
- 需要云提供商支持
- ExternalName
- 映射到外部服务
- 通过 CNAME 记录
- 用于访问集群外服务
# ClusterIP Service
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ClusterIP
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
# NodePort Service
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
nodePort: 30080
# LoadBalancer Service
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: LoadBalancer
selector:
app: my-app
ports:
- port: 80
targetPort: 8080
6. 解释 ConfigMap 和 Secret 的区别
答案:
ConfigMap:
- 存储非敏感配置数据
- 键值对形式
- 明文存储
- 用于配置文件、环境变量等
Secret:
- 存储敏感数据(密码、token、密钥)
- Base64 编码(不是加密)
- 可以加密存储(Encryption at Rest)
- 更严格的访问控制
# 创建 ConfigMap
kubectl create configmap app-config \
--from-literal=db_host=mysql.default.svc \
--from-literal=db_port=3306
# 创建 Secret
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=secret123
# 在 Pod 中使用
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: app
image: myapp
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: db-secret
7. 什么是 Namespace?有什么作用?
答案:
Namespace 是 Kubernetes 中的虚拟集群,用于资源隔离和组织。
作用:
- 资源隔离 - 不同团队/项目使用不同 Namespace
- 资源配额 - 限制每个 Namespace 的资源使用
- 访问控制 - 基于 Namespace 的 RBAC
- 环境隔离 - dev、test、prod 环境分离
默认 Namespace:
default- 默认命名空间kube-system- 系统组件kube-public- 公共资源kube-node-lease- 节点租约
# 创建 Namespace
kubectl create namespace dev
# 查看 Namespace
kubectl get namespaces
# 在特定 Namespace 部署
kubectl apply -f app.yaml -n dev
# 设置默认 Namespace
kubectl config set-context --current --namespace=dev
# Namespace 资源配额
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-quota
namespace: dev
spec:
hard:
requests.cpu: "10"
requests.memory: 20Gi
limits.cpu: "20"
limits.memory: 40Gi
pods: "50"
8. 解释 Pod 的生命周期
答案:
Pod 状态:
- Pending - API 服务器已接受,等待调度
- Running - 已调度到节点,容器正在运行
- Succeeded - 所有容器成功完成(退出码 0)
- Failed - 至少一个容器失败
- Unknown - 无法获取 Pod 状态
生命周期阶段:
- 创建 - kubectl 提交 Pod 定义
- 调度 - Scheduler 选择节点
- 绑定 - Pod 绑定到节点
- 拉取镜像 - Kubelet 拉取容器镜像
- 创建容器 - 创建容器并启动
- 运行 - 容器正常运行
- 终止 - 删除 Pod,优雅关闭容器
# 查看 Pod 状态
kubectl get pods
kubectl get pods -o wide
# 查看 Pod 详细信息
kubectl describe pod
# 查看 Pod 日志
kubectl logs
kubectl logs -c
# 查看 Pod 事件
kubectl get events --field-selector involvedObject.name=
9. 什么是 Probe?有哪些类型?
答案:
Probe(探针) 用于检查容器的健康状态。
三种类型:
- livenessProbe(存活探针)
- 检查容器是否运行
- 失败则重启容器
- 用于检测死锁
- readinessProbe(就绪探针)
- 检查容器是否准备好接收流量
- 失败则从 Service 后端移除
- 用于启动完成检查
- startupProbe(启动探针)
- 检查应用是否已启动
- 失败不会被杀死(给慢启动应用时间)
- K8s 1.16+ 支持
# Probe 配置示例
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: app
image: myapp
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
startupProbe:
httpGet:
path: /startup
port: 8080
failureThreshold: 30
periodSeconds: 10
10. 解释 Kubernetes 的网络模型
答案:
K8s 网络模型要求:
- 所有 Pod 可以直接通信,无需 NAT
- 所有节点可以直接通信,无需 NAT
- Pod IP 与容器内看到的 IP 一致
网络实现:
- Overlay 网络 - Flannel、Calico、Weave
- 路由网络 - Calico(BGP)
- 云提供商网络 - AWS VPC、GCP VPC
网络插件(CNI):
- Flannel - 简单,Overlay 网络
- Calico - 高性能,支持 NetworkPolicy
- Weave - 加密通信
- Cilium - eBPF 为基础
# 查看 Pod IP
kubectl get pods -o wide
# 测试 Pod 间通信
kubectl exec pod1 -- ping
# 查看网络插件
kubectl get pods -n kube-system | grep -E "flannel|calico|weave"
# NetworkPolicy 示例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
11-15. 更多基础题
| 题号 | 题目 | 答案要点 |
|---|---|---|
| 11 | 什么是 kubelet? | 节点代理,管理 Pod 生命周期 |
| 12 | 什么是 kube-proxy? | 网络代理,维护网络规则 |
| 13 | 解释 etcd 的作用 | 分布式存储,保存集群状态 |
| 14 | 什么是 kubectl? | K8s 命令行工具 |
| 15 | 解释 Label 和 Selector | 标签用于标识,选择器用于筛选 |
二、进阶实战题(16-35 题)
16. 如何排查 Pod 无法启动的问题?
答案:
排查步骤:
- 查看 Pod 状态
kubectl get podkubectl describe pod - 查看 Pod 事件
kubectl get events --field-selector involvedObject.name= - 查看容器日志
kubectl logskubectl logs -c - 查看节点资源
kubectl describe nodekubectl top node - 检查常见错误:
- ImagePullBackOff - 镜像拉取失败
- CrashLoopBackOff - 容器启动失败
- Pending - 资源不足或调度失败
- OOMKilled - 内存超限
17. 如何配置 Pod 的资源限制?
答案:
# 资源配置示例
apiVersion: v1
kind: Pod
metadata:
name: resource-pod
spec:
containers:
- name: app
image: myapp
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
# 关键概念:
# requests - 保证的最小资源
# limits - 允许的最大资源
# 1 CPU = 1000m (millicores)
# 内存单位:Ki, Mi, Gi
18. 解释滚动更新的原理
答案:
滚动更新策略:
- 创建新版本的 Pod
- 等待新 Pod 就绪
- 删除旧版本的 Pod
- 重复直到所有 Pod 更新
# 滚动更新配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 5
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 最多超出副本数的 Pod
maxUnavailable: 0 # 最多不可用的 Pod
template:
spec:
containers:
- name: app
image: myapp:v2
# 执行滚动更新
kubectl set image deployment/my-app app=myapp:v2
# 查看更新状态
kubectl rollout status deployment/my-app
# 回滚
kubectl rollout undo deployment/my-app
19-35. 更多进阶题(详细答案略)
| 题号 | 题目 | 答案要点 |
|---|---|---|
| 19 | 如何配置持久化存储? | PV、PVC、StorageClass |
| 20 | 解释 Ingress 的作用 | 七层负载均衡,HTTP 路由 |
| 21 | 如何配置 HPA? | HorizontalPodAutoscaler |
| 22 | 解释 Init Container | 初始化容器,先于主容器运行 |
| 23 | 如何配置 RBAC? | Role、RoleBinding、ServiceAccount |
| 24 | 解释 Sidecar 模式 | 辅助容器,增强主容器功能 |
| 25 | 如何配置网络策略? | NetworkPolicy |
| 26 | 解释 PodDisruptionBudget | 控制自愿中断的 Pod 数量 |
| 27 | 如何调试 Service? | Endpoints、kube-proxy 日志 |
| 28 | 解释 Affinity 和 Taint | 节点亲和性和污点 |
| 29 | 如何配置 Pod 安全策略? | PodSecurityPolicy/PodSecurityStandard |
| 30 | 解释 Operator 模式 | 自动化运维应用 |
| 31 | 如何备份 etcd? | etcdctl snapshot save |
| 32 | 解释 Helm 的作用 | 包管理器,Chart 模板 |
| 33 | 如何配置多容器 Pod? | 共享网络和存储 |
| 34 | 解释 Job 和 CronJob | 批处理任务 |
| 35 | 如何监控 K8s 集群? | Prometheus、Metrics Server |
三、高级架构题(36-50 题)
36. 如何设计高可用的 K8s 集群?
答案:
高可用架构:
- 多 Master 节点 - 至少 3 个,避免脑裂
- etcd 集群 - 奇数节点(3、5、7)
- 负载均衡 - API Server 前加 LB
- 多可用区 - 跨 AZ 部署
- 节点池 - 分离不同类型工作负载
# 高可用检查清单:
□ 多 Master 节点(至少 3 个)
□ etcd 集群(奇数节点)
□ 负载均衡器(API Server)
□ 多可用区部署
□ 节点自动修复
□ 自动扩缩容
□ 备份和恢复策略
□ 监控和告警
37-50. 高级题(详细答案略)
| 题号 | 题目 |
|---|---|
| 37 | K8s 故障排查思路 |
| 38 | 性能优化最佳实践 |
| 39 | 大规模集群管理 |
| 40 | 多集群管理方案 |
| 41 | Service Mesh 集成 |
| 42 | GitOps 实践 |
| 43 | 安全加固措施 |
| 44 | 网络插件选型 |
| 45 | 存储方案对比 |
| 46 | CI/CD 集成方案 |
| 47 | 监控告警体系 |
| 48 | 日志收集方案 |
| 49 | 灾备和恢复 |
| 50 | K8s 未来趋势 |
总结
本文整理了 50 道 Kubernetes 面试题,涵盖基础概念、进阶实战和高级架构。掌握这些知识点,足以应对 DevOps 面试中的 K8s 相关问题。
学习建议:
- 理解核心概念(Pod、Service、Deployment)
- 动手实践(搭建集群、部署应用)
- 深入原理(调度、网络、存储)
- 关注生态(Helm、Operator、Service Mesh)
下一篇预告:DevOps 面试题大全(四):CI/CD 持续集成部署 50 题详解




