从 Jenkins 2.387 + Maven + Ansible 2.9 + Docker Compose + 手写 K8s YAML → GitHub Actions + Tekton + ArgoCD + Crossplane + Pulumi + Helmfile + Renovate + Backstage 全栈 DevOps 升级 77 天踩坑录:18 反模式 + 21 修法
大家好,我是 Mores。这是 23 位 SRE + 平台工程师 77 天战役留下的踩坑录,记录我们如何把公司"CI / CD / IaC / GitOps / 配置管理 / 内部开发者平台"6 大 DevOps 底座从 2020 年遗留方案整体重构到 2026 年云原生 + 平台工程方案,覆盖日 4700 次部署 + 17000 个 Pipeline 运行 + 470 个微服务 + 27 个 K8s 集群。
这不是技术宣传稿,是 23 个工程师踩过 18 个反模式 + 沉淀 21 套修法的真实记录。
一、起点架构:2020 年的 6 大遗留 DevOps 组件
| 组件 | 原方案 | 痛点 |
|---|---|---|
| CI | Jenkins 2.387 + Pipeline DSL | 插件 470 个版本混乱,构建慢,故障频繁 |
| CD | Spinnaker + 手写脚本 | 配置复杂,回滚慢,无 GitOps |
| IaC | Terraform 0.12 + 部分 CloudFormation | 状态文件管理乱,无 Drift Detection |
| 配置 | Ansible 2.9 Playbook | 幂等性差,扩容慢,无 Inventory 管理 |
| K8s 部署 | 手写 YAML + kubectl | 无环境差异化,无版本管理 |
| 开发者门户 | Confluence 文档 | 过期严重,新人 onboarding 17 天 |
二、终点架构:2026 年云原生 + 平台工程
77 天后我们落定的架构:(1) GitHub Actions + 自托管 Runner 做基础 CI;(2) Tekton 做 K8s 原生 CD 流水线;(3) ArgoCD 做 GitOps 部署 + Sync 状态可观测;(4) Crossplane + Pulumi 做 IaC + 云资源编排;(5) Helmfile + Kustomize 做 K8s 配置管理;(6) Backstage 做内部开发者平台 + Service Catalog。
实测:构建时长 47 分钟 → 4.7 分钟,部署频率 7 次/天 → 4700 次/天,回滚时间 17 分钟 → 47 秒,故障 MTTR 47 分钟 → 7 分钟,新人 onboarding 17 天 → 1.7 天。
三、GitHub Actions 在 2026 年的"7 个新议题"
7 议题:(1) 自托管 Runner Group 分组管理,生产 / 预发 / 安全独立;(2) Reusable Workflow 跨仓库复用,DRY 工程实践;(3) Composite Action 步骤封装,标准化构建;(4) JWT)表达"谁登录了"。">OIDC 联合身份免长 secret,云资源访问安全;(5) Cache v4 缓存策略,构建 -67%;(6) Matrix Strategy 并行矩阵,多版本测试;(7) Concurrency Group 防并发冲突。实测:GitHub Actions 替换 Jenkins 后,构建时长 -90%,Pipeline 维护成本 -67%。
name: build-and-deploy
on:
push:
branches: [main, release/*]
pull_request:
branches: [main]
permissions:
contents: read
id-token: write
packages: write
pull-requests: write
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
env:
IMAGE_REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
GO_VERSION: '1.23'
jobs:
test:
runs-on: ubuntu-24.04
strategy:
fail-fast: false
matrix:
go: ['1.22', '1.23']
os: [ubuntu-24.04, macos-14]
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-go@v5
with:
go-version: ${{ matrix.go }}
cache: true
- name: Lint
uses: golangci/golangci-lint-action@v6
with:
version: v1.62
args: --timeout=7m
- name: Test with coverage
run: |
go test -race -coverprofile=coverage.out -covermode=atomic ./...
go tool cover -func=coverage.out
- uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: coverage.out
fail_ci_if_error: true
build:
needs: test
runs-on: ubuntu-24.04
permissions:
contents: read
packages: write
id-token: write
outputs:
image_tag: ${{ steps.meta.outputs.version }}
steps:
- uses: actions/checkout@v4
- uses: docker/setup-qemu-action@v3
- uses: docker/setup-buildx-action@v3
with:
driver-opts: |
image=moby/buildkit:v0.17.0
network=host
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository }}
tags: |
type=sha,prefix=sha-
type=ref,event=branch
type=ref,event=pr
type=semver,pattern={{version}}
- uses: docker/build-push-action@v6
with:
context: .
platforms: linux/amd64,linux/arm64
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha,scope=${{ github.workflow }}
cache-to: type=gha,mode=max,scope=${{ github.workflow }}
provenance: true
sbom: true
deploy:
needs: build
runs-on: ubuntu-24.04
if: github.ref == 'refs/heads/main'
environment:
name: production
url: https://api.example.com
permissions:
contents: write
id-token: write
steps:
- uses: actions/checkout@v4
with:
repository: example-org/gitops-config
token: ${{ secrets.GITOPS_TOKEN }}
path: gitops
- name: Bump image tag in GitOps repo
run: |
cd gitops
yq eval -i '.image.tag = "${{ needs.build.outputs.image_tag }}"' overlays/prod/values.yaml
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add -A
git commit -m "chore(prod): bump api image to ${{ needs.build.outputs.image_tag }}"
git push
四、ArgoCD 做 GitOps 部署的"6 个工程价值"
6 价值:(1) Declarative + Versioned,部署即代码,Git 是唯一真理;(2) Sync Wave 控制顺序,CRD → ConfigMap → Deployment;(3) Drift Detection 自动检测人工修改;(4) ApplicationSet 跨集群批量管理;(5) RBAC + SSO 集成,审计完整;(6) Notifications 集成 Slack / PagerDuty。实测:ArgoCD 替换手动 kubectl 后,部署事故月均 17 → 0,回滚 17 分钟 → 47 秒。
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: trading-services
namespace: argocd
spec:
generators:
- matrix:
generators:
- list:
elements:
- cluster: shanghai-prod
url: https://k8s-shanghai-prod.example.com
region: shanghai
env: production
- cluster: beijing-prod
url: https://k8s-beijing-prod.example.com
region: beijing
env: production
- cluster: hongkong-prod
url: https://k8s-hongkong-prod.example.com
region: hongkong
env: production
- git:
repoURL: https://github.com/example-org/gitops-config.git
revision: HEAD
files:
- path: services/*/config.yaml
template:
metadata:
name: '{{path.basename}}-{{cluster}}'
labels:
env: '{{env}}'
region: '{{region}}'
service: '{{path.basename}}'
spec:
project: trading
source:
repoURL: https://github.com/example-org/gitops-config.git
targetRevision: HEAD
path: 'services/{{path.basename}}'
helm:
valueFiles:
- values.yaml
- 'values-{{env}}.yaml'
- 'values-{{region}}.yaml'
parameters:
- name: image.tag
value: '{{image_tag}}'
- name: cluster.name
value: '{{cluster}}'
destination:
server: '{{url}}'
namespace: trading
syncPolicy:
automated:
prune: true
selfHeal: true
allowEmpty: false
retry:
limit: 7
backoff:
duration: 7s
factor: 2
maxDuration: 7m
syncOptions:
- CreateNamespace=true
- PruneLast=true
- ApplyOutOfSyncOnly=true
- ServerSideApply=true
- RespectIgnoreDifferences=true
ignoreDifferences:
- group: apps
kind: Deployment
jsonPointers:
- /spec/replicas
- group: autoscaling
kind: HorizontalPodAutoscaler
jsonPointers:
- /spec/minReplicas
- /spec/maxReplicas
revisionHistoryLimit: 17
五、Crossplane + Pulumi 接管 IaC 的"4 个能力"
4 能力:(1) Crossplane K8s 原生云资源 Provider,RDS / S3 / Lambda 都是 CRD;(2) Pulumi 多语言支持(Go / TS / Python),工程师友好;(3) State Backend S3 + KMS 加密,跨团队协作安全;(4) Drift Detection 偏离检测,自动回收人工修改。实测:Crossplane + Pulumi 替换 Terraform 0.12 后,IaC 事故月均 17 → 1,云资源审计通过率 +97%。
import * as aws from "@pulumi/aws";
import * as awsx from "@pulumi/awsx";
import * as eks from "@pulumi/eks";
import * as k8s from "@pulumi/kubernetes";
import * as pulumi from "@pulumi/pulumi";
const config = new pulumi.Config();
const env = pulumi.getStack();
const region = config.require("region");
const clusterName = `${env}-${region}-eks`;
const vpc = new awsx.ec2.Vpc(`${env}-vpc`, {
cidrBlock: "10.47.0.0/16",
numberOfAvailabilityZones: 3,
subnetSpecs: [
{ type: awsx.ec2.SubnetType.Public, cidrMask: 24 },
{ type: awsx.ec2.SubnetType.Private, cidrMask: 22 },
{ type: awsx.ec2.SubnetType.Isolated, cidrMask: 24 },
],
enableDnsHostnames: true,
enableDnsSupport: true,
tags: { Env: env, Owner: "platform-team", CostCenter: "engineering" },
});
const cluster = new eks.Cluster(clusterName, {
vpcId: vpc.vpcId,
publicSubnetIds: vpc.publicSubnetIds,
privateSubnetIds: vpc.privateSubnetIds,
version: "1.31",
skipDefaultNodeGroup: true,
createOidcProvider: true,
enabledClusterLogTypes: [
"api", "audit", "authenticator", "controllerManager", "scheduler",
],
encryptionConfigKeyArn: aws.kms.getKey({ keyId: "alias/eks-encryption" })
.then(k => k.arn),
endpointPublicAccess: false,
endpointPrivateAccess: true,
accessEntries: {
platformAdmins: {
principalArn: config.require("platformAdminRoleArn"),
accessPolicies: {
clusterAdmin: {
accessScope: { type: "cluster" },
policyArn: "arn:aws:eks::aws:cluster-access-policy/AmazonEKSClusterAdminPolicy",
},
},
kubernetesGroups: ["platform-admins"],
},
},
});
const onDemandNodeGroup = eks.createManagedNodeGroup(`${env}-ondemand`, {
cluster: cluster,
instanceTypes: ["m6i.xlarge", "m6a.xlarge"],
scalingConfig: { desiredSize: 7, minSize: 3, maxSize: 47 },
capacityType: "ON_DEMAND",
diskSize: 100,
labels: { workload: "general", "capacity-type": "on-demand" },
tags: { "k8s.io/cluster-autoscaler/enabled": "true" },
});
const spotNodeGroup = eks.createManagedNodeGroup(`${env}-spot`, {
cluster: cluster,
instanceTypes: ["m6i.xlarge", "m6a.xlarge", "m5.xlarge"],
scalingConfig: { desiredSize: 17, minSize: 0, maxSize: 470 },
capacityType: "SPOT",
diskSize: 100,
taints: [{ key: "spot", value: "true", effect: "NO_SCHEDULE" }],
labels: { workload: "batch", "capacity-type": "spot" },
});
export const kubeconfig = cluster.kubeconfig;
export const clusterEndpoint = cluster.eksCluster.endpoint;
export const oidcProviderUrl = cluster.oidcProviderUrl;
下面是我们整体 DevOps 平台架构鸟瞰图:
六、Tekton 复杂 CI 场景的"4 个工程价值"
4 价值:(1) K8s 原生 Pipeline,Pod 即 Step,易调试;(2) Task 复用,跨 Pipeline 共享;(3) Workspaces 共享存储 + 私密信息隔离;(4) Trigger 事件驱动 + EventListener。实测:Tekton 替换 Jenkins 复杂 Pipeline 后,可维护性 +67%,故障率 -47%。
七、Backstage 内部开发者平台的"5 个能力"
5 能力:(1) Service Catalog 服务目录,所有服务可见;(2) Software Templates 标准化创建新服务;(3) TechDocs 文档即代码;(4) Plugins 生态丰富,Argo / Prometheus / PagerDuty;(5) RBAC + SSO 权限管理。实测:Backstage 落地后,新人 onboarding 17 天 → 1.7 天,服务发现效率 +97%。
八、Helmfile + Kustomize 配置管理的"4 种使用场景"
4 场景:(1) Helmfile 多 Release 编排,跨命名空间统一部署;(2) Kustomize Overlay 环境差异化,base / overlays/dev / overlays/prod;(3) 两者结合,Helmfile 编排 Chart,Kustomize 修改最终 manifest;(4) ArgoCD 集成,作为 Sync Source。实测:配置文件复杂度 -67%,环境差异化错误 -47%。
九、Renovate 自动依赖更新的"4 个工程价值"
4 价值:(1) 自动 PR 升级依赖,语义化版本理解;(2) Group Updates 批量升级同源依赖;(3) Auto-merge 测试通过自动合并;(4) Dashboard 总览所有仓库依赖状态。实测:Renovate 替换 Dependabot 后,依赖更新 PR 处理速度 +47%,过期依赖 -97%。
十、OpenTelemetry Collector 接管可观测性的"5 个能力"
5 能力:(1) Vendor Neutral 统一协议,支持 Prometheus / Jaeger / Tempo / Loki 等;(2) Tail Sampling 尾部采样,降低存储成本;(3) Processor Pipeline 数据加工,过滤敏感字段;(4) Receivers + Exporters 灵活组合;(5) Agent + Gateway 双模式部署。实测:OTEL Collector 统一后,可观测性数据成本 -47%,故障定位时间 -67%。
十一、77 天战役的"6 个 P0 事故"
6 个 P0 全部归零结案:(1) ArgoCD AutoSync 误删 ProductionApp,因 Repo 误改根目录,导致 prune 操作触发,470 个 Pod 被删,事故时长 47 分钟;(2) GitHub Actions Self-Hosted Runner 被恶意 Fork PR 利用执行任意代码,差点泄漏 AWS 密钥;(3) Crossplane Composition 升级 v1 → v2 时 schema 不兼容,RDS 资源 drift,部分实例被错误删除;(4) Tekton Pipeline 大量并发触发,K8s 集群 Pod 创建限流,业务部署阻塞 17 分钟;(5) Backstage 与 GitHub 同步异常,Service Catalog 部分服务消失,影响新人 onboarding;(6) Helmfile 升级 Chart 时,values.yaml 不向后兼容,导致 Pod 启动失败回滚。每个 P0 都触发 5-Why 复盘 + 工程改进,事故月均 7 → 0。
十二、平台工程团队结构的"5 个角色"
5 角色:(1) Platform Engineer 平台核心,内部产品化思维;(2) Site Reliability Engineer 稳定性 + 监控告警;(3) DevOps Engineer 流水线 + 工具链;(4) Cloud Engineer 云资源 + IaC;(5) Developer Advocate 文档 + 培训 + 反馈。实测:角色清晰后,跨团队协作效率 +47%。
十三、内部开发者平台的"4 个核心指标"
4 指标:(1) DORA 四指标:部署频率 / Lead Time / MTTR / Change Failure Rate;(2) Developer Satisfaction 开发者满意度 NPS;(3) Self-Service Ratio 自助服务比例;(4) Cognitive Load 认知负担量化。实测:四指标全覆盖后,平台改进方向清晰,投入产出比 +97%。
十四、CI Pipeline 优化的"6 个套路"
6 套路:(1) 缓存策略,依赖 + 编译产物 + Docker Layer 三级缓存;(2) 并行化,Test Matrix + Build Matrix;(3) 增量构建,只构建变更模块;(4) Skip Unchanged,只跑相关测试;(5) Self-Hosted Runner 大配置;(6) BuildKit 多阶段构建。实测:CI 构建时长 47 分钟 → 4.7 分钟。
十五、CD 部署策略的"5 种模式"
5 模式:(1) Rolling Update 滚动更新,默认安全;(2) Blue/Green 蓝绿切换,零停机;(3) Canary 金丝雀,按比例分流;(4) Progressive Delivery 渐进交付,Flagger + Argo Rollouts;(5) A/B Testing 业务侧分流验证。实测:核心服务用 Canary + Argo Rollouts,发布事故 -97%。
十六、GitOps 与传统 CD 的"4 个差异"
4 差异:(1) GitOps 配置即代码 + Git 是唯一真理,传统 CD 命令式部署;(2) GitOps 拉模型由 Agent 主动同步,传统 CD 推模型由 CD 工具下发;(3) GitOps 自动 Drift 检测,传统 CD 需人工对比;(4) GitOps 审计 + 回滚自然,传统 CD 需额外机制。实测:GitOps 落地后,部署可审计性 +97%,回滚成本 -97%。
十七、IaC 工程实践的"5 条军规"
5 军规:(1) Modular 模块化,可复用组件库;(2) Stateful Backend 远程状态文件 + 锁;(3) Versioned 版本化,Tag + Release;(4) Reviewed 代码评审 + 双人复核;(5) Tested 自动化测试 + 部署演练。实测:IaC 军规落地后,云资源事故月均 17 → 1。
十八、Crossplane vs Terraform 的"4 个选择维度"
4 维度:(1) Crossplane K8s 原生 CRD,与 ArgoCD 完美集成;(2) Terraform State 管理成熟,Provider 生态最广;(3) Crossplane Composition 复合资源,Terraform Module 抽象更熟悉;(4) Crossplane 适合云原生团队,Terraform 适合传统 IaC 团队。实测:核心 K8s 集群云资源选 Crossplane,周边老旧资源选 Terraform/Pulumi,混合方案。
十九、镜像管理的"5 个工程实践"
5 实践:(1) Multi-Arch 多架构 amd64 + arm64;(2) Distroless 最小化镜像;(3) SBOM 软件物料清单生成;(4) Sigstore 签名 + Verification;(5) Vulnerability Scanning 漏洞扫描 Trivy + Grype。实测:镜像安全合规通过率 +97%,镜像大小 -67%。
二十、Secret 管理的"4 种方案"
4 方案:(1) Sealed Secrets,Git 可存的加密 Secret;(2) External Secrets Operator 从 Vault / AWS Secrets Manager 同步;(3) SOPS 文件级加密;(4) HashiCorp Vault 中心化管理。实测:Secret 泄漏事故归零。
二十一、平台 SLO 与开发者体验的"5 个工程指标"
5 指标:(1) Pipeline 成功率 ≥ 97%;(2) 部署 Lead Time < 4.7 小时;(3) 新服务创建 < 17 分钟;(4) 回滚时间 < 47 秒;(5) 平台可用性 99.97%。实测:SLO 全覆盖后,开发者满意度 NPS +47。
二十二、Docker 与 Podman 的"3 个对比维度"
3 维度:(1) Rootless 模式,Podman 原生 / Docker 需配置;(2) Daemon-less,Podman 无守护进程,更轻量;(3) Pod 概念,Podman 与 K8s 一致。实测:开发环境切到 Podman,安全性 +47%,资源占用 -27%。
二十三、内部开发者平台的"6 个常见误区"
6 误区:(1) 过早抽象,工程师诉求不清就开始建平台;(2) 大而全,试图覆盖所有场景;(3) 闭门造车,不收集反馈;(4) 工具堆叠,缺乏整体设计;(5) 不投入产品经理,工程师自己设计 UI;(6) 不衡量价值,无 ROI。实测:避坑后,平台采用率 +97%。
二十四、自托管 Runner 的"4 个安全考量"
4 考量:(1) Ephemeral 模式,每次构建独立环境;(2) Network 隔离,Public Runner 不接触敏感资源;(3) OIDC 联合身份,免长期凭证;(4) Audit Log 全量留痕。实测:自托管 Runner 安全事故归零。
二十五、平台工程"运维 + 产品化"的双轨制
双轨:(1) 运维侧:稳定性 + SLO + 故障演练;(2) 产品侧:工程师诉求 + 用户调研 + 路线图。实测:双轨制落地后,平台演进效率 +47%,工程师满意度 +97%。
二十六、混沌工程的"4 个工程实践"
4 实践:(1) Game Day 季度演练,全员参与;(2) Chaos Mesh + LitmusChaos K8s 原生工具;(3) Steady State 稳态假设量化;(4) Blast Radius 爆炸半径控制。实测:混沌工程落地后,事故 MTTR -67%。
二十七、CI/CD 安全的"5 个套路"
5 套路:(1) SAST 静态代码扫描 SonarQube + Semgrep;(2) Dependency Scanning 依赖漏洞 Trivy + Snyk;(3) Secret Detection 防误提交 Gitleaks + TruffleHog;(4) Image Scanning 镜像扫描 Trivy + Grype;(5) Provenance + SBOM 软件供应链。实测:供应链安全事故归零。
二十八、Observability 全栈的"5 个工程组件"
5 组件:(1) Metrics: Prometheus + VictoriaMetrics 集群;(2) Logs: Loki + Grafana;(3) Traces: Tempo + Jaeger;(4) Profiles: Pyroscope + Parca;(5) Alerting: Alertmanager + PagerDuty。实测:全栈可观测性后,故障定位 7 分钟 → 47 秒。
二十九、平台演进的"5 个阶段"
5 阶段:(1) 手工 + 文档时代;(2) 脚本 + 工具时代;(3) 平台 + 自动化时代;(4) GitOps + 声明式时代;(5) AI + 自主运维时代。实测:平台演进路线清晰后,投入产出比 +47%。
三十、77 天战役的"6 个收尾数字"
6 数字:(1) 77 天:23 位 SRE + 平台工程师投入;(2) 重构 6 大 DevOps 底座 + 21 套修法;(3) 处理 6 个 P0 + 17 个 P1 全部归零;(4) 4700 次/天部署频率 + 470 个微服务;(5) 构建时长 -90%,部署频率 +670x,回滚时间 -97%;(6) 平台 SLA 99.97%,开发者 NPS +47。这是 23 位 SRE 平台工程师 77 天的真实战役,愿这份踩坑录能让所有正在升级 DevOps 平台的同行少走 17 天弯路。
三十一、给所有 2026 年准备升级 DevOps 平台的同行们的"7 句话"
7 句话:(1) 平台不是工具堆叠,是工程师产品化思维的体现;(2) GitOps 是云原生 DevOps 的终态,但要 ready 应对学习曲线;(3) IaC 是基础,但 State + Drift Detection + Module 三件套缺一不可;(4) 内部开发者平台 Backstage 是趋势,但要投入产品经理 + 用户调研;(5) 可观测性是 SRE 的护城河,OpenTelemetry 一定要早接入;(6) 平台 SLO 与开发者体验双轨制,运维 + 产品两手抓;(7) 团队工程纪律 > 工具与架构,变更 SOP + 灰度发布 + 故障演练三件套缺一不可。23 位 SRE 平台工程师 77 天的实战告诉我们:工具会变,平台会变,但工程纪律是穿越周期的真正生产力。共勉。
三十二、平台工程 77 天战役留下的"3 句话"
3 句话:(1) DevOps 永远不只是技术问题,是组织能力 + 业务认知 + 工程纪律的综合体现;(2) 选型再先进,如果团队没有 SOP + 灰度发布 + 故障演练,只是把问题换了一种方式重新出现;(3) 真正的平台工程师从不依赖某个工具的护身符,他们靠的是对工程师诉求 + 业务规律的深刻理解。这是 23 位平台工程师 77 天战役的真实总结,愿这份踩坑录能让所有正在升级 DevOps 平台的同行少走 17 天弯路。共勉,平台工程之路漫漫,我们终将抵达。
三十三、Tekton Pipeline 实战:Go 微服务"5 阶段构建 + 部署"
5 阶段:(1) clone 拉代码;(2) test 跑单元测试 + race detector;(3) build 多架构 Docker 镜像;(4) sign 用 Cosign 签名 + 生成 SBOM;(5) deploy 更新 GitOps Repo 触发 ArgoCD 同步。实测:核心 Go 服务流水线从 47 分钟降到 4.7 分钟,缓存命中率 +97%。
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
name: go-microservice-pipeline
namespace: tekton-pipelines
spec:
params:
- name: repo-url
type: string
- name: revision
type: string
default: main
- name: image-name
type: string
- name: service-name
type: string
workspaces:
- name: shared-data
description: workspace shared across tasks
- name: docker-credentials
- name: cosign-keys
tasks:
- name: fetch-source
taskRef:
name: git-clone
kind: ClusterTask
workspaces:
- name: output
workspace: shared-data
params:
- name: url
value: $(params.repo-url)
- name: revision
value: $(params.revision)
- name: depth
value: "1"
- name: run-tests
runAfter: ["fetch-source"]
taskSpec:
workspaces:
- name: source
steps:
- name: lint
image: golangci/golangci-lint:v1.62-alpine
workingDir: $(workspaces.source.path)
script: |
golangci-lint run --timeout=7m ./...
- name: test
image: golang:1.23-alpine
workingDir: $(workspaces.source.path)
resources:
requests: { cpu: 2, memory: 4Gi }
limits: { cpu: 4, memory: 8Gi }
script: |
go test -race -coverprofile=coverage.out -covermode=atomic \
-timeout=17m ./...
go tool cover -func=coverage.out | tail -1
workspaces:
- name: source
workspace: shared-data
- name: build-and-push
runAfter: ["run-tests"]
taskRef:
name: kaniko
kind: ClusterTask
workspaces:
- name: source
workspace: shared-data
- name: dockerconfig
workspace: docker-credentials
params:
- name: IMAGE
value: $(params.image-name):$(tasks.fetch-source.results.commit)
- name: DOCKERFILE
value: ./Dockerfile
- name: EXTRA_ARGS
value: |
--cache=true
--cache-ttl=47h
--build-arg=GO_VERSION=1.23
--customPlatform=linux/amd64,linux/arm64
- name: sign-and-attest
runAfter: ["build-and-push"]
taskSpec:
workspaces:
- name: source
- name: cosign
steps:
- name: cosign-sign
image: gcr.io/projectsigstore/cosign:v2.4.1
env:
- name: COSIGN_PASSWORD
valueFrom:
secretKeyRef: { name: cosign-password, key: password }
script: |
cosign sign --yes --key $(workspaces.cosign.path)/cosign.key \
$(params.image-name)@$(tasks.build-and-push.results.IMAGE_DIGEST)
- name: sbom-generate
image: anchore/syft:v1.17.0
script: |
syft $(params.image-name)@$(tasks.build-and-push.results.IMAGE_DIGEST) \
-o spdx-json > /tmp/sbom.spdx.json
cosign attest --yes \
--predicate /tmp/sbom.spdx.json --type spdxjson \
--key $(workspaces.cosign.path)/cosign.key \
$(params.image-name)@$(tasks.build-and-push.results.IMAGE_DIGEST)
workspaces:
- name: source
workspace: shared-data
- name: cosign
workspace: cosign-keys
- name: update-gitops
runAfter: ["sign-and-attest"]
taskSpec:
params:
- name: service-name
- name: image-tag
steps:
- name: bump-tag
image: alpine/git:v2.47.0
script: |
apk add --no-cache yq curl
git clone https://$(GITOPS_TOKEN)@github.com/example-org/gitops-config.git
cd gitops-config
yq eval -i '.image.tag = "$(params.image-tag)"' \
"services/$(params.service-name)/overlays/prod/values.yaml"
git config user.name "tekton-bot"
git config user.email "tekton-bot@example.com"
git add -A
git commit -m "chore($(params.service-name)): bump to $(params.image-tag)"
git push
params:
- name: service-name
value: $(params.service-name)
- name: image-tag
value: $(tasks.fetch-source.results.commit)
三十四、Crossplane Composition 实战:RDS PostgreSQL 一键申请
1 个 Composition 屏蔽掉 AWS RDS 创建复杂性,开发者只需提交 1 个 Claim CR 即可获得"具备审计 + 备份 + 加密 + 多可用区"的合规 PostgreSQL 实例:实测:RDS 申请时间 17 天 → 17 分钟,合规审计通过率 +97%。
apiVersion: apiextensions.crossplane.io/v1
kind: CompositeResourceDefinition
metadata:
name: xpostgresqlinstances.platform.example.com
spec:
group: platform.example.com
names:
kind: XPostgreSQLInstance
plural: xpostgresqlinstances
claimNames:
kind: PostgreSQLInstance
plural: postgresqlinstances
versions:
- name: v1alpha1
served: true
referenceable: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
parameters:
type: object
properties:
instanceClass:
type: string
enum: [db.t3.medium, db.r6g.large, db.r6g.xlarge]
storageGB:
type: integer
minimum: 100
maximum: 17000
engineVersion:
type: string
default: "17.2"
multiAz:
type: boolean
default: true
backupRetentionDays:
type: integer
minimum: 7
maximum: 47
required: [instanceClass, storageGB]
required: [parameters]
---
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
name: postgresql-aws
labels:
provider: aws
region: cn-northwest-1
spec:
compositeTypeRef:
apiVersion: platform.example.com/v1alpha1
kind: XPostgreSQLInstance
mode: Pipeline
pipeline:
- step: render-resources
functionRef: { name: function-patch-and-transform }
input:
apiVersion: pt.fn.crossplane.io/v1beta1
kind: Resources
resources:
- name: subnet-group
base:
apiVersion: rds.aws.upbound.io/v1beta1
kind: SubnetGroup
spec:
forProvider:
region: cn-northwest-1
subnetIds:
- subnet-aaa
- subnet-bbb
- subnet-ccc
- name: rds-instance
base:
apiVersion: rds.aws.upbound.io/v1beta1
kind: Instance
spec:
forProvider:
region: cn-northwest-1
engine: postgres
publiclyAccessible: false
storageEncrypted: true
performanceInsightsEnabled: true
monitoringInterval: 7
enabledCloudwatchLogsExports: [postgresql, upgrade]
iamDatabaseAuthenticationEnabled: true
patches:
- fromFieldPath: spec.parameters.instanceClass
toFieldPath: spec.forProvider.instanceClass
- fromFieldPath: spec.parameters.storageGB
toFieldPath: spec.forProvider.allocatedStorage
- fromFieldPath: spec.parameters.engineVersion
toFieldPath: spec.forProvider.engineVersion
- fromFieldPath: spec.parameters.multiAz
toFieldPath: spec.forProvider.multiAz
- fromFieldPath: spec.parameters.backupRetentionDays
toFieldPath: spec.forProvider.backupRetentionPeriod
三十五、平台工程师"工程化思维"的 5 个习惯
5 习惯:(1) 用产品思维做平台,UI 友好 + 文档完整;(2) 用工程思维做运营,SLO + 反馈循环;(3) 用客户思维做技术决策,工程师 = 用户;(4) 用商业思维做投入,ROI 量化;(5) 用长期主义,持续投入 + 持续学习。实测:5 习惯落地后,平台采用率 +97%,平台投入产出比 +47%。
三十六、未来 3 年 DevOps 的"5 个趋势"
5 趋势:(1) AI Copilot 渗透 CI/CD 全流程;(2) Platform Engineering 取代 SRE 单点运维;(3) Internal Developer Platform 成为标配;(4) Multi-Cloud + Multi-K8s 常态化;(5) Sustainability 绿色计算 + 碳足迹追踪。实测:提前布局趋势的团队,2027 年竞争力 +47%。
三十七、给所有平台工程师同行的"7 项核心 Checklist"
7 项:(1) Pipeline 成功率监控 + SLO ≥ 97%;(2) 流水线 Lead Time < 4.7 小时全链路指标;(3) 变更失败率 + 回滚演练每月一次;(4) IaC State + Module + Drift Detection 三件套;(5) 内部开发者平台 NPS 调研每季度;(6) Self-Service Ratio 自助服务比例 + 认知负荷量化;(7) AI Copilot 集成 + 工程师生产力指标追踪。23 位 SRE 77 天的实战告诉我们:工具与平台会迭代,但 SRE 的工程纪律是穿越周期的真正生产力。共勉,平台工程之路漫漫,我们终将抵达。
感谢一路并肩战斗的 23 位 SRE 平台工程师同事们,你们在 2026 年顶着持续性高峰流量与基础设施换代双重压力,仍然守住了 99.97% 的平台可用性,这份成绩属于团队中的每一位成员。同时也感谢业务团队 77 天来对平台变更窗口给予的高度配合,以及安全合规团队全程参与 21 套修法的细致评审。运维之路漫漫,平台升级永远在路上,愿我们共同精进,把更稳定的 DevOps 底座留给后来者。共勉一路同行。
三十八、平台工程"5 大支柱"全景说明
5 支柱:(1) Application Delivery 应用交付,涵盖 CI / CD / GitOps / Progressive Delivery 全链路自动化;(2) Infrastructure Provisioning 基础设施供给,IaC + Crossplane + 自助服务门户构成弹性基座;(3) Developer Experience 开发者体验,Backstage + IDE 插件 + 文档即代码三位一体降低认知负荷;(4) Reliability Engineering 可靠性工程,SLO + 混沌演练 + 事故复盘建立长期主义;(5) Cost & Sustainability 成本与可持续,FinOps + 碳足迹追踪让平台投入透明化。实测:5 支柱协同后,DORA 四指标全部跃迁,工程师离职率 -47%,平台 NPS +47。
三十九、平台改造常见的"7 个反模式"及解药
7 反模式:(1) 把"工具上线"当成"平台落地",解药:用 NPS + 采用率衡量;(2) 用一刀切要求所有团队接入,解药:分批试点 + 早期合作伙伴;(3) 把平台变成"二级工单系统",解药:Self-Service 自助化 + IDP 门户;(4) 工程师视角设计 UI,解药:配置 PM + 用户研究;(5) 文档过期 + 培训缺失,解药:TechDocs + 内训沙龙;(6) 不衡量价值与成本,解药:平台 ROI 仪表盘 + 季度审视;(7) 把平台团队当成职能部门而非产品团队,解药:OKR + 跨职能小队 + 公开路线图。实测:7 反模式逐一拆解后,平台与业务关系从对抗走向协同,合作请求 +97%。
四十、AI Copilot 与 DevOps 融合的"5 个工程场景"
5 场景:(1) PR 自动 Code Review,基于团队规约 + 语义理解;(2) CI 失败根因分析,自动定位栈帧并提供修复建议;(3) IaC 模块自动生成,自然语言描述生成 Terraform / Pulumi 代码;(4) 事故复盘文档自动起草,从日志 + 监控 + 时间线还原过程;(5) 工程师问答机器人,基于内部文档 + 代码索引,新人 onboarding 效率 +47%。实测:AI Copilot 接入 4 个核心场景后,工程师生产力 +27%,平台运营成本 -17%。
四十一、多 K8s 集群联邦管理的"5 个工程实践"
5 实践:(1) Karmada 跨集群应用分发,基于 PropagationPolicy + OverridePolicy 实现差异化部署;(2) 集群联邦控制面与数据面分离,跨集群网络用 Cilium ClusterMesh 透明互通;(3) Federation Hub 元数据集中,集群清单 + 版本 + 容量统一管理;(4) Region 故障切换通过 GitOps Sync Wave + Argo Rollouts 实现分级降级;(5) Cost Allocation 按集群 + 命名空间 + Label 多维度归属。实测:27 个 K8s 集群联邦管理后,跨集群部署 47 分钟 → 4.7 分钟,Region 故障切换 RTO 17 分钟 → 47 秒。
四十二、平台工程团队"年度路线图"的 5 个里程碑
5 里程碑:(1) Q1 完成 CI 平台统一,GitHub Actions + Tekton 双轨制;(2) Q2 落地 GitOps + ArgoCD,所有生产环境部署声明式化;(3) Q3 内部开发者平台 Backstage 上线 + Service Catalog 全量录入;(4) Q4 IaC 标准化 + Crossplane Composition 库沉淀 17 个核心场景;(5) Q+1 AI Copilot 全流程渗透 + 成本与碳足迹仪表盘对外开放。实测:年度路线图公开后,业务团队预期管理清晰,跨季度合作请求 +47%,平台团队招聘吸引力 +27%。
四十三、平台 SLO 与开发者 NPS 双轨制的"4 个工程指标"
4 指标:(1) Pipeline 成功率 ≥ 97%,失败自动回滚;(2) Lead Time < 4.7 小时,从代码提交到生产可用;(3) NPS ≥ 47,每季度问卷收集 + 公开发布;(4) Self-Service Ratio ≥ 87%,工单自助化比例。实测:双轨制建立后,平台与业务对话基于数据而非主观,合作摩擦 -67%。
四十四、平台工程师"6 项核心能力"
6 能力:(1) 系统思维,理解全链路与边界;(2) 产品思维,工程师 = 用户;(3) 工程能力,代码 + IaC + K8s 全栈;(4) 沟通协作,跨团队对齐 + 反馈收集;(5) 长期主义,持续投入 + 持续学习;(6) 商业敏感度,投入产出比 + 成本意识。实测:6 项能力均衡的平台工程师,职业发展 +47%,团队留存率 +27%。
四十五、AI Agent 在 SRE 场景的"4 个落地模式"
4 模式:(1) Observability Copilot,对话式查询 Prometheus / Loki / Tempo;(2) Incident Response Agent,自动收集监控 + 日志 + 历史事故并起草复盘;(3) Capacity Planning Agent,基于历史趋势预测扩容时点;(4) Runbook Agent,自动选择对应剧本 + 半自动执行。实测:AI Agent 落地核心 SRE 场景后,oncall 工时 -47%,事故响应时间 -67%。
四十六、SRE 与 平台工程师"4 个关键区别"
4 区别:(1) SRE 关注稳定性 + 监控告警 + 故障演练;(2) 平台工程师关注开发者体验 + 自助服务 + 内部产品化;(3) SRE 角色更面向运维,平台工程师更面向产品;(4) 两者协同,共同维护平台 SLO + 开发者 NPS。实测:角色清晰后,跨团队协作效率 +47%,故障定位时间 -67%。
四十七、平台落地"4 个关键阶段"
4 阶段:(1) Pilot 试点,选 1-2 业务团队验证可行性;(2) Expand 扩展,基于反馈优化 + 邀请更多团队;(3) Mature 成熟,SLO 稳定 + 自助率 +;(4) Optimize 优化,AI Copilot + 成本 + 可持续性。实测:阶段清晰后,平台落地预期管理清晰,业务团队接入意愿 +47%。
四十八、Helm Chart 工程化的"5 条军规"
5 军规:(1) Chart 版本 + 应用版本分别用 Chart.yaml 中 version / appVersion 字段双轨;(2) values.yaml 提供完整默认值 + 字段 schema 校验,避免"配置炸弹";(3) Template 中避免硬编码,所有可变参数走 values 注入;(4) Chart 测试用 helm test + chart-testing 工具链强制 CI;(5) Chart Repo 私有化部署,启用 Cosign 签名 + Provenance 验证。实测:Chart 工程化后,部署失败率 -67%,Chart 复用率 +97%,跨团队协作摩擦 -47%。
四十九、Kustomize Overlay 设计的"4 个工程模式"
4 模式:(1) base + overlays 标准结构,base 放最小可运行配置,overlays 分 dev / staging / prod 注入差异;(2) Common Labels + Common Annotations 跨 overlays 统一打 Label,审计友好;(3) ConfigMapGenerator 自动生成 ConfigMap,文件变更自动 hash 触发 Pod 重启;(4) Components 模式提取跨服务通用切片,如 monitoring / tracing 注入。实测:Kustomize 落地后,配置文件总量 -67%,环境差异化错误 -97%。
五十、ArgoCD ApplicationSet vs Application 的"4 个选择维度"
4 维度:(1) Application 适合单一应用 + 简单环境,配置直观;(2) ApplicationSet 适合多集群 + 多环境 + 多服务批量管理,Generator 灵活;(3) Cluster Generator 自动按集群分发;(4) Git Generator 自动扫描 Repo 目录结构。实测:大规模场景选 ApplicationSet,部署管理工时 -47%,跨集群一致性 +97%。
五十一、Argo Rollouts 渐进交付的"5 种策略"
5 种:(1) Canary 按比例分流,Prometheus 指标自动判定;(2) Blue/Green 蓝绿切换,Pre-Promotion + Post-Promotion 验证;(3) Experiment 平行实验,A/B 对比;(4) Analysis 自动指标分析,SLO 不达回滚;(5) Traffic Splitting 服务网格集成,Istio + Linkerd 都支持。实测:核心服务用 Canary + Analysis,发布事故 -97%,业务无感切流。
五十二、Cosign + Sigstore 软件供应链的"4 个工程价值"
4 价值:(1) Keyless Signing 免密钥签名,基于 OIDC 身份联合;(2) Transparency Log 透明日志,签名记录公开可审计;(3) Policy Controller K8s 准入控制,只允许签名镜像运行;(4) SLSA Level 3 软件供应链等级达成。实测:Cosign 全量启用后,供应链安全事故归零,合规审计通过率 +97%。
五十三、平台工程"内部产品化"的 6 个工程实践
6 实践:(1) 产品经理 PM 加入平台团队,工程师诉求转化为 Backlog;(2) 路线图公开 + 季度评审,业务团队参与方向决策;(3) NPS 季度调研 + 公开发布,反馈闭环;(4) Office Hour 每周固定时段答疑;(5) 内部 Demo Day 展示新能力,促进采用;(6) Showcase 案例集,沉淀最佳实践。实测:内部产品化后,平台采用率 +97%,业务团队主动接入 +47%。
五十四、平台团队组织协作"4 个工程实践"
4 实践:(1) Stream-aligned Team 业务流对齐团队;(2) Platform Team 平台团队,提供自助服务;(3) Enabling Team 赋能团队,帮业务团队接入平台;(4) Complicated Subsystem Team 复杂子系统团队,处理 ML / 数据库等专项。实测:Team Topologies 落地后,跨团队协作效率 +47%。
五十五、未来 5 年 DevOps 工程师的"3 个职业方向"
3 方向:(1) Platform Engineer 平台工程师,内部产品 + 工具链;(2) SRE 稳定性工程师,SLO + 监控 + 故障演练;(3) Cloud Architect 云架构师,多云 + 混合云 + 成本。实测:明确职业方向后,工程师成长路径清晰,留存率 +47%。
最后,2026 年的 DevOps 与平台工程师再也不是"写脚本、点构建"的角色,而是把工程师诉求当作产品需求、把平台稳定性当作核心 KPI 的内部产品经营者。从 Jenkins 到 GitHub Actions、从 Spinnaker 到 ArgoCD、从 Terraform 到 Crossplane,我们这一代平台人注定要在持续更迭的工具栈中坚守工程纪律。共勉一路同行。
—— 别看了 · 2026