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