第三章:DevOps 与云原生 — 打破开发与运维的壁垒#
mindmap
root((DevOps与云原生))
DevOps文化
2009 DevOpsDays
CALMS模型
打破壁垒
基础设施即代码
Terraform
Ansible
Pulumi
容器化
Docker
Kubernetes
容器编排
微服务
服务拆分
API网关
分布式挑战
GitOps
Git为真实来源
ArgoCD/Flux
Platform Engineering
可观测性
Metrics
Logs
Traces
“DevOps 不是一个团队、一个工具或一个职位,它是一种文化。” — Gene Kim
3.1 DevOps 的起源#
2009 年,比利时根特市,Patrick Debois 组织了第一届 DevOpsDays 大会。这个名字来源于 “Development”(开发)和 “Operations”(运维)的组合,代表着一场打破两个阵营之间壁垒的运动。
开发与运维的传统矛盾#
开发团队的目标:快速交付新功能
"我们需要更快地发布!"
↕ 冲突 ↕
运维团队的目标:保持系统稳定
"别动生产环境!"
这种矛盾导致了:
发布周期长(每月甚至每季度一次)
"扔过墙"式的交接(开发写完代码扔给运维部署)
出了问题互相推诿
运维手动操作,容易出错
DevOps 的核心理念(CALMS)#
Culture(文化):协作、信任、共担责任
Automation(自动化):一切可自动化的都应该自动化
Lean(精益):消除浪费,持续改进
Measurement(度量):用数据驱动决策
Sharing(分享):知识共享,打破信息孤岛
3.2 基础设施即代码(IaC)#
从手动运维到代码化#
传统运维靠的是"运维手册"和"SSH 上去改",IaC 将基础设施的管理变成了编写代码:
# Terraform 示例:在 AWS 上创建一个 EC2 实例
resource "aws_instance" "web_server" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t3.medium"
tags = {
Name = "web-server"
Environment = "production"
ManagedBy = "terraform"
}
user_data = <<-EOF
#!/bin/bash
apt-get update
apt-get install -y nginx
systemctl start nginx
EOF
}
resource "aws_security_group" "web_sg" {
name = "web-server-sg"
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from_port = 443
to_port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
主流 IaC 工具对比#
工具 |
类型 |
语言 |
特点 |
|---|---|---|---|
Terraform |
声明式 |
HCL |
多云支持,生态最丰富 |
Pulumi |
命令式 |
Python/Go/TS |
用编程语言写基础设施 |
Ansible |
过程式 |
YAML |
无 Agent,简单易用 |
CloudFormation |
声明式 |
JSON/YAML |
AWS 原生 |
3.3 容器化革命#
Docker:一次构建,到处运行#
2013 年,Docker 的发布彻底改变了软件的打包和分发方式:
# 多阶段构建示例
FROM python:3.12-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
FROM python:3.12-slim
WORKDIR /app
COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
Docker 解决的核心问题:
✅ “在我机器上能跑” → 环境一致性
✅ 依赖隔离,不同应用互不干扰
✅ 秒级启动,轻量级虚拟化
✅ 镜像分层,高效分发
Kubernetes:容器编排的事实标准#
# Kubernetes Deployment 示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
labels:
app: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web-app
image: myregistry/web-app:v1.2.3
ports:
- containerPort: 8000
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 10
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: web-app-service
spec:
selector:
app: web-app
ports:
- port: 80
targetPort: 8000
type: LoadBalancer
Kubernetes 的核心能力:
自动扩缩容:根据负载自动调整 Pod 数量
自愈:容器崩溃自动重启
滚动更新:零停机部署
服务发现:内置 DNS 和负载均衡
配置管理:ConfigMap 和 Secret
3.4 微服务架构#
从单体到微服务#
单体架构: 微服务架构:
┌─────────────────┐ ┌──────┐ ┌──────┐ ┌──────┐
│ 用户模块 │ │ 用户 │ │ 订单 │ │ 支付 │
│ 订单模块 │ → │ 服务 │ │ 服务 │ │ 服务 │
│ 支付模块 │ └──┬───┘ └──┬───┘ └──┬───┘
│ 通知模块 │ │ │ │
│ ───────── │ ┌──┴────────┴────────┴──┐
│ 共享数据库 │ │ 消息队列 / API 网关 │
└─────────────────┘ └────────────────────────┘
微服务的挑战#
微服务不是银弹,它带来了新的复杂性:
分布式系统的固有复杂性:网络延迟、部分失败、数据一致性
运维复杂度:几十上百个服务的部署、监控、调试
服务间通信:同步(REST/gRPC)vs 异步(消息队列)
数据管理:每个服务独立数据库,跨服务查询困难
3.5 GitOps 与 Platform Engineering#
GitOps#
GitOps 将 Git 作为基础设施和应用配置的唯一真实来源:
开发者 → Git Push → Git Repository → ArgoCD/Flux → Kubernetes
↑ │
└──── 自动同步 ─────────────────┘
核心原则:
声明式:所有配置都是声明式的
版本化:所有变更都通过 Git 提交
自动化:变更自动应用到目标环境
自愈:系统自动纠正偏差
Platform Engineering#
2023-2024 年,Platform Engineering 成为新趋势:
开发者 → 内部开发者平台(IDP)→ 基础设施
┌─────────────────┐
│ 自助服务门户 │
│ ├── 创建环境 │
│ ├── 部署应用 │
│ ├── 查看日志 │
│ └── 管理配置 │
└─────────────────┘
Platform Engineering 的理念是:不要让每个开发者都成为 Kubernetes 专家,而是提供一个简单的平台让他们自助服务。
3.6 可观测性三支柱#
Metrics、Logs、Traces#
┌─────────────────────────────────────────┐
│ 可观测性 │
│ │
│ Metrics Logs Traces │
│ (指标) (日志) (追踪) │
│ │
│ Prometheus ELK Stack Jaeger │
│ Grafana Loki Zipkin │
│ Datadog Fluentd Tempo │
│ │
│ "系统现在 "发生了 "请求经 │
│ 怎么样?" 什么?" 过了哪 │
│ 里?" │
└─────────────────────────────────────────┘
# OpenTelemetry 示例:自动追踪
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
# 初始化追踪
provider = TracerProvider()
processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="http://otel-collector:4317"))
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)
tracer = trace.get_tracer(__name__)
# 使用追踪
@tracer.start_as_current_span("process_order")
def process_order(order_id: str):
span = trace.get_current_span()
span.set_attribute("order.id", order_id)
with tracer.start_as_current_span("validate_order"):
validate(order_id)
with tracer.start_as_current_span("charge_payment"):
charge(order_id)
with tracer.start_as_current_span("send_notification"):
notify(order_id)
3.7 云原生时代的交付流水线#
一个完整的云原生交付流水线:
代码提交 → 代码扫描 → 构建镜像 → 安全扫描 → 测试 → 部署到 Staging → 集成测试 → 部署到 Production
│ │ │ │ │ │ │ │
Git SonarQube Docker Trivy pytest ArgoCD Selenium ArgoCD
Semgrep Buildkit Snyk Jest Helm Playwright Canary
3.8 本章小结#
DevOps 和云原生技术从根本上改变了软件的构建、交付和运维方式。从手动部署到自动化流水线,从物理服务器到容器编排,从运维手册到基础设施即代码——每一步都在提高效率、降低风险。
这些技术为 AI 时代的软件开发奠定了坚实的基础。AI Agent 的部署和运维同样需要容器化、编排、可观测性等能力。在后续章节中,我们将看到 AI 如何进一步改变这些实践。
思考题
你的团队目前的部署频率是多少?有哪些瓶颈?
微服务是否适合所有项目?什么时候应该选择单体架构?
AI 能否帮助解决微服务带来的运维复杂性?