从 Jenkins + Spinnaker + Terraform 0.12 + Ansible 2.9 + 手写 K8s YAML → GitHub Actions + Tekton + ArgoCD + Crossplane + Pulumi + Helmfile + Backstage 全栈 DevOps 升级 77 天踩坑录:18 反模式 + 21 修法

23 位 SRE + 平台工程师 77 天把公司"CI / CD / IaC / GitOps / 配置管理 / 内部开发者平台"6 大 DevOps 底座,从 Jenkins 2.387 + Spinnaker + Terraform 0.12 + Ansible 2.9 + 手写 K8s YAML 重构到 GitHub Actions + Tekton + ArgoCD + Crossplane + Pulumi + Helmfile + Kustomize + Renovate + Backstage + Cosign + OpenTelemetry,覆盖 4700 次/天部署 + 17000 个 Pipeline 运行 + 470 个微服务 + 27 个 K8s 集群,沉淀 21 套修法 + 18 个 DevOps 工程化议题。

从 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
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理 邮箱1846861578@qq.com。
技术教程

从 Nginx 1.18 + HAProxy 2.0 + OpenResty + iptables → Nginx 1.27 + HAProxy 3.0 + Envoy 1.32 + Istio 1.24 Ambient + Cilium 1.16 + eBPF + HTTP/3 全栈升级 67 天踩坑录:17 反模式 + 19 修法

2026-5-27 21:30:59

技术教程

从 TensorFlow 2.4 + LangChain 0.0.x + Pinecone + 单卡推理 → PyTorch 2.5 + vLLM + SGLang + LangGraph + LlamaIndex 0.12 + Ollama + pgvector + Ray Serve + KServe 全栈 AI 升级 87 天踩坑录:19 反模式 + 21 修法

2026-5-27 21:46:33

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索