Docker/K8s 面试题
2026/1/15大约 3 分钟
Docker/K8s 面试题
Docker 基础
1. Docker 和虚拟机的区别?
| 特性 | Docker | 虚拟机 |
|---|---|---|
| 虚拟化层级 | 操作系统级 | 硬件级 |
| 启动速度 | 秒级 | 分钟级 |
| 资源占用 | MB级 | GB级 |
| 性能 | 接近原生 | 有损耗 |
| 隔离性 | 进程级隔离 | 完全隔离 |
| 镜像大小 | 小(共享内核) | 大(完整OS) |
2. Docker 镜像分层原理?
- 镜像由多个只读层组成
- 每条 Dockerfile 指令创建一层
- 容器运行时在顶部添加可写层
- 层之间使用 Union FS 联合挂载
- 相同层可被多个镜像共享,节省空间
3. COPY 和 ADD 的区别?
| 指令 | 功能 |
|---|---|
| COPY | 仅复制本地文件 |
| ADD | 支持 URL 下载、自动解压 tar |
推荐使用 COPY,更明确、可预测。
4. CMD 和 ENTRYPOINT 的区别?
# CMD 可被 docker run 参数覆盖
CMD ["echo", "hello"]
# ENTRYPOINT 不可覆盖,CMD 作为参数
ENTRYPOINT ["echo"]
CMD ["hello"]5. Docker 网络模式有哪些?
- bridge:默认模式,通过虚拟网桥通信
- host:使用宿主机网络
- none:无网络
- overlay:跨主机通信
- macvlan:容器拥有独立 MAC
6. 如何减小 Docker 镜像大小?
- 使用轻量基础镜像(alpine)
- 多阶段构建
- 合并 RUN 命令
- 清理缓存和临时文件
- 使用 .dockerignore
FROM maven:3.8-openjdk-11 AS builder
WORKDIR /app
COPY . .
RUN mvn clean package -DskipTests
FROM openjdk:11-jre-slim
COPY --from=builder /app/target/*.jar app.jar
CMD ["java", "-jar", "app.jar"]Kubernetes 基础
7. K8s 核心组件及作用?
Master 组件:
- API Server:集群入口,处理 REST 请求
- Scheduler:调度 Pod 到合适的 Node
- Controller Manager:管理各种控制器
- etcd:分布式存储,保存集群状态
Node 组件:
- Kubelet:管理 Node 上的 Pod
- Kube-proxy:实现 Service 网络代理
- Container Runtime:容器运行时(Docker/containerd)
8. Pod 的生命周期?
Pending → Running → Succeeded/Failed
↓
Unknown- Pending:等待调度或拉取镜像
- Running:至少一个容器运行中
- Succeeded:所有容器成功退出
- Failed:至少一个容器失败退出
- Unknown:无法获取状态
9. Service 类型有哪些?
| 类型 | 说明 |
|---|---|
| ClusterIP | 默认,集群内部访问 |
| NodePort | 通过 Node IP:Port 访问 |
| LoadBalancer | 云厂商负载均衡器 |
| ExternalName | 映射外部服务 |
10. Deployment 和 StatefulSet 的区别?
| 特性 | Deployment | StatefulSet |
|---|---|---|
| Pod 名称 | 随机后缀 | 固定序号(0,1,2) |
| 存储 | 共享 PVC | 每个 Pod 独立 PVC |
| 启动顺序 | 并行 | 顺序启动 |
| 适用场景 | 无状态应用 | 有状态应用(数据库) |
11. 如何实现滚动更新?
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 最多超出副本数
maxUnavailable: 0 # 最多不可用数# 更新镜像
kubectl set image deployment/app app=app:v2
# 查看状态
kubectl rollout status deployment/app
# 回滚
kubectl rollout undo deployment/app12. Pod 调度策略有哪些?
- nodeSelector:简单标签选择
- nodeAffinity:节点亲和性
- podAffinity/podAntiAffinity:Pod 亲和/反亲和
- taints/tolerations:污点和容忍
spec:
nodeSelector:
disktype: ssd
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: zone
operator: In
values: ["zone-a"]13. 如何实现配置和密钥管理?
- ConfigMap:存储非敏感配置
- Secret:存储敏感数据(base64 编码)
# 使用方式
env:
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: db_host
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password14. K8s 网络模型?
- 每个 Pod 有独立 IP
- Pod 间可直接通信(无需 NAT)
- Node 上的代理可访问所有 Pod
- 通过 CNI 插件实现(Calico、Flannel)
15. 如何排查 Pod 问题?
# 查看 Pod 状态
kubectl get pods
kubectl describe pod <pod-name>
# 查看日志
kubectl logs <pod-name>
kubectl logs <pod-name> -c <container-name>
# 进入容器
kubectl exec -it <pod-name> -- /bin/sh
# 查看事件
kubectl get events --sort-by='.lastTimestamp'实战问题
16. 如何实现零停机部署?
- 配置健康检查(readinessProbe)
- 使用滚动更新策略
- 设置 maxUnavailable: 0
- 配置 preStop 钩子优雅关闭
spec:
containers:
- name: app
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 10"]17. 如何实现 HPA 自动伸缩?
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 7018. 如何限制资源使用?
# Pod 级别
resources:
requests:
cpu: "250m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
# Namespace 级别
apiVersion: v1
kind: ResourceQuota
metadata:
name: quota
spec:
hard:
requests.cpu: "10"
limits.memory: "20Gi"
pods: "50"