云原生面试核心知识点

按面试高频度排序,结合原理深度,.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 ⭐⭐⭐⭐

维度ConfigMapSecret
用途 普通配置(明文) 敏感信息(密钥/证书)
大小限制 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 对比 ⭐⭐⭐⭐

维度LogsMetricsTracing
工具 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 先于主容器启动且顺序执行

八、面试加分项(能讲出来稳过)

  1. 讲清 K8s 调谐循环:观测 → diff → 修正(Controller模式)
  2. 知道 kubectl rollout 机制:底层是 ReplicaSet 版本切换
  3. 理解 HPA 原理:基于 metrics-server → 每15s 计算 → 调整 replicas
  4. Pod 调度流程:Scheduler过滤(Predicate)→ 打分(Priority)→ 绑定
  5. 声明式 vs 命令式:kubectl apply(声明式,会自己调谐)vs kubectl create(命令式,一次性)
  6. 资源 Request/Limit:QoS 三档(Guaranteed/Burstable/BestEffort),OOM 优先级---
posted @ 2026-09-09 09:22  无聊的蚂蚁  阅读(39)  评论(0)    收藏  举报