Add-ons 企业演练基线与验收

验证:未记录
适用版本
未记录
验证范围
尚未登记验证记录。
本文缩写(英文全称与中文含义)
缩写 英文全称/名称 中文含义
ACK Acknowledgement 消息或数据接收确认
API Application Programming Interface 应用程序编程接口
ARN Amazon Resource Name AWS 资源名称,用于唯一标识资源
AZ Availability Zone 可用区
CD Continuous Delivery / Continuous Deployment 持续交付/持续部署;是否自动上线取决于流程
CI Continuous Integration 持续集成
CLI Command-Line Interface 命令行接口
CNI Container Network Interface 容器网络接口
CRD Custom Resource Definition Kubernetes 自定义资源定义
CSI Container Storage Interface 容器存储接口
DLQ Dead-Letter Queue 死信队列
DNS Domain Name System 域名系统
EKS Elastic Kubernetes Service AWS 托管 Kubernetes 服务
ESO External Secrets Operator 将外部秘密系统中的值同步到 Kubernetes 的控制器
GitOps GitOps 以 Git 保存期望状态、由自动化持续协调实际状态的运维方式
GKE Google Kubernetes Engine Google 托管 Kubernetes 服务
HPA Horizontal Pod Autoscaler Pod 水平自动扩缩容器
ID Identifier 标识符
K8s Kubernetes 容器编排平台;8 表示 K 与 s 之间的八个字母
KEDA Kubernetes Event-driven Autoscaling Kubernetes 事件驱动自动扩缩容
LB Load Balancer 负载均衡器
PDB Pod Disruption Budget Pod 中断预算,约束自愿驱逐
RBAC Role-Based Access Control 基于角色的访问控制
RPO Recovery Point Objective 恢复点目标,可接受的数据丢失时间范围
RPS Requests Per Second 每秒请求数
RTO Recovery Time Objective 恢复时间目标,可接受的恢复耗时
SA Service Account 服务账号,供程序或工作负载使用的身份
SLO Service Level Objective 服务等级目标
SSO Single Sign-On 单点登录
YAML YAML Ain’t Markup Language 常用于配置文件的数据序列化语言

本系列在企业预生产集群接入真实业务的预生产镜像、数据库、队列和身份系统。重点是平台能力交付,不另造一个返回 Hello World 的业务。没有业务镜像时,先完成应用容器化;不能用测试 Pod 的成功替代业务验收。

1. 演练边界#

环境 要求
集群 与生产同 minor、CNI、CSI;至少 3 个可用工作节点,跨区部署需真实多 AZ
业务 orders namespace;orders-api Deployment/Service,orders-worker Deployment,独立预生产数据库/队列
网络 可用域名、私网数据库、企业出口;明确 LB 到 Pod、API 到 webhook、Pod 到云 API 的路径
身份 人员 SSO + RBAC;组件专属 ServiceAccount/云角色;CI 短期凭据;备用管理入口
制品 镜像 digest、Chart 版本、CRD 版本锁定;扫描、签名验证及变更审批纳入已有流水线
故障 只在隔离环境排空节点、阻断出口和恢复备份;不连接生产支付/邮件/消息消费端

CNI、CSI、日志 Agent 等可能需要特权/hostPath;给对应系统 namespace 单独评审权限,不放松业务 namespace。Autopilot 对节点访问有限制,优先用托管功能,不能照搬自建集群 DaemonSet。

2. 统一业务约定#

示例统一使用以下接口;将已有业务适配或调整清单,镜像可从下述配套工程构建:

项目 约定
API 8080;/healthz 只检查进程,/readyz 检查接流能力,/metrics 暴露 Prometheus 指标
镜像 orders-api 非 root 运行,支持只读根文件系统;必要临时文件写 /tmp
密钥 orders-runtime Secret 的 DATABASE_URL;应用使用环境变量时,轮换后滚动重启
流量 orders-api Service 的端口名 http;标签 app.kubernetes.io/name: orders-api
业务验收 建单→查询→异步处理→账务/库存核对;幂等键复用不产生重复副作用
worker 真正实现 ACK、重试、DLQ、visibility timeout 与退出续租;不能只睡眠模拟处理

用预生产业务数据集构造容量基线,例如平时 100 RPS、峰值 300 RPS、错误率 <0.1%、p95 <300ms;这是待验证目标,不是本文承诺的性能。先压测数据库连接、队列吞吐及下游限流,再确定副本上限。

保存以下为 orders-base.yaml,按实际 minor 替换 Pod Security 版本。密钥按 External Secrets创建;镜像 REPLACE_IMAGE_DIGEST 替换后再部署。

apiVersion: v1
kind: Namespace
metadata:
  name: orders
  labels:
    team: commerce
    environment: staging
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/enforce-version: v1.N
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: orders-api
  namespace: orders
automountServiceAccountToken: false
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: orders-api
  namespace: orders
spec:
  replicas: 3
  revisionHistoryLimit: 5
  minReadySeconds: 10
  progressDeadlineSeconds: 600
  strategy:
    rollingUpdate: {maxSurge: 1, maxUnavailable: 0}
  selector:
    matchLabels: {app.kubernetes.io/name: orders-api}
  template:
    metadata:
      labels: {app.kubernetes.io/name: orders-api}
    spec:
      serviceAccountName: orders-api
      terminationGracePeriodSeconds: 60
      securityContext:
        runAsNonRoot: true
        seccompProfile: {type: RuntimeDefault}
      topologySpreadConstraints:
        - maxSkew: 1
          topologyKey: kubernetes.io/hostname
          whenUnsatisfiable: DoNotSchedule
          labelSelector:
            matchLabels: {app.kubernetes.io/name: orders-api}
      containers:
        - name: api
          image: REPLACE_IMAGE_DIGEST
          ports: [{name: http, containerPort: 8080}]
          envFrom: [{secretRef: {name: orders-runtime}}]
          resources:
            requests: {cpu: 250m, memory: 256Mi}
            limits: {cpu: "1", memory: 512Mi}
          securityContext:
            allowPrivilegeEscalation: false
            readOnlyRootFilesystem: true
            capabilities: {drop: [ALL]}
          startupProbe:
            httpGet: {path: /healthz, port: http}
            failureThreshold: 30
            periodSeconds: 5
          readinessProbe:
            httpGet: {path: /readyz, port: http}
            periodSeconds: 5
          livenessProbe:
            httpGet: {path: /healthz, port: http}
            periodSeconds: 10
          volumeMounts: [{name: tmp, mountPath: /tmp}]
      volumes: [{name: tmp, emptyDir: {sizeLimit: 256Mi}}]
---
apiVersion: v1
kind: Service
metadata:
  name: orders-api
  namespace: orders
  labels: {app.kubernetes.io/name: orders-api}
spec:
  selector: {app.kubernetes.io/name: orders-api}
  ports: [{name: http, port: 80, targetPort: http}]
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata: {name: orders-api, namespace: orders}
spec:
  minAvailable: 2
  selector:
    matchLabels: {app.kubernetes.io/name: orders-api}

资源数值是起点,须压测调整;多 AZ 集群再添加 topology.kubernetes.io/zone 分散约束,并确认故障区不会导致所有新 Pod Pending。PDB 仅约束支持 eviction 的自愿中断,不能阻止节点故障。

kubectl config current-context
kubectl version
kubectl get nodes -o wide
kubectl apply --dry-run=server -f orders-base.yaml
kubectl apply -f orders-base.yaml
kubectl -n orders rollout status deployment/orders-api --timeout=10m
kubectl -n orders get pods,pdb,endpointslices

生产由 GitOps 管理这些清单,手动 apply 只用于独立演练。Namespace Quota 必须覆盖 HPA 最大副本、发布 surge、sidecar 和恢复临时资源;否则扩容控制器无法兑现目标。

3. 每篇通用交付流程#

  1. 确认唯一负责人:Chart / CRD / 云身份 / 云资源各由谁维护。EKS/GKE 已托管的组件不能重复安装。
  2. 从篇内官方源查询可用版本;保存 helm show chart/values,记录 Chart→应用→K8s 兼容矩阵。所有 REPLACE_*、1.N、域名、ARN 都是待替换参数。
  3. 按篇内文件名保存 YAML;没有 apply 命令的配置片段合并到明确指定的 values。先 helm lint/template,CRD 就绪后 kubectl apply --dry-run=server。
  4. 完整 values 入私有 Git,Secrets/令牌不入库;使用 ESO、企业密钥系统或短期身份交付。Helm release Secret 也可能包含 values 中的秘密。
  5. 安装→状态检查→业务压测→负向权限测试→故障演练→升级/恢复演练;缺一项不得标记生产验收。
  6. 固化版本、监控、告警、值班 runbook、资源费用和证据,再推广至生产试点。

同一资源只能有一个期望状态管理者。Helm CLI、Argo CD、Flux 不同时修改同一 release;HPA/KEDA 管理 replicas 后,GitOps 不应反复写固定副本数。

4. 统一验收记录#

测试 证据与通过标准
业务链路 固定数据集的成功率、p95/p99、订单/消息/账务数量一致;记录请求 ID
身份隔离 正确 SA 成功,其他 namespace/SA 访问被拒绝;审计日志可定位
单节点维护 使用 eviction 排空一台业务节点;业务满足约定 SLO,剩余容量足够
下游中断 有限重试/退避,队列积压告警触发;恢复后无重复扣款、无静默丢任务
滚动升级 新旧版本共存时业务正常,CRD/API 兼容检查通过
数据恢复 隔离目标恢复对象和实际数据;校验业务总数/校验和,记录实测 RPO/RTO

压测使用团队现有 k6/Locust/JMeter 业务脚本与合成账户。脚本必须包含鉴权、写入、查询、幂等、清理;GET /healthz 的吞吐不能代表订单系统容量。结果保存在 evidence/<cluster>/<change-id>/,不含令牌/个人信息。

任何数据不一致、越权成功或超过 SLO:停止推广,执行对应篇恢复步骤。演练结束保留必要快照/证据,确认无消费者再删除临时云资源,核查孤立磁盘、LB、DNS 和费用。

本系列核对于 2026-09-23,提供配置与操作手册;未在你的真实云环境部署或压测,不能将文档中的验收目标写成已通过结果。

可直接运行的配套工程#

没有现成业务时,使用 完整订单参考工程 构建实际 API/worker、迁移与验收,不再需要自行补业务镜像。参考工程使用 PostgreSQL 事务队列,SQS/KEDA 专项实验仍需对应队列适配。

搜索文档

输入关键词,搜索所有文档。

↑ ↓ 选择 · Enter 打开 · Esc 关闭