云原生面试核心知识点
按面试高频度排序,结合原理深度,.NET 背景额外标注。
一、容器篇(Docker)
1.镜像分层原理 ⭐⭐⭐
plaintext
镜像 = 只读层(UnionFS:AUFS/OverlayFS)
容器 = 镜像层 + 读写层(容器层)
写时复制(CoW):修改文件时才复制到读写层
面试题:为什么 Docker 镜像要分层?答:复用、加速构建分发、节省磁盘。
2. Dockerfile 优化 ⭐⭐⭐
| 指令 | 坑 | 最佳实践 |
|---|---|---|
FROM |
镜像过大 | 用 alpine 或 distroless,.NET 选 mcr.microsoft.com/dotnet/aspnet:8.0-alpine |
RUN |
每条 RUN 产生一层 | 合并命令 + 清理缓存 |
COPY |
复制无关文件 | 用 .dockerignore + 多阶段构建 |
ENTRYPOINT |
shell 模式吞信号 | 用 exec 模式 ["dotnet","app.dll"],否则 SIGTERM 杀不掉容器 |
3. 多阶段构建(.NET 必备)
dockerfile
# 构建阶段
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY . . && RUN dotnet publish -c Release -o /app
# 运行阶段
FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine
COPY --from=build /app /app
ENTRYPOINT ["dotnet", "app.dll"]
效果:镜像从 ~600MB → ~100MB
二、Kubernetes 篇(核心重头戏)
4. K8s 架构 ⭐⭐⭐⭐⭐
plaintext
┌─────────────── Control Plane ───────────────┐
│ API Server ← kubectl / dashboard │
│ Scheduler ← 决策 Pod放哪个 Node │
│ Controller Manager ← 调谐(巡检+修正) │
│ etcd ← 唯一持久化存储(K/V) │
└──────────────────────────────────────────────┘┌─────────────── Worker Node ───────────────┐
│ kubelet ← 节点代理,管理 Pod │
│ kube-proxy ← 维护 iptables/IPVS 规则 │
│ Container Runtime ← containerd/CRI-O │
└──────────────────────────────────────────────┘
5. Pod 生命周期 ⭐⭐⭐⭐⭐
plaintext
Pending → Running → (Ready/NotReady) → Succeeded/Failed
↓ CrashLoopBackOff(最常问!)
面试题:Pod 一直 CrashLoopBackOff 怎么排查?
plaintext
kubectl describe pod → 看 Events(镜像拉取失败/端口冲突/启动命令错)
kubectl logs --previous → 看上次容器日志
kubectl exec -it ... -- /bin/sh →调试
6. Deployment滚动更新 ⭐⭐⭐⭐⭐
plaintext
v1 (3副本) → 滚动 → v2 (3副本)
策略:
maxSurge: 25% (最多可超出的副本数)
maxUnavailable: 25% (最多不可用副本数)
回滚:kubectl rollout undo deployment/v1
7. Service 三种类型 ⭐⭐⭐⭐
| 类型 | 作用 | 场景 |
|---|---|---|
| ClusterIP | 集群内部访问 | 微服务间调用 |
| NodePort | 节点端口暴露 | 测试/内网 |
| LoadBalancer | 云厂商负载均衡 | 生产环境 |
| ExternalName | DNS 别名 | 跨集群访问 |
8. 核心资源对比 ⭐⭐⭐⭐| 维度 | Deployment | StatefulSet | DaemonSet |
|---|---|---|---|
| 场景 | 无状态服务 | 有状态(DB、MQ) | 节点级守护(监控Agent) |
| Pod 名 | 随机 | 稳定(pod-0, pod-1) | 节点名 |
| 网络 | 随机 | 稳定 DNS | 节点级 |
| 存储 | 共享 | 每Pod独立 PVC | 节点本地 |
三、网络与存储篇
9. K8s 网络模型 ⭐⭐⭐⭐
plaintext
1. Pod 内:lo(容器间共享网络命名空间)
2. Pod 间:CNI插件(Flannel/Calico)
3. Pod → Service:iptables/IPVS
4. 外部 → Service:Ingress
面试题:同一 Pod 内容器如何通信?答:共享 Network Namespace,直接 localhost:port。
10. ConfigMap vs Secret ⭐⭐⭐⭐
| 维度 | ConfigMap | Secret |
|---|---|---|
| 用途 | 普通配置(明文) | 敏感信息(密钥/证书) |
| 大小限制 | 1MB | 1MB |
| 挂载方式 | env / volume | env / volume |
| 注意 | 改了要重启 Pod(不会自动热加载) | base64 编码 ≠ 加密!生产用 External Secrets |
你之前的硬编码痛点:XOR 密钥直接走 Secret + Volume 挂载到 /app/config/secrets.json,告别代码硬编码。
11. PV/PVC 存储 ⭐⭐⭐
plaintext
PV(PersistentVolume):集群级存储资源
PVC(PersistentVolumeClaim):Pod 的存储申请
StorageClass:动态供给(NFS/Ceph/云盘)
访问模式:RWO(单节点)/ RWX(多节点)/ RO(只读)
四、CI/CD & GitOps
12. GitOps 核心 ⭐⭐⭐⭐⭐
plaintext
传统 CI/CD:push → Jenkins → 部署
GitOps: push → Git Repo → ArgoCD 检测 → 自动同步到 K8s
工具链:ArgoCD / Flux
优势:
1. 集群状态由 Git 定义(声明式)
2. 任何变更可审计、可回滚(git revert)
3. 环境一致性(开发/测试/生产用同一份 manifest)
五、可观测性(三大支柱)
13. Logs / Metrics / Tracing 对比 ⭐⭐⭐⭐
| 维度 | Logs | Metrics | Tracing |
|---|---|---|---|
| 工具 | Loki/ELK | Prometheus+Grafana | Tempo/Jaeger |
| 数据 | 离散事件 | 数值时间序列 | 请求链路 |
| 查询 | 全文搜索 | PromQL | Trace ID |
| 成本 | 高(全文索引) | 低(采样聚合) | 中(采样率决定) |
| .NET | Serilog → Loki | AddMetrics() + OpenTelemetry |
OpenTelemetry .NET |
面试题:三个能互相替代吗?答:不能,定位不同问题用不同支柱。
六、.NET 云原生专项### 15. .NET 8 在云原生的优势 ⭐⭐⭐⭐
- NativeAOT:编译为原生二进制,启动<50ms,镜像<10MB(无 JIT)
- Minimal API:替代 MVC,更轻量
- .NET Aspire:⭐⭐⭐⭐⭐ 微软官方云原生编排框架(2024 发布),统一服务发现/可观测性/部署
- 容器内置:
dotnet publish自动生成Dockerfile(/t:PublishContainer=true) - 环境变量优先:
ASPNETCORE_URLS覆盖监听地址
16. .NET 8 K8s 部署清单 ⭐⭐⭐
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: gbes-api
spec:
replicas: 3
selector: { matchLabels: { app: gbes-api } }
template:
metadata:
labels: { app: gbes-api }
spec:
containers:
- name: api
image: registry.cn-hangzhou.aliyuncs.com/gbes/api:v1
ports: [{ containerPort: 8080 }]
envFrom:
- configMapRef: { name: gbes-config }
- secretRef: { name: gbes-secrets }
readinessProbe:
httpGet: { path: /healthz, port: 8080 }
resources:
requests: { cpu: 100m, memory: 128Mi }
limits: { cpu: 500m, memory: 512Mi }
七、高频对比题(面试最爱问)
| 对比 | 核心答案 |
|---|---|
| 容器 vs 虚拟机 | 容器共享内核、秒级启动、MB级;VM独占内核、分钟级启动、GB级 |
| K8s vs Swarm | K8s 生态强、复杂度高;Swarm 简单、已弃用 |
| Deployment vs StatefulSet | 前者无状态随机Pod名;后者有状态稳定标识 |
| ConfigMap vs Secret | 前者明文配置;后者敏感信息(base64 非加密) |
| Service vs Ingress | Service 是集群内4层负载均衡;Ingress 是7层HTTP路由 |
| Job vs CronJob | Job 一次性;CronJob 定时(K8s Cron表达式) |
| Liveness vs Readiness | Liveness 失败 → 重启Pod;Readiness 失败 → 摘流量(不重启) |
| Docker Compose vs K8s | Compose 单机开发;K8s集群生产 |
| ArgoCD vs Flux | ArgoCD 有UI;Flux 纯CLI、GitOps 工具链标准 |
| Sidecar vs Init Container | Sidecar 与主容器并行运行(如 Istio Proxy);Init 先于主容器启动且顺序执行 |
八、面试加分项(能讲出来稳过)
- 讲清 K8s 调谐循环:
观测 → diff → 修正(Controller模式) - 知道
kubectl rollout机制:底层是 ReplicaSet 版本切换 - 理解 HPA 原理:基于 metrics-server → 每15s 计算 → 调整 replicas
- Pod 调度流程:Scheduler过滤(Predicate)→ 打分(Priority)→ 绑定
- 声明式 vs 命令式:kubectl apply(声明式,会自己调谐)vs kubectl create(命令式,一次性)
- 资源 Request/Limit:QoS 三档(Guaranteed/Burstable/BestEffort),OOM 优先级---

浙公网安备 33010602011771号