从 Jenkins → ArgoCD + Tekton 全公司 CI/CD 平台迁移 14 天踩坑实录:7 个反模式与 10 套修法
这是一份非常真诚的 DevOps 平台迁移踩坑记。我是某中型 SaaS 公司平台工程团队负责人,2026 年 3 月底我们启动了从 Jenkins (1850 个 Job、312 个流水线) 迁移到 ArgoCD 2.13 + Tekton 0.65 + Backstage 1.32 + Crossplane 1.18 的项目。14 天里踩了 7 个反模式坑、写了 9 个晚上、删过 3 次集群、回滚 2 次。本文把整个过程完整复盘,希望能让正在做平台迁移的你少走 2 周弯路。
一、背景:为什么要迁移
我们公司 2018 年开始用 Jenkins,8 年里积累了 1850 个 Job、312 个 Jenkinsfile pipeline、47 个 master 实例、263 个 agent 节点。痛点在 2025 年下半年集中爆发:(1) Jenkins master 每周至少 1 次 OOM;(2) 插件兼容性灾难——升级 Jenkins LTS 总有 3-5 个关键插件挂掉;(3) Jenkinsfile DSL 复杂度失控,Groovy 脚本动辄 800 行;(4) 与 Kubernetes 集成靠 kubernetes-plugin,本身就是 anti-pattern;(5) Secret 管理混乱,12% 的 Job 把密码写在脚本里;(6) 审计与合规跟不上 SOC 2 要求。CTO 在 2026-Q1 季度会议拍板:6 月底前完成全公司 CI/CD 平台现代化。
二、新栈选型:为什么是 ArgoCD + Tekton + Backstage + Crossplane
我们对比了 6 套方案:(1) GitHub Actions + ArgoCD;(2) GitLab CI + Auto DevOps;(3) Tekton + ArgoCD + Backstage;(4) Drone + Argo;(5) CircleCI Server;(6) Buildkite + Flux。最终选择 Tekton + ArgoCD + Backstage + Crossplane 的核心理由:(a) 全部 Kubernetes-native,与我们已有 EKS 集群无缝;(b) Tekton 的 declarative pipeline 天然适合大规模复用;(c) ArgoCD 的 GitOps 模型可审计可回滚;(d) Backstage 提供 Service Catalog,把 1850 个服务的 metadata 统一管理;(e) Crossplane 把云资源也纳入 GitOps,RDS / S3 / IAM 全部 manifest 化。这套组合在 CNCF Landscape 2026 调研里是 Top 3 企业级方案,我们抄一份现成的"参考架构"省下 3 个月时间。
三、Day 1 起步:把 47 个 Jenkins master 的元数据全部抽出来
迁移第一步是"知己知彼"——我们花了 3 天写了一个 Jenkins → Tekton 转换器,把 1850 个 Job 的 Jenkinsfile / config.xml / 环境变量全部抽到一个 PostgreSQL 库里。关键发现:1850 个 Job 中只有 312 个真正在使用、800 个最近 6 个月没跑过、738 个完全废弃。这个数据让我们立刻砍掉 60% 工作量。我们在 CHANGELOG 里写:"真正难的不是技术迁移,而是数据治理——把废弃工作流毫不留情地删除,需要管理层背书"。CTO 在群里拍板"6 个月没跑过的 Job 默认废弃,业主有异议自己申诉",当晚就批掉了 1538 个 Job。
#!/bin/bash
# jenkins_metadata_export.sh
# 用 Jenkins CLI 批量拉取所有 job 的 config.xml,导入 PostgreSQL
set -euo pipefail
JENKINS_HOST=${JENKINS_HOST:-https://ci.internal}
JENKINS_USER=${JENKINS_USER:-platform-bot}
JENKINS_TOKEN=${JENKINS_TOKEN:?missing}
PG_URL=${PG_URL:-postgres://migrator@db:5432/migration}
# 1. 拉取所有 master 列表
for master in $(cat masters.txt); do
echo "Processing master: $master"
curl -s -u $JENKINS_USER:$JENKINS_TOKEN \
"$master/api/json?tree=jobs[name,url,lastBuild[timestamp,result]]" \
| jq -c '.jobs[]' \
> jobs_$master.jsonl
done
# 2. 逐个抽取 config.xml + 最近构建状态
while IFS= read -r job; do
job_url=$(echo $job | jq -r '.url')
job_name=$(echo $job | jq -r '.name')
last_ts=$(echo $job | jq -r '.lastBuild.timestamp // 0')
config=$(curl -s -u $JENKINS_USER:$JENKINS_TOKEN "${job_url}config.xml" \
| base64 -w0)
# 3. 写入 PostgreSQL
psql $PG_URL -c "INSERT INTO jenkins_jobs(name, master, config_b64, last_ts)
VALUES('$job_name', '$master', '$config', $last_ts)
ON CONFLICT(name, master) DO UPDATE
SET config_b64=EXCLUDED.config_b64, last_ts=EXCLUDED.last_ts;"
done < jobs_all.jsonl
echo "Extracted $(wc -l jobs_all.jsonl) jobs total"
四、反模式一:Jenkinsfile Groovy 自动转 Tekton YAML —— 70% 失败
Day 4 我们写了一个 Groovy → YAML 自动转换器,跑出来一看:1850 个 Job 中只有 28% 能纯自动转换,42% 需要手工调整,30% 必须人工重写。失败的根因主要是:(1) Jenkins shared library(Groovy 类)调用嵌套深;(2) 全局变量 / 凭据注入复杂;(3) parallel stage 与 matrix build 的语义不一致;(4) post action 的 always/success/failure 不能 1:1 映射;(5) 历史代码里大量 sh "..." 行内 Bash 与环境变量耦合。我们最终决定:自动转换只覆盖最简单的 200 个 Job,剩下的 1100 个由业主团队配合平台团队手工迁移,平台团队提供 Tekton "标准模板库"。
# tekton-template-build-test-deploy.yaml
# 标准模板:Build → Test → SAST → Image → Deploy
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
name: standard-build-test-deploy
namespace: tekton-pipelines
spec:
params:
- name: repo-url
type: string
- name: revision
type: string
default: main
- name: image-name
type: string
- name: target-namespace
type: string
workspaces:
- name: shared-workspace
tasks:
- name: git-clone
taskRef: { name: git-clone, kind: ClusterTask }
params:
- { name: url, value: $(params.repo-url) }
- { name: revision, value: $(params.revision) }
workspaces:
- { name: output, workspace: shared-workspace }
- name: unit-test
runAfter: [ git-clone ]
taskRef: { name: go-test, kind: ClusterTask }
workspaces: [ { name: source, workspace: shared-workspace } ]
- name: sast-scan
runAfter: [ git-clone ]
taskRef: { name: semgrep-scan, kind: ClusterTask }
workspaces: [ { name: source, workspace: shared-workspace } ]
- name: image-build
runAfter: [ unit-test, sast-scan ]
taskRef: { name: kaniko-build, kind: ClusterTask }
params:
- { name: IMAGE, value: $(params.image-name) }
workspaces: [ { name: source, workspace: shared-workspace } ]
- name: image-sign
runAfter: [ image-build ]
taskRef: { name: cosign-sign, kind: ClusterTask }
- name: argocd-sync
runAfter: [ image-sign ]
taskRef: { name: argocd-task-sync, kind: ClusterTask }
params:
- { name: application-name, value: $(params.target-namespace) }
五、反模式二:ArgoCD App-of-Apps 模式失控,manifest 数量爆炸
Day 6 我们把 312 个核心服务的 manifest 全部 GitOps 化,采用 ArgoCD 官方推荐的 App-of-Apps 模式。结果:3 天后 ArgoCD UI 卡死,3500+ Application 资源、单集群 ArgoCD controller CPU 一直 95%、Redis OOM 7 次。根因是 App-of-Apps 在中等规模就有性能瓶颈,官方文档推荐的"几十个应用"边界根本不适合企业级。修法:切换到 ApplicationSet + matrix generator,把 312 个服务的 manifest 按 namespace / region 二维 generator 自动生成,Application 数量从 3500 降到 312,ArgoCD controller CPU 降到 25%。同时把 ArgoCD HA mode 开起来,3 个 replica + Redis Sentinel,稳定性立竿见影。
# argocd-applicationset-matrix.yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: platform-services
namespace: argocd
spec:
generators:
- matrix:
generators:
- git:
repoURL: https://github.com/company/platform-manifests
revision: main
directories:
- path: services/*
- list:
elements:
- region: us-east-1
cluster: eks-prod-use1
- region: eu-west-1
cluster: eks-prod-euw1
- region: ap-southeast-1
cluster: eks-prod-apse1
template:
metadata:
name: '{{path.basename}}-{{region}}'
labels:
region: '{{region}}'
spec:
project: platform
source:
repoURL: https://github.com/company/platform-manifests
targetRevision: main
path: '{{path}}'
helm:
valueFiles:
- 'values-{{region}}.yaml'
destination:
name: '{{cluster}}'
namespace: '{{path.basename}}'
syncPolicy:
automated:
prune: true
selfHeal: true
retry:
limit: 5
backoff: { duration: 5s, factor: 2, maxDuration: 3m }
六、反模式三:Tekton PVC workspace 慢 + 跨节点共享灾难
Day 8 我们发现 Tekton pipeline 平均运行时间比 Jenkins 慢 35%,定位:shared-workspace 用 EBS gp3 + ReadWriteOnce,跨 task 跨节点时必须 detach/attach,平均额外 28 秒开销。修法:切换到 ReadWriteMany 的 EFS,但 EFS 在大量小文件场景 IOPS 巨慢,Go module 下载比 EBS 慢 4 倍。最终方案:shared-workspace 用 EBS gp3,但通过 Tekton workspaces.affinityAssistant 把同一 pipeline 所有 task 调度到同一节点,EBS 不需要重新挂载;build cache(Go module / Maven repo / Node modules)用 S3 + sealed-cache sidecar,起始 task 拉缓存到本地 emptyDir,结束 task 推回 S3,实测构建速度提升 42%。
# tekton-workspace-with-affinity.yaml
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
generateName: build-with-cache-
spec:
pipelineRef: { name: standard-build-test-deploy }
workspaces:
- name: shared-workspace
volumeClaimTemplate:
spec:
accessModes: [ ReadWriteOnce ]
resources: { requests: { storage: 20Gi } }
storageClassName: gp3-fast
podTemplate:
affinity:
podAffinity:
# 强制同一 pipeline 的所有 task pod 调度到同一节点
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
tekton.dev/pipelineRun: $(context.pipelineRun.name)
topologyKey: kubernetes.io/hostname
nodeSelector:
workload: ci-build
taskRunSpecs:
- pipelineTaskName: image-build
sidecarOverrides:
- name: s3-cache-sync
image: company/s3-cache-sync:v2.3
env:
- { name: CACHE_BUCKET, value: ci-cache-prod }
- { name: CACHE_PREFIX, value: go-modules }
七、反模式四:Backstage Service Catalog 数据 stale,自助门户失去信任
Day 10 上线 Backstage Service Catalog,导入 1850 个服务的 metadata。2 天后开发同事反馈:"Backstage 上看到的服务负责人是 3 年前离职的同事"、"Owner team 全是 platform-deprecated"、"On-call rotation 没人维护"。根因:catalog-info.yaml 的源头数据不准,业主团队没意愿主动维护。修法:(1) catalog-info.yaml 强制走 CODEOWNERS,owner 自动从 git 同步;(2) on-call 信息从 PagerDuty API 实时拉取;(3) 服务负责人变更必须 PR,自动 reviewer 是 platform 团队;(4) Backstage 加 "stale-detection" plugin,服务 90 天无活跃 commit 自动标记为 deprecated。这套机制跑了 2 周,Catalog 数据准确率从 38% 升到 92%,开发同事的信任也回来了。
八、反模式五:Crossplane managed resource 与 Terraform state 双写冲突
Day 11 我们把云资源 GitOps 化,Crossplane provider-aws 接管 RDS / S3 / IAM。悲剧发生:Crossplane 把 23 个生产 RDS 实例的 backup retention 全部改回默认 7 天,因为我们的 manifest 漏写了 backupRetentionPeriod 字段。8 个 DBA 加班 6 小时手工恢复。根本原因:Terraform 已经管理这些资源 4 年,Crossplane 接管时没做"import"流程,直接 apply 把 Terraform 的设置全部覆盖。修法:(1) Crossplane 接管 Terraform 资源前必须 import,把现有状态全部 dump 进 manifest;(2) 关键字段(backup / encryption / deletion_protection)在 manifest 加 annotation:crossplane.io/external-name 锁定;(3) Crossplane Composition 加 webhook 校验,关键字段缺失直接拒绝;(4) Crossplane 与 Terraform 共存阶段,资源 ownership 用 label kubernetes.io/managed-by 明确标识。
# crossplane-rds-with-guardrails.yaml
apiVersion: rds.aws.crossplane.io/v1beta1
kind: DBInstance
metadata:
name: orders-prod-pg17
annotations:
crossplane.io/external-name: orders-prod-pg17
company.io/owner-team: payments-platform
company.io/criticality: P0
labels:
kubernetes.io/managed-by: crossplane
region: us-east-1
spec:
forProvider:
region: us-east-1
engine: postgres
engineVersion: "17.2"
dbInstanceClass: db.r7g.4xlarge
allocatedStorage: 4000
storageType: gp3
iops: 12000
storageEncrypted: true
kmsKeyID: arn:aws:kms:us-east-1:1234:key/abc
backupRetentionPeriod: 35 # 关键字段,缺失会被 webhook 拒绝
preferredBackupWindow: "03:00-04:00"
deletionProtection: true # 关键字段
enablePerformanceInsights: true
performanceInsightsRetentionPeriod: 731
monitoringInterval: 60
publiclyAccessible: false
multiAZ: true
masterUsername: dba_admin
masterUserPasswordSecretRef:
namespace: platform
name: orders-prod-master-password
key: password
providerConfigRef: { name: aws-prod }
writeConnectionSecretsToNamespace: orders
九、反模式六:Tekton 大流水线 OOM,EventListener 雪崩
Day 12 流量灰度到 30%,周一早高峰 EventListener 收到 8000+ webhook,Tekton controller 直接 OOM,所有 pipeline 卡在 Pending。根因:Tekton controller 默认 -threads-per-controller=2,1850 个 Job 同时刷新撑爆 goroutine。修法:(1) Tekton controller 增到 8 个 replica + leader election;(2) -threads-per-controller=32;(3) EventListener 前面加 KEDA 自动伸缩,基于 webhook QPS 横向扩容;(4) PipelineRun TTL 60 分钟自动清理,避免 etcd 积压;(5) 大流水线拆成 Parent + Child PipelineRun,Parent 只编排,Child 跑实际 task,Parent 通过 finally task 聚合结果。这套组合下 8000 QPS 也稳如老狗,P99 调度延迟从 18 秒降到 1.2 秒。
| 问题 | 反模式 | 修法 | 效果 |
|---|---|---|---|
| ArgoCD App-of-Apps 性能炸 | 3500+ Application 资源 | ApplicationSet matrix generator | Application 数 3500→312 |
| Tekton workspace 慢 | EBS RWO 跨节点 | affinityAssistant + S3 cache | 构建速度 +42% |
| Backstage catalog stale | 业主无激励维护 | CODEOWNERS + PagerDuty 自动同步 | 准确率 38%→92% |
| Crossplane vs Terraform | 未 import 直接 apply | import + webhook 校验 + label | 23 个 RDS 0 误删 |
| Tekton OOM | controller 单线程 | 8 replica + 32 threads + KEDA | P99 18s→1.2s |
| Jenkins → Tekton 自动迁移 | 70% 转换失败 | 200 自动 + 1100 手工 + 模板库 | 14 天完成迁移 |
| Secret 散落 | 12% 写脚本里 | External Secrets + Vault + 强校验 | 泄露事件归零 |
十、反模式七:External Secrets Operator + Vault 双层 cache 不一致
Day 13 我们用 External Secrets Operator (ESO) + HashiCorp Vault 替换 Jenkins Credentials。问题:Vault 里改了密码,ESO 同步到 K8s Secret 要 60 秒,Tekton pipeline 拿到的还是旧密码,导致 47 个生产 deploy 失败。根因是 ESO 默认 refreshInterval 60s + Tekton pipeline 启动时 secret 已经 mount,运行中不会重新拉取。修法:(1) ESO refreshInterval 改成 10s;(2) Vault 改密码后立即触发 ESO ExternalSecret 的强制刷新 webhook;(3) 关键 Secret 加 vault.hashicorp.com/agent-inject 注解,通过 Vault Agent sidecar 实时 mount;(4) Pipeline 启动前增加"secret 健康检查"task,失败立即 fail-fast。这套机制跑了 1 个月,Secret 相关事故归零。
十一、监控与可观测性:Prometheus + Grafana + Loki + Tempo
新平台的可观测性栈:Prometheus 2.55 + Grafana 11.5 + Loki 3.3 + Tempo 2.7 + OpenTelemetry Collector 0.118。核心指标:(1) PipelineRun 成功率(目标 99.5%);(2) PipelineRun P99 时延(目标 < 8 分钟);(3) ArgoCD Sync 健康度(目标 100% Synced);(4) Backstage 服务覆盖率(目标 95%);(5) Vault Secret 访问 audit log 完整性。Grafana 仪表盘按"业务团队"维度划分,每个团队看到自己 namespace 的 metric;Loki 按 namespace + 服务名索引,平均查询延迟 < 1.2 秒;Tempo 接 OpenTelemetry,自动 trace Tekton pipeline → ArgoCD Sync → Pod 启动全链路。
十二、引申一:GitOps 的"事实标准"模型
2026 年 GitOps 已经是企业级 CI/CD 的事实标准,核心原则:(1) 单一事实源(Git repo);(2) 声明式配置(YAML/HCL);(3) 自动化同步(controller pull,not push);(4) 持续 reconciliation(drift detection + auto correct)。我们公司的 GitOps 仓库布局:(a) platform-manifests:核心基础设施 manifest;(b) team-{name}-manifests:各业务团队的服务 manifest;(c) cluster-config:集群级配置(RBAC / Network Policy / PSP);(d) policy-as-code:OPA Gatekeeper / Kyverno 策略。这套布局清晰责权,业务团队只能改自己的 repo,平台团队 review 跨团队改动。
十三、引申二:Platform Engineering 的兴起
2026 年 DevOps 的最大变化是 Platform Engineering 取代传统 DevOps Engineer 成为主流。核心理念:平台团队提供"黄金路径"(Golden Path),开发者通过自助门户消费基础设施服务,不需要懂 Kubernetes / Terraform / Helm 细节。我们公司 Platform Engineering 的能力:(1) Self-service Service Catalog(Backstage);(2) Template Repository(Tekton Pipeline 模板 + Helm Chart 模板);(3) Compliance as Code(OPA 策略自动 enforce);(4) Cost as Code(Crossplane Composition 内置 cost label)。开发者从"提工单等运维"变成"自助下单 5 分钟拿到环境",CTO 数据是平均上新服务时间从 18 天降到 36 小时。
十四、引申三:Policy as Code 与零信任
新平台的策略引擎:OPA Gatekeeper 3.18 + Kyverno 1.13 + Falco 0.40 + Trivy Operator 0.22。核心策略:(1) 镜像必须 cosign 签名才能部署;(2) Pod 必须有 securityContext.runAsNonRoot=true;(3) Service 不允许 LoadBalancer 类型(只能 NodePort + Ingress);(4) Namespace 必须有 owner-team label;(5) Secret 不能明文挂载(必须走 External Secrets);(6) 镜像 CVE Critical 数 > 0 拒绝部署。这些策略全部 manifest 化,通过 Argo Sync 部署到所有集群,违反策略的 PR 在 admission webhook 阶段就被拒掉。零信任的核心是"假定 breach",每一层都校验,这是 2026 年所有合规企业的标准做法。
十五、引申四:FinOps 与多云成本治理
迁移完成后我们顺手做了 FinOps 治理。工具:OpenCost 1.115 + Kubecost 2.5 + AWS Cost Explorer + Apptio Cloudability。核心动作:(1) 每个 namespace 必须有 cost-center label,无 label 不允许创建 Pod;(2) 每月给业务负责人发"账单",哪个服务多花钱一目了然;(3) idle resource 自动扫描,周末 / 夜间 dev 环境自动缩容;(4) Spot 实例占比从 8% 提升到 42%,通过 Karpenter 自动调度;(5) S3 / EBS 智能分层,冷数据自动迁移到 Glacier。半年下来云成本下降 35%,年化节省 4200 万,FinOps 团队成为 CFO 最喜欢的部门。
# kubecost-budget-alert.yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: kubecost-budget-alerts
namespace: kubecost
spec:
groups:
- name: cost-alerts
rules:
- alert: NamespaceMonthlyBudgetExceeded
expr: |
sum by (namespace) (
kubecost_namespace_monthly_cost_dollars
) / on(namespace) group_left
kubecost_namespace_monthly_budget_dollars > 1
for: 1h
labels: { severity: warning, team: finops }
annotations:
summary: "Namespace {{ $labels.namespace }} 已超月度预算"
description: "当前花费 {{ $value | humanize }} 美元,请联系 owner-team"
- alert: IdleResourceWaste
expr: |
sum by (namespace) (
kubecost_namespace_idle_cost_dollars
) > 500
for: 24h
labels: { severity: info, team: finops }
- alert: SpotInterruptionRateHigh
expr: |
rate(karpenter_nodes_termination_reason_total{reason="SpotInterruption"}[1h])
> 0.05
for: 30m
labels: { severity: warning, team: platform }
十六、引申五:AI Ops 在 CI/CD 中的落地
2026 年 AI Ops 在 CI/CD 中的应用:(1) GitHub Copilot Workspace 自动生成 Tekton pipeline 模板,80% 场景一次成型;(2) ChatGPT Code Interpreter 接 ArgoCD API,自然语言"帮我把 payment 服务回滚到上一个 tag"自动执行;(3) Claude 接 Backstage,开发者"为什么 my-service 部署失败"AI 自动分析 Pod log + Event + ArgoCD status 给出根因;(4) AI 驱动的 flaky test 检测,自动 quarantine 不稳定测试。核心价值:把"运维"从"专家活"变成"普通开发都能做"。我们公司新员工入职 1 周就能独立部署服务,这在 5 年前需要 3 个月。
十七、引申六:CI/CD 流水线的安全加固
SOC 2 / ISO 27001 对 CI/CD 流水线的核心要求:(1) Build 环境隔离(每个 build 独立 Pod,运行完即销毁);(2) 镜像签名(cosign + sigstore);(3) SBOM 生成与扫描(syft + grype);(4) Provenance 证明(SLSA Level 3);(5) Secret 不进镜像层;(6) Audit log 完整保留 1 年。我们的流水线满足 SLSA Level 3 要求,每个生产镜像都有 provenance.json 记录"什么代码、什么时间、什么参数构建出来",可以全链路追溯。这套合规要求让我们在 2026 Q1 SOC 2 Type II 审计中一次通过,审计师评价"业内罕见的合规水平"。
十八、引申七:Tekton 与 GitHub Actions 的边界
不是所有场景都适合 Tekton。我们的划分:(1) PR check / lint / test → GitHub Actions(自带 runner,免维护);(2) 镜像构建 / 部署 / 数据库迁移 → Tekton(企业级隔离 + audit);(3) 跨 repo / 跨 cloud 编排 → Tekton + ArgoCD Workflow;(4) 公开 OSS 项目 → GitHub Actions(社区生态丰富)。核心原则:GitHub Actions 适合"轻量、社区、外部",Tekton 适合"重量、内部、合规"。两套并存不是问题,关键是清晰边界,不要让团队选择困难。
十九、引申八:Argo Workflows vs Argo Events vs Tekton
Argo 生态在 2026 年同样火,几个组件的差异:(1) Argo CD:GitOps,K8s 资源同步;(2) Argo Workflows:DAG 工作流引擎,适合数据 pipeline / ETL / ML training;(3) Argo Events:事件驱动,webhook / cron / kafka 触发器;(4) Tekton:CI 流水线引擎,适合 build / test / deploy。我们的组合:Tekton(CI build)→ Argo CD(CD deploy)→ Argo Workflows(数据 pipeline)→ Argo Events(跨系统事件触发)。这四件套构成完整的"事件驱动 CI/CD"架构,比单纯 Jenkins 强大 10 倍。
二十、引申九:Backstage 插件生态与定制
Backstage 1.32 的插件生态非常丰富:(1) catalog:服务目录;(2) techdocs:技术文档;(3) scaffolder:服务脚手架;(4) kubernetes:K8s 资源可视化;(5) argo-cd:ArgoCD 集成;(6) jenkins:Jenkins 集成(过渡期保留);(7) prometheus:监控面板;(8) cost-insights:成本分析。我们写了 12 个自定义插件:(a) on-call rotation;(b) deployment frequency dashboard;(c) DORA metrics(MTTR / Change Failure Rate);(d) security posture;(e) cost trend。Backstage 的核心价值是"统一开发者门户",一个网址解决所有自助需求。
二十一、引申十:DORA 指标与组织效能
Google DORA 团队提出的 4 个 DevOps 关键指标 2026 年仍是黄金标准:(1) Deployment Frequency(部署频率):Elite 团队每天多次;(2) Lead Time for Changes(变更前置时间):Elite < 1 天;(3) Change Failure Rate(变更失败率):Elite < 5%;(4) MTTR(平均恢复时间):Elite < 1 小时。我们迁移完成后的数据:部署频率从平均 3.2 次/天提升到 12.7 次/天;Lead Time 从 4.8 天降到 18 小时;CFR 从 18% 降到 4.2%;MTTR 从 5.5 小时降到 42 分钟。这就是 DevOps 平台现代化的真正 ROI——不是技术指标,而是组织效能。
二十二、引申十一:Inner Source 与跨团队协作
新平台带动 Inner Source 文化:(1) 平台 manifest repo 全公司只读,任何人可提 PR;(2) Tekton 模板库公开,业务团队可以"fork + 定制";(3) Backstage scaffolder 模板由社区维护,平台团队 review。半年下来:Inner Source PR 从 0 涨到月均 280 个,跨团队代码复用率提升 35%,平台团队负担减轻 40%。Inner Source 的本质是"把平台变成产品,把开发者变成客户",这是 2026 年所有大型工程组织的共识。
二十三、引申十二:Kubernetes 与 Serverless 的融合
2026 年 Kubernetes 与 Serverless 的边界越来越模糊:(1) Knative Serving:K8s 上跑 Serverless workload,scale-to-zero;(2) AWS Fargate / GCP Cloud Run / Azure Container Apps:云原生 Serverless 容器;(3) KEDA:基于事件的自动伸缩;(4) Karpenter:节点级 just-in-time 扩容。我们公司 30% 工作负载已经跑在 Knative 上,scale-to-zero 节省 65% 计算成本。但 Knative 不是银弹,长连接 / 大内存 / GPU 场景仍然需要传统 Deployment。2026 年的最佳实践是"分层部署":稳态用 Deployment,突发用 KEDA + Knative,极致弹性用云厂商 Serverless。
二十四、总结与对平台工程师的话
14 天迁移、7 个反模式、10 套修法、1850 个 Job 治理、312 个核心服务现代化、4 个 cloud region 全量 GitOps 化、4200 万年化云成本节省。这次迁移的真正收益不是技术指标,而是组织从"运维驱动"变成"平台驱动"的根本转型。Jenkins 服务了我们 8 年,但 8 年的技术债不是它的错,是组织没有同步现代化。ArgoCD + Tekton + Backstage + Crossplane 不是终点,而是 2026 年的起点,2028 年还会有新方案。平台工程师的核心能力不是某项工具的熟练度,而是"持续把复杂性内化、把简单性输出"的能力。这份踩坑录献给每个正在做平台现代化的同行,愿你们少走 2 周弯路。
二十五、引申十三:Karpenter 与传统 Cluster Autoscaler 的对比
2026 年 Kubernetes 节点伸缩已经从 Cluster Autoscaler 时代进入 Karpenter 时代。核心差异:(1) Karpenter 直接调用云厂商 API 创建实例,无需提前定义 NodeGroup,选型可以是 just-in-time;(2) Karpenter 内置 bin-packing 算法,新 Pod 调度时同时评估"是否需要新节点 / 是否能塞进现有节点";(3) Karpenter 原生支持 Spot 实例混合调度,自动选择 cheapest 实例类型;(4) Karpenter consolidation 功能自动合并低利用率节点,节省成本 25%+。我们公司迁移 Karpenter 后:节点数量从 1280 降到 720(降 44%),Spot 占比从 8% 涨到 42%,每月节省 EC2 费用 280 万。但 Karpenter 也有坑:(a) consolidation 太激进会导致 Pod 频繁迁移,影响有状态应用;(b) Spot 中断率受 AWS 容量影响,某些 region peak hour 中断率高达 8%;(c) 与 EBS 卷绑定的 Pod 不适合 Spot,必须用 nodeSelector 强制 On-Demand。
二十六、引申十四:Cilium Service Mesh 与 Istio 的选型
新平台底层网络选型经过激烈讨论,最终我们选择了 Cilium 1.16 + Cilium Service Mesh,而不是 Istio Ambient。核心理由:(1) Cilium 已经是我们的 CNI,加 Service Mesh 减少一层组件;(2) eBPF 数据面比 Istio Envoy 低 35% 延迟;(3) Cilium ClusterMesh 跨集群能力比 Istio Multi-Cluster 简单 10 倍;(4) L7 policy 用 eBPF 而不是 Envoy filter,内存占用低 60%。但 Cilium SM 也有缺点:(a) L7 协议支持不如 Envoy 全(没有 gRPC-Web、不支持 SOAP);(b) 商业插件少,可观测性靠 Hubble 自己搞;(c) WASM filter 生态远不如 Envoy。选型核心是"我们 90% 流量是 HTTP + gRPC,Cilium SM 足够;剩下 10% 复杂协议走传统 Envoy sidecar"。
# cilium-l7-network-policy.yaml
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: payment-service-l7-policy
namespace: payment
spec:
endpointSelector:
matchLabels:
app: payment-service
ingress:
- fromEndpoints:
- matchLabels:
app: api-gateway
toPorts:
- ports:
- { port: "8080", protocol: TCP }
rules:
http:
- method: "POST"
path: "/api/v1/payments"
- method: "GET"
path: "/api/v1/payments/[a-f0-9-]+"
egress:
- toEndpoints:
- matchLabels:
app: postgres
toPorts:
- ports:
- { port: "5432", protocol: TCP }
- toFQDNs:
- matchPattern: "*.stripe.com"
toPorts:
- ports:
- { port: "443", protocol: TCP }
二十七、引申十五:Helm 3 与 Kustomize 的现代用法
Helm 与 Kustomize 之争 5 年没有定论,2026 年我们的实践是"两者结合":(1) Helm Chart 作为"包",由平台团队维护并版本化发布;(2) Kustomize overlay 作为"环境差异",业务团队管理 dev/staging/prod 差异;(3) ArgoCD 原生支持 Helm + Kustomize 组合,Application 资源 spec.source 同时指定 Helm values + Kustomize overlay;(4) Helm Chart 的 schema 用 OpenAPI 强校验,避免 values.yaml 写错。我们的 Chart 仓库有 47 个公共 Chart,业务团队的 manifest 90% 是 Kustomize overlay,只覆盖少量字段。这套架构既享受 Helm 的"包"语义,又享受 Kustomize 的"声明式"语义,是 2026 年大规模 K8s 治理的最佳实践。
二十八、引申十六:Cosign + Sigstore + SLSA 供应链安全
2026 年软件供应链安全已经成为 CI/CD 平台的必选项。核心组件:(1) Cosign:镜像签名工具,支持 keyless(JWT)表达"谁登录了"。">OIDC)/ keyed(KMS)两种模式;(2) Sigstore:公开透明日志,所有签名记录上 Rekor 公链;(3) SLSA(Supply chain Levels for Software Artifacts):4 个等级,Level 3+ 要求构建过程 hermetic;(4) SBOM(Software Bill of Materials):syft 生成 + grype 扫描;(5) Provenance attestation:每个镜像附带 provenance.json。我们的流水线已经达到 SLSA Level 3:(a) 所有构建在隔离环境(ephemeral pod);(b) 所有源码 / 依赖来自可信源(GitHub + private registry);(c) Provenance 自动生成并签名;(d) Admission webhook 拒绝未签名镜像。SLSA Level 4 需要"双人审核 + reproducible build",我们 2026 H2 在做。
二十九、引申十七:Renovate vs Dependabot 的依赖管理
1850 个服务的依赖管理是噩梦。我们对比了 Renovate(Mend) vs Dependabot(GitHub) vs Snyk,最终选 Renovate self-hosted。理由:(1) Renovate 支持 95+ 包管理器,Dependabot 只 25 个;(2) Renovate 可以 group 多个依赖到一个 PR,Dependabot 每个依赖一个 PR;(3) Renovate 的 schedule + automerge 规则灵活,可以"周末 minor 自动合";(4) Renovate self-hosted 免费,Dependabot 企业版按 seat 收费。配置上我们用 "central config",所有 repo 共享 renovate-config repo,统一规则:(a) Critical CVE 立即创建 PR;(b) minor 升级周一聚合一个 PR;(c) major 升级需要 owner-team 显式 approve;(d) 测试依赖 automerge,生产依赖人工 review。这套机制下,1850 个服务的依赖更新从月均 60 个手工 PR 降到 5 个,自动化率 92%。
三十、引申十八:Chaos Engineering 与 Litmus / Chaos Mesh
新平台稳定性建设少不了 Chaos Engineering。工具:Chaos Mesh 2.7 + Litmus 3.10 + AWS Fault Injection Simulator。我们的 Chaos 计划:(1) Pod Chaos:每周随机杀 5% Pod,验证健康检查 + 自愈;(2) Network Chaos:每月跑 3 次 network latency / packet loss / DNS error;(3) IO Chaos:模拟磁盘满 / IO 慢,验证 graceful degradation;(4) Time Chaos:NTP skew,验证 token 过期 / 缓存失效逻辑;(5) Region Chaos:每季度模拟一个 AWS region 完全不可用,验证 DR plan。Chaos Engineering 的核心价值不是"找 bug",而是"建立信心"——团队对系统稳定性有 quantified confidence,而不是"应该没问题"。我们公司 SLO 达成率从 98.2% 提升到 99.8%,Chaos 功劳一半。
# chaos-mesh-network-loss.yaml
apiVersion: chaos-mesh.org/v1alpha1
kind: NetworkChaos
metadata:
name: payment-network-loss
namespace: chaos-engineering
spec:
action: loss
mode: random-max-percent
value: "20"
selector:
namespaces: [ payment ]
labelSelectors:
tier: backend
loss:
loss: "30"
correlation: "25"
duration: "5m"
scheduler:
cron: "0 14 * * 5" # 每周五下午 2 点
三十一、引申十九:DevSecOps 的工具链与流程
DevSecOps 不再是新概念,2026 年的成熟工具链:(1) SAST:Semgrep 1.95 + SonarQube 10.5 + CodeQL;(2) DAST:OWASP ZAP 2.16 + Burp Suite Enterprise;(3) SCA:Snyk + Mend + Dependency-Track;(4) Container Scan:Trivy 0.55 + Grype + Anchore;(5) IaC Scan:Checkov 3.2 + tfsec + KICS;(6) Secret Scan:gitleaks + trufflehog。关键流程:(a) PR 阶段:SAST + Secret Scan 必须通过;(b) Build 阶段:SCA + Container Scan + IaC Scan 必须通过;(c) Pre-deploy:DAST staging 跑全量;(d) Post-deploy:Runtime security 持续监控(Falco / Tetragon)。我们公司把 DevSecOps 工具全部集成到 Tekton pipeline,任一环节失败立即 fail,P0 漏洞 24 小时必须修复。半年下来,Critical CVE 数从月均 28 降到 3。
三十二、引申二十:Tekton Chains 与可信构建
Tekton Chains 是 2026 年 SLSA Level 3 的关键组件。它的功能:(1) 自动监听 TaskRun / PipelineRun 完成事件;(2) 提取构建产物(镜像、二进制、SBOM);(3) 生成 in-toto provenance attestation;(4) 用 KMS 签名 attestation;(5) 推到 Rekor 公链 + OCI registry 作为 OCI artifact。配合 Cosign verify-attestation,部署时 Admission webhook 校验 provenance:(a) 是否来自可信构建系统;(b) 源码是否来自可信 Git repo;(c) 构建参数是否符合 policy;(d) Builder 是否在白名单。这套机制下,理论上 attacker 即使拿到 registry 写权限也无法部署恶意镜像——因为 provenance 签名校验过不去。这是 2026 年金融 / 政务 / 国防领域强制要求的能力。
三十三、引申二十一:Crossplane Composition v2 与 Configuration Package
Crossplane 1.18 引入 Composition v2,核心改进:(1) Composition Function:用 Go / Python / TypeScript 写 transformer,而不是 patch-and-transform 的 YAML 模板;(2) Configuration Package:把 XRD + Composition + Function 打成 OCI artifact,版本化发布;(3) Function pipeline:多个 function 串联,职责单一。我们公司基于 Composition v2 写了 12 个 "platform abstraction":(a) ProductionDatabase(自动包含 RDS + read replica + backup + IAM);(b) ProductionRedisCluster;(c) StaticWebsite(S3 + CloudFront + Route53 + ACM);(d) MicroserviceStack(Deployment + Service + Ingress + HPA + PDB + NetworkPolicy)。开发者只需要写 50 行 YAML 就能拉起一套生产环境,这是 Platform Engineering 的极致体现。
三十四、引申二十二:Multi-Tenant Kubernetes 的实践
多租户 K8s 是 2026 年大型平台的核心挑战。我们的方案:(1) Namespace 级别隔离 + ResourceQuota + LimitRange;(2) Network Policy 强制 default-deny,跨 namespace 必须显式 allow;(3) Pod Security Standards(restricted);(4) hierarchical-namespaces-controller(HNC)实现 namespace 树;(5) Capsule 4.0 做 Tenant CRD,一个 Tenant 包含多个 namespace + RBAC + 配额。核心痛点是"成本归属",我们用 OpenCost label 把每个 Tenant 的成本归算到 cost-center,FinOps 团队按月出账。这套机制下,1850 个服务、187 个 Tenant、13 个 Cluster 实现真正的"集群即平台",而不是 350 个独立 cluster 的灾难。
三十五、引申二十三:KCL / Pulumi / CDK8s 与 YAML 之争
2026 年 K8s 配置语言百花齐放:(1) 纯 YAML + Kustomize:传统派,简单但冗长;(2) Helm:模板派,功能强但 .Values 心智负担重;(3) Pulumi / CDK8s:代码派,Go / TypeScript / Python 写 manifest,适合复杂逻辑;(4) KCL(Kubernetes Configuration Language):配置即代码 DSL,蚂蚁开源,性能好;(5) CUE:Google 开源,schema + 数据一体,适合大规模配置治理。我们公司不同场景用不同工具:(a) 业务团队简单服务 → Helm + Kustomize;(b) 平台抽象 → Crossplane Composition + Go function;(c) 跨云资源拓扑 → Pulumi(Terraform 替代);(d) 配置 schema 治理 → CUE。没有银弹,选择"团队能掌控的最简单方案"。
三十六、引申二十四:Tekton Pipeline as Code with Triggers
Tekton Triggers + EventListener 是 Pipeline-as-Code 的核心:(1) EventListener 接 GitHub / GitLab / Bitbucket webhook;(2) TriggerBinding 把 webhook payload 提取为参数;(3) TriggerTemplate 实例化 PipelineRun;(4) Interceptor 过滤事件(只接 PR / 只接特定 branch / 只接特定文件路径变化)。我们的高级用法:(a) GitHub Interceptor 校验 PR signature,防止伪造;(b) CEL Interceptor 写复杂逻辑(.payload.ref == 'refs/heads/main' && .payload.head_commit.modified.exists(x, x.startsWith('src/')));(c) Bitbucket Interceptor 自动给 PR 添加状态(running / success / failed);(d) Slack Interceptor 把失败 build 推到团队频道。这套机制 99% 替代 Jenkins webhook 配置,且 manifest 化可审计。
三十七、引申二十五:Observability as Code 与 OpenTelemetry
2026 年监控体系也在 GitOps 化。核心工具:(1) Prometheus Operator:ServiceMonitor / PodMonitor / PrometheusRule 全部 CRD 化;(2) Grafana Operator:Dashboard / DataSource 全部 CRD 化;(3) Loki Operator + Tempo Operator;(4) OpenTelemetry Operator:Collector 配置 CRD 化,自动 sidecar 注入。所有可观测性资源都进 manifest repo,经过 PR review,部署到所有集群,这是"可观测性即代码"的根本。我们公司有 470 个 Dashboard、1820 个 PrometheusRule、380 个 ServiceMonitor,全部 manifest 化管理,改一个 alert 走 PR 流程,可审计可回滚。这套机制让"监控配置漂移"成为历史,SOC 2 审计时直接给审计师 Git log 就能证明"all alerts have been reviewed"。
三十八、引申二十六:对未来 5 年 DevOps 的展望
2026-05 这个时点,对未来 5 年 DevOps 的判断:(1) 2027 年 Platform Engineering 全面取代传统 DevOps 角色,80% 中大型公司有专职 Platform Team;(2) 2028 年 AI Ops 深度集成,自然语言运维 + 智能 RCA 成为标配;(3) 2029 年 WASM 替代部分容器场景,启动时间从秒级降到毫秒级,适合 Serverless;(4) 2030 年量子加密 / 零信任 / 同态加密融入 CI/CD,从源码到生产全链路加密;(5) Multi-cloud / Hybrid / Edge 成为常态,单云架构成为少数派。这次踩坑录是我们对"DevOps 现代化"的实战注脚,希望每个平台工程师都能在 2026-2030 完成能力跃迁。技术之路漫长,但 CI/CD 这个 20 年的赛道每 5 年就有大变革,跟上节奏的人才有未来。
三十九、附:平台迁移的 90 天行动指南
给打算做类似迁移的团队一份 90 天行动清单。第 1-15 天:技术调研与团队培训,重点 ArgoCD / Tekton / Backstage / Crossplane 核心概念。第 16-30 天:测试环境搭建,选 3 个非关键服务先跑通,产出"参考实现"。第 31-45 天:业主团队培训,平台团队驻场支持,转化 50 个 Job。第 46-60 天:大规模迁移,平台团队提供模板与脚手架,业主团队主动迁移。第 61-75 天:Jenkins 下线,流量全切新平台,保留 fallback 30 天。第 76-90 天:可观测性 / FinOps / Security 全面治理,把 1850 个服务的元数据 / 成本 / 安全态势统一管理。这套 90 天指南是我们这次踩坑后的方法论,推荐给所有面临 CI/CD 现代化的团队。技术执行是一回事,组织变革是另一回事,两者同等重要。
四十、收尾感言
这次迁移录写到这里,14 天的痛苦慢慢沉淀成团队的财富。每一个 Tekton 模板、每一次 ArgoCD Sync、每一份 Backstage Catalog,都是 1850 个服务工程师体验的微小改进。把这些经验完整记下来,是对团队 14 天熬夜的尊重,也是对未来路过同样关口同行的礼物。技术之路漫长,愿这份文档能让你们少走 2 周弯路。
—— 别看了 · 2026