FDE Training · Module 02
02
云原生与基础设施
模块 02 · 云原生与基础设施部署
本章目标:掌握"客户现场交付"的核心能力——把装好的东西真正跑起来、连起来、升级起来、出问题能救回来。这是 FDE 和高谈阔论者最大的区别:你能上手把环境端起来。
2.1 云平台(至少精通一个)
2.1.1 挑一个,别贪多
- AWS / Azure / 阿里云 / 腾讯云,精通一个,其他约等于换皮。
- 所谓"精通",最低标准是能回答这 5 件套:
| 名词 | 一句话人话 |
|---|---|
| VPC | 你的私有网络,隔离的"小区" |
| 安全组 | 小区进出门口的名册,谁放行谁拦截 |
| IAM | 车钥匙分配系统,决定谁能用哪个车的哪个功能 |
| 对象存储(S3/OSS) | 无限大的文件仓库,放文档、图片、模型切片 |
| KMS | 保险箱,存加密钥匙,别人拿不到明文 |
2.1.2 客户现场最常见的坑(提前知道)
- 客户云环境和你的测试云环境网络不通:先看安全组/网络 ACL/对等连接/白名单。
- IAM 权限太细:客户给的最小权限经常"够看不够用",要提前要全一点。
- 对象存储权限:私有桶默认不能公网读,接口要带签名。
2.2 Docker:把服务打包成"一键可跑"
2.2.1 一个像样的 Dockerfile
# 多阶段构建:小镜像、跑得快
FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages
COPY . .
ENV PYTHONUNBUFFERED=1
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8080"]
要点:用基础镜像、分层缓存、non-root 用户、小体积;别 COPY . . 一把梭把 token 打进镜像。
2.2.2 命令行必须熟练
docker build -t my-app:v1 .
docker run -d -p 8080:8080 --name review my-app:v1
docker logs -f review
docker exec -it review bash # 进容器排障
docker ps -a # 看容器和状态(Exited/OOM)
docker compose up -d # 多服务一把起
2.2.3 容器安全底线
- 不用 root 运行:
USER appuser。 - 不把密钥写进镜像:用环境变量/挂载/KMS。
- 定期更新基础镜像,扫描漏洞(trivy 等)。
- 理解镜像层:每层是一层叠,别放敏感信息。
2.3 Kubernetes(K8s):能写 yaml、能排障
2.3.1 一个最小的 Deployment + 健康检查
apiVersion: apps/v1
kind: Deployment
metadata:
name: review-api
labels: { app: review-api }
spec:
replicas: 2
selector:
matchLabels: { app: review-api }
template:
metadata:
labels: { app: review-api }
spec:
containers:
- name: review-api
image: my-registry/review-api:v1.2.3
ports: [ { containerPort: 8080 } ]
resources:
requests: { cpu: "500m", memory: "512Mi" }
limits: { cpu: "1000m", memory: "1Gi" }
livenessProbe:
httpGet: { path: /api/health, port: 8080 }
initialDelaySeconds: 5
periodSeconds: 10
记牢这四个词:Pod(最小单位)、Deployment(管理副本)、Service(统一入口)、ConfigMap/Secret(配置与密钥)。
2.3.2 排障三连(忘掉重装,先看状态)
kubectl get pods # 看 Pod 状态(Pending/CrashLoop/OOM)
kubectl describe pod <name> # 看事件、资源、被拒原因
kubectl logs -f <name> --previous # 看崩溃前一次日志
kubectl exec -it <name> -- sh # 进容器看环境
常见三问三答:
- Pending:资源不够 / nodeSelector 匹配不上 / PVC 起不来。
- ErrorImagePull:镜像地址错 / 私有仓库没配 secret / 标签不存在。
- CrashLoopBackOff + OOMKilled:内存超限,调
limits或应用本身内存泄漏。
2.3.3 网络策略 & 资源限制
- 网络策略(NetworkPolicy):默认最小放开,只允许需要的服务互相访问。
- 资源限制(requests/limits):一定要设,否则一个模型服务能吃掉整台机器。
2.4 IaC:基础设施即代码(可复现客户环境)
- Terraform / CloudFormation:把"机器、网络、存储"用代码声明,客户环境能一键重建、能 review、能审计。
- 为什么 FDE 要学:你不想在客户那边手点半小时控制台造环境;写一份 tf,所有环境一致。
# example.tf(示意)
resource "aws_instance" "review_app" {
ami = "ami-xxxxx"
instance_type = "t3.medium"
security_groups = [aws_security_group.app_sg.name]
tags = { Name = "review-app" }
}
要点:状态文件(state)别丢,Terraform 依赖它对比变更;加密存储 state。
2.5 CI/CD:发布可回滚的流水线
- GitHub Actions / GitLab CI / Jenkins,会一个,理解概念即可。
- FDE 关心的核心:
- 代码提交 → 自动构建镜像 → 推到私有仓库 → 自动部署。
- 可回滚:保留上一版镜像,出问题一条命令回退。
- 环境分离:dev → staging → prod,别一提交就上生产。
# .github/workflows/release.yml(示意)
name: build-and-deploy
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: docker build -t my-registry/review-api:${{ github.sha }} .
- run: docker push my-registry/review-api:${{ github.sha }}
# ... deploy step
2.6 网络:客户现场排障超高频
2.6.1 必须懂的基础
- TCP/IP / DNS / 代理 / 内网穿透 / 防火墙 / 负载均衡。
- 客户最常见的"我的 AI 连不通模型服务",八成是网络或权限,三成是配置。
2.6.2 排障命令背下来
ping <host> # 通不通
curl -v <url> # 看 HTTP 详情、DNS、握手、跳转
nslookup <域名> # DNS 解析对不对
telnet <host> <port> # 端口通不通
ss -tunlp # 本地监听端口
traceroute <host> # 走到哪一步断了
2.6.3 三个高频坑
- DNS:客户内网域名解析不了外部模型 API → 检查
/etc/resolv.conf、内网 DNS、是否需要走代理。 - 代理:客户走 HTTP 代理访问外网,你的服务要配
HTTPS_PROXY。 - 双网卡/网关:应用起不来、外连不通,先看路由。内网穿透(如 frp/ngrok)是客户隔离环境调试的救命工具。
2.7 操作系统:Linux 深度运维(重点)
2.7.1 现场必会命令
journalctl -u my-service -f # systemd 服务日志
df -h / free -h # 磁盘 / 内存
top / htop # CPU 内存占用
lsof -i:8080 # 谁占用了端口
systemctl status/restart my-service
ps aux | grep <name> # 找进程
这几条在 FDE 驻场时各管一摊:客户说"服务起不来/内存打满/OOM 了",先 systemctl status 看服务状态、journalctl -u xxx -f 跟日志;客户说"端口被占/连不上",用 ss -tunlp 加 lsof -i:8080 定位谁占了端口;要限制容器吃资源就碰 cgroup(docker run --memory、K8s 的 requests/limits 本质也是给它画像);要放行或拦流量就上 iptables/防火墙规则。这六条是驻场第一天就该焊在手上的肌肉记忆,出问题先扫一遍状态、别急着重装。系统化的 Linux 命令与运维,回 tech-linux.html 补。
2.7.2 看内核/系统报错
/var/log/syslog、dmesg(内核日志)、/var/log/messages。- 模型服务 OOM:看
dmesg里的killed process。 - Windows 服务器:会看事件查看器、IIS 日志即可,FDE 主力还是 Linux。
2.7.3 systemd 一个服务示例
# /etc/systemd/system/review-api.service
[Unit]
Description=Review API
After=network.target
[Service]
User=appuser
WorkingDirectory=/opt/review
ExecStart=/opt/review/.venv/bin/uvicorn main:app --host 0.0.0.0 --port 8080
Restart=always
EnvironmentFile=/etc/review-api.env
[Install]
WantedBy=multi-user.target
2.8 模块练习
- 用 Dockerfile 构建一个 FastAPI 服务镜像(非 root、多阶段),
docker run跑通/api/health。 - 写一份最小 K8s Deployment + Service + livenessProbe,手动制造一次 OOM 并完整排障到恢复。
- 用 Terraform 在云上(minikube/本地模拟也行)定义一台机器 + 一个安全组,apply 一遍。
- 搭一个 GitHub Actions 流水线:push 触发构建镜像并打 tag。
- 模拟一次"客户内网访问不了外网模型 API"的排障,用 curl/nslookup/traceroute 逐步定位到 DNS/代理问题。
2.9 本章面试题
- "Docker 和虚拟机区别?" → 答:Docker 共享宿主机内核,只隔离进程/文件/网络/资源视图,更轻、秒级启动;虚拟机有独立内核 + 硬件虚拟化,隔离更强但更重。
- "K8s 里一个 Pod 一直 CrashLoopBackOff 你怎么排查?"
→ 答:
kubectl describe看事件(是否 OOM、镜像拉取失败)→kubectl logs --previous看崩溃前日志 → 进容器手动跑命令验证 → 定位代码/配置/资源问题修掉。 - "为什么要 IaC(Terraform)?" → 答:环境可复现、可 review、可审计,避免手点控制台导致的环境漂移;客户环境出问题能一键重建到已知好状态。
- "客户内网连不上你的模型服务,你先查什么?" → 答:先确认是网络还是配置:用 ping/telnet 探连通性 → curl -v 看 DNS 和握手 → 检查防火墙/安全组/代理/路由 → 对照日志确认服务本身活着。网络问题别瞎升级服务。
- "容器镜像安全你注意什么?" → 答:不用 root 跑、密钥不入镜像(用 env/k8s secret/KMS)、用基础镜像并定期更新、扫描漏洞、私有仓库、staging 与 prod 隔离。
2.10 小结
- 云讲"精通一个横向套用":VPC/安全组/IAM/存储/KMS 五件套先说人话。
- Docker 打包 + K8s 编排 + 排障三连是客户交付的常态功。
- IaC + CI/CD 让环境可复现、可回滚。
- 网络排障 + Linux 运维是现场最高频的"救火"能力。
- 下一章进入 AI 核心第一站:怎么把大模型部署起来、调起来。
延伸阅读 · 去本站教学页补齐基础
- Linux 常用命令/系统运维——2.6/2.7 的网络排障与 Linux 现场必会命令,系统化补齐。
- 数据持久层——K8s 里跑的有状态服务、存储/持久卷背后的数据库底子。
- 中间件 Redis/MQ/注册中心——容器里常挂的 Redis/MQ/注册中心怎么配、怎么排障。
- Node.js 后端——容器内常跑的运行时之一,配合 Docker/K8s 部署的常见形态。
本页由 FDE 培养课程文档生成,完整课程见 FDE 培养 · 课程总览。