核心概念:弹性伸缩策略、任务编排与CI/CD流水线基础
在构建云原生运营体系时,弹性伸缩、任务编排与CI/CD流水线是三大核心支柱。本章将逐一拆解其基础概念、实现策略与集成关系,为后续的工程案例奠定理论基础。
2.1 弹性伸缩策略:水平与垂直
弹性伸缩是云原生架构应对流量波动的核心能力,主要分为水平伸缩(Scale Out/In)和垂直伸缩(Scale Up/Down)两种模式。
| 维度 | 水平伸缩(Horizontal) | 垂直伸缩(Vertical) |
|---|---|---|
| 操作对象 | 增加/减少实例数量(Pod/VM) | 调整单个实例的资源配置(CPU/内存) |
| 典型场景 | 无状态微服务应对突发流量 | 有状态数据库或遗留单体应用 |
| 伸缩粒度 | 实例级,粒度较粗 | 资源级,粒度精细 |
| 生效速度 | 快(秒级启动新Pod) | 慢(需重启实例) |
| 成本模型 | 线性增长,按需付费 | 阶梯式增长,易产生资源碎片 |
| K8s原生支持 | HPA(Horizontal Pod Autoscaler) | VPA(Vertical Pod Autoscaler) |
工程建议:在微服务架构中,优先采用水平伸缩。对于无法水平拆分的组件(如单点数据库),可结合垂直伸缩与读写分离策略。生产环境中常将HPA与Cluster Autoscaler配合使用,实现Pod与节点级别的双层弹性。
2.1.1 水平伸缩(HPA)核心指标
- CPU/内存利用率:最基础的指标,通过
metrics-server采集。 - 自定义指标(Custom Metrics):如QPS、请求延迟P99,需集成Prometheus Adapter。
- 外部指标(External Metrics):如消息队列积压数、数据库连接数。
# HPA示例:基于CPU和自定义QPS指标
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: webapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: webapp
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 1000
2.2 任务编排:DAG(有向无环图)
在运营任务中,多个步骤之间存在依赖关系(如:先备份数据库,再执行数据迁移,最后重启服务)。DAG(Directed Acyclic Graph)是描述这种依赖关系的最佳模型,它确保任务按拓扑顺序执行,且不会形成循环依赖。
DAG核心特性:
- 节点(Node):代表一个原子任务或子流程。
- 边(Edge):代表依赖关系,方向表示执行顺序。
- 无环(Acyclic):保证流程最终能执行完毕,不会死锁。
- 并行执行:无依赖关系的节点可同时运行,提升效率。
常见的DAG编排引擎包括:Apache Airflow(数据管道)、Argo Workflows(K8s原生)、Temporal(微服务编排)。在运营任务中,DAG常用于自动化备份、灰度发布、故障恢复等场景。
2.3 CI/CD流水线基础:Jenkins与GitLab CI
CI/CD流水线是实现代码从提交到部署自动化的核心工具。本节聚焦Jenkins和GitLab CI两种主流方案,对比其架构与适用场景。
| 特性 | Jenkins | GitLab CI |
|---|---|---|
| 架构 | Master/Agent(分布式) | Runner(无状态,可扩展) |
| 配置方式 | Jenkinsfile(Groovy DSL) | .gitlab-ci.yml(YAML) |
| 触发器 | Webhook、定时、SCM轮询 | Git事件(Push/MR/Tag) |
| 插件生态 | 极其丰富(1000+) | 内置集成(K8s、SAST、容器扫描) |
| 运维复杂度 | 较高(需维护Master高可用) | 较低(SaaS或单容器部署) |
| 适合场景 | 复杂流水线、多工具链集成 | GitLab一体化、中小团队快速启动 |
2.3.1 流水线核心阶段
- 代码检出(Checkout):从Git仓库拉取指定分支代码。
- 静态分析(Static Analysis):代码规范检查、安全漏洞扫描(SAST)。
- 构建与编译(Build):编译代码、生成制品(Jar/WAR/镜像)。
- 单元测试(Unit Test):运行自动化测试用例,生成覆盖率报告。
- 镜像构建与推送(Image Build & Push):Docker build & push到镜像仓库。
- 部署(Deploy):将新版本部署到测试/预发/生产环境。
# GitLab CI 示例:构建并部署到K8s
stages:
- build
- test
- deploy
build-job:
stage: build
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
test-job:
stage: test
script:
- npm run test:unit
deploy-staging:
stage: deploy
script:
- kubectl set image deployment/webapp webapp=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
environment:
name: staging
only:
- main
集成陷阱:CI/CD流水线触发部署后,若HPA立即介入,可能导致新版本Pod数量被旧指标误判。建议在流水线中增加冷却期(Cooldown)或预热阶段(Warm-up),待新Pod稳定运行后再启用HPA全量伸缩。
2.4 三者集成关系
弹性伸缩、任务编排与CI/CD流水线并非孤立存在,而是形成闭环:
- CI/CD流水线负责构建、测试和部署新版本。
- 任务编排(DAG)管理部署过程中的复杂依赖(如数据库迁移、缓存预热)。
- 弹性伸缩在部署完成后,根据实时负载动态调整资源,保障SLA。