诺曼底 Normandy 线框原型

使用飞书企业账号(OAuth2 / OIDC)

飞书授权二维码 / 「使用飞书登录」按钮区域

原型说明:真实环境跳转飞书授权页,此处仅演示布局。

工作台 集群: — · 命名空间: be-prod
张三(飞书) · 发布负责人

工作台

个人待办、集群健康摘要、最近发布与告警。

待我审批 3
发布单环境提交人
REL-20260514-008prod2李四
REL-20260514-007fat王五
集群健康
集群状态节点
ack-prod-main正常15 Ready
ack-fat注意2 NotReady
最近发布
单号应用镜像 Tag状态时间
REL-006dtmshop-prodv1.2.3成功10:22
REL-005qcqwappbasecms-fatmaster_abc失败昨天

集群列表

纳管多集群;注册、凭证轮换、环境标签。

搜索集群名称 / 地域…
全部集群
名称环境版本节点状态
连接 API 加载中…(需 bash scripts/run-platform-m0.sh)

集群详情 · ack-prod-main

健康、节点池、组件版本、网络插件(Terway)摘要。

概要
ACK IDc-xxxxx…
节点15 Ready / 0 NotReady
Pod 上限策略Terway ENIIP
节点池
规格节点数
prod2-g7g7.4xlarge9
addons-c7c7.2xlarge6
事件 / 告警摘要
最近 Warning 事件列表 + 跳转监控

命名空间

按集群筛选;项目归组;配额与 LimitRange 摘要。

集群:ack-prod-main ▼ 搜索 ns…
命名空间项目工作负载数Pod 数配额
dtmtask-prod任务中台68120CPU 72%
platform-prod平台3745

工作负载

Deployment / StatefulSet / DaemonSet / CronJob;与发布对象联动。

集群 ▼ 命名空间:dtmtask-prod ▼ 类型:Deployment ▼
名称就绪镜像nodeSelector操作
选择集群后打开本页加载 be-prod Deployment

Deployment · (未选择)

请先在「工作负载」列表点击详情。

状态
副本
镜像
nodeSelector
关联 Pod
Pod节点就绪状态
事件
类型原因消息时间
YAML(只读)
apiVersion: apps/v1
kind: Deployment
metadata: …

Pod · dtmshop-prod-xxxxx

状态、容器、资源、日志流、终端(权限受控)。

概要
节点k8s-app-prod2-172.17.102.5
QoSBurstable
重启次数0
容器
容器镜像就绪
apptrue
日志
[INFO] listening :8080
… 实时流式日志 …

发布单

全流程状态;筛选集群、环境、应用。

状态 ▼ 环境 ▼
单号应用集群目标镜像状态更新人操作
REL-008dtmshop-prodack-prod-mainv1.2.4待审批李四详情
REL-007qcqwappbasecms-fatack-fatmaster_x成功王五详情

新建发布单

可选「先 CI 构建再部署」或「仅改镜像」;与发布单同一生命周期便于聚合展示。

① CI / 代码源(可选)
部署方式
代码仓库
分支 / Tag
Commit
流水线模板
构建参数
外部 CI
可填:yunxiao / gitlab / local
② 目标集群与工作负载
集群
命名空间
工作负载
目标镜像
变更说明
发布前检查

待检查 填写目标镜像后自动校验

发布单预览(JSON)
{}

发布单 REL-008 执行中

同一页聚合:CI 阶段与日志 → 审批 → CD(K8s Rollout) → Pod/事件;无需再跳外部看构建。

参数:rel=REL-008 · c=ack-prod-main · ns=be-prod · w=dtmshop-prod
CI 流水线 成功
仓库 codeup…/dtmshop · 分支 release/1.2 · Commit a1b2c3d
外部流水线 云效 #4521 · 触发 李四 10:25 · 产出镜像 hub…/dtmshop:v1.2.4 digest sha256:abcd…
阶段状态耗时日志
检出代码通过12s查看
单元测试 / Maven通过3m 20s查看
Docker build通过2m 05s查看
镜像推送 ACR/Harbor通过48s查看
安全扫描(可选)警告1m 10s报告
CI 全部完成 · 镜像已推送
审批通过 · 张三 10:31
CD:Deployment 滚动更新中
飞书通知订阅方
iframe 或新页:云效 / GitLab 原生流水线 UI(深链)
Kubernetes Rollout
Deploymentdtmshop-prod
可用副本1 / 2 滚动中
最新 RSrs-new-xxxx
实时 Watch:ReplicaSet / Pod 条件
Pod 与事件(同一页下半区)
Pod阶段就绪
…-new-aaaRunning1/1
…-old-bbbTerminating0/1
Events:Pulling / Started / Unhealthy

CI 运行

诺曼底接收 GitLab CI 回调落库 · 飞书卡片深链到此页。

Jobs
Job状态
加载中…
制品 / fat
镜像
分支
提交

流水线模板

定义 CI 阶段顺序、Dockerfile 路径、缓存、扫描开关;发布单创建时选用。

搜索模板…
模板名适用语言阶段摘要更新时间
Java 服务默认构建Java / Mavencheckout → test → build → push → scan?2026-05-01
前端 Node 构建Nodecheckout → npm ci → build → nginx 镜像2026-04-20
模板编辑器(YAML / 可视化二选一)
stages: [checkout, test, docker_build, push, deploy_hook]
… 与云效 / GitLab CI YAML 映射配置 …

审批中心

待办 / 已办;可对接飞书审批实例。

待我审批
发布单摘要提交时间操作
REL-008dtmshop-prod → v1.2.410:28

监控看板

嵌入 ARMS / CMS / Grafana;集群与命名空间维度切换。

集群 ▼ 时间范围 ▼
图表区:CPU / 内存分配率、节点 NotReady、P95 延迟(占位)

告警规则

规则引擎 + 飞书机器人 / 用户;静默与路由。

规则名条件通知状态
Deployment 可用副本不足available < desired 持续 5m飞书群 K8s-告警启用
节点 NotReady飞书 @SRE启用

阿里云资源浏览器

只读;按标签过滤;跳转阿里云控制台。

账号 / 资源集 ▼ 地域 ▼ 标签 env=prod2
资源类型
实例 ID名称标签操作
i-xxxxxk8s-worker-01env=prod2控制台

成员与角色

飞书用户 / 部门同步;平台角色与集群权限绑定(Impersonation)。

成员
用户部门平台角色
张三研发-后端发布负责人
角色权限矩阵
表格:角色 × 资源 × 操作(只读/发布/审批/管理)

审计日志

谁在何时对哪集群执行了何种 API;发布单关联。

时间范围 用户 ▼ 资源类型 ▼
时间用户集群操作结果
2026-05-14 10:32:01张三ack-prod-mainPATCH Deployment/dtmshop-prod200

系统设置

飞书应用、RAM/STS、集群凭证加密、告警 webhook。

飞书集成
App IDcli_xxxx
App Secret••••••••(KMS)
重定向 URLhttps://k8s-portal.example.com/oauth/callback
阿里云集成
RAM 角色 ARN · 只读策略绑定 · 跨账号(若需要)
集群凭证
各集群 ServiceAccount / kubeconfig 轮换记录

配置 / Secret 管理 v2

统一管理 ConfigMap / Secret;值经 KMS 加密、默认掩码;可对接 External Secrets。

集群 ▼ 命名空间 ▼ 类型:Secret / ConfigMap ▼
名称类型来源键数最近修改操作
db-prodSecretExternal Secrets ← KMS42 天前查看(脱敏) · 轮换
app-configConfigMapGit121 小时前查看 · Diff
值预览(默认掩码,需二次确认显示)
DB_PASSWORD••••••••
REDIS_URLredis://••••••@host:6379

显示明文操作会进入审计日志;建议在「审计日志」配「敏感事件」告警。

Web Shell(受控终端)v2

代理 kubectl exec / logs;按角色限制命令;自动录像 + 风控关键字。

集群:ack-prod-main ▼ Pod:dtmshop-prod-xxxxx ▼ 容器:app ▼
$ kubectl get pod NAME READY STATUS AGE dtmshop-prod-xxxxx 1/1 Running 2d $ tail -f /var/log/app.log [INFO] listening :8080 [INFO] req id=abc latency=12ms

⚠ 高危命令(rm -rf、reboot、curl pipe sh)会拦截并提示审批;会话结束生成回放文件。

应急止损面板 v2

SRE 一键能力:扩缩容、暂停 HPA / CronJob、Pod 摘流、节点 cordon/drain、紧急回滚。

告警进行中
2
↑ 比 10 分钟前 +1
异常 Pod
7
CrashLoopBackOff 3
节点 NotReady
0
稳定
未值班窗口
@张三 On-call
应急操作(执行需 SRE 角色 + 二次确认)
能力目标说明操作
扩副本Deployment临时拉高副本到 N,过窗口自动回收
暂停 HPA / CronJobHPA / CronJob避免自动扩容打爆 / 任务雪崩
Pod 摘流量Pod移除 Service label,不删 Pod 便于排查
节点 cordon / drainNode停止调度 / 驱逐 Pod
紧急回滚Deployment回到 N 版本前(默认上一稳定版)
切流到备用集群Ingress / DNS多集群灾备;切换权重

所有操作进入审计日志;操作完成自动飞书周知值班组。

GitOps 同步与漂移检测 v2

Git 为单一事实源;Argo CD / Flux 实施;控制台展示 Git 期望态 vs 集群实际态的 Diff。

集群 ▼ 应用(Argo App)▼
应用仓库 / 路径同步健康漂移最近同步
dtmshop-prodinfra-repo/apps/dtmshop/prodSyncedHealthy10:30
platform-prodinfra-repo/apps/platform/prodOutOfSyncHealthy3 项1 小时前
be-prodinfra-repo/apps/be/prodDriftDegraded副本数 / 镜像 tag昨天
be-prod · 集群 vs Git Diff
- spec.replicas: 3 <-- Git + spec.replicas: 6 <-- 实际(被手动改) spec.template.spec.containers[0].image: - hub…/be:v1.2.0 <-- Git + hub…/be:hotfix-x <-- 实际

灰度 / 金丝雀发布 v2

基于 Argo Rollouts / Flagger;按比例放量、观察 SLO、自动 abort / rollback。

应用:dtmshop-prod ▼ 策略:金丝雀 ▼
发布进度
批次流量比例观察窗口SLO 判定状态
110%5m错误率 < 1% 且 P95 < 300ms通过
230%10m同上观察中
3100%待提升
关键指标(实时)
折线:QPS / 错误率 / P95 延迟(new vs old)
自动决策

错误率 0.4% · P95 220ms · 健康判定通过

下次自动提升:10:48

触线规则:错误率 > 2% 或 P95 > 500ms 持续 2m → Abort 并回滚

服务目录与脚手架 v2

「新建微服务」一键产出:Git 仓库 / CI 模板 / namespace / RBAC / 监控告警基线。

搜索服务 / 团队…
服务团队语言模板命名空间SLO状态
dtmshop任务中台Java / Mavendtmtask-prod99.9%运行
papi小程序Nodeminiprogram-prod99.5%运行
脚手架向导(步骤示意)
填写服务元信息(名称、负责人、团队)
选择语言模板(Java/Go/Node/前端)
生成 Git 仓库 + 默认 Dockerfile + CI 模板
创建命名空间 + RBAC + Quota + 监控告警基线
注册到「服务目录」并发邮件/飞书通知 owner

变更冻结日历 v2

大促 / 夜间 / 值班缺位时间段禁止 prod 发布;紧急修复走加签流程。

2026 年 5 月 ▼
5/1 劳动节
5/2
5/3
5/4
5/5
5/6
5/7
5/8
5/9
5/10
5/11
5/12
5/13 22:00-次日 06:00 夜间冻结
5/14 22:00-次日 06:00
5/15 今日
5/16
5/17
5/18
5/19 大促预热 全天冻结
5/20 大促首日 全天冻结
5/21 大促 全天冻结

红=全冻结;黄=部分时段冻结;冻结期 prod 发布按钮禁用,紧急修复需 P0 加签。

DORA 指标与 SLO 燃尽 v2

团队交付健康度 + 服务可用性预算;预算见底自动收紧发布门禁。

部署频率(周)
37
↑ vs 上周 +8
变更前置时间
1.2d
缩短
变更失败率
6.5%
↑ 关注
MTTR
22m
稳定
SLO 列表
服务目标本周达成错误预算(30d)预算燃尽动作
dtmshop可用 99.9%99.95%剩 72%
be-apiP95 < 300msP95 410ms剩 12%
触发发布收紧

智能诊断助手 v2

一键聚合 events / describe / 日志 / 资源 / 镜像 / PVC / 节点状态,出"人话解释 + 下一步建议"。

集群:ack-prod-main ▼ 命名空间 ▼ Pod:feature-xxx-pod ▼
诊断结论

主因 Pod 处于 CrashLoopBackOff:容器进程启动 1.2s 内退出。

可能原因 启动时连接 redis 失败:日志含 dial tcp 10.x.x.x:6379: i/o timeout

关联检查 同 namespace 内 redis-cluster Service Endpoints 为空。

建议 1)确认 redis StatefulSet 副本就绪;2)检查 NetworkPolicy 是否放通 6379;3)应用增加启动重试策略;4)暂时

证据:Events
Warning BackOff pod Back-off restarting failed container
Normal Pulled pod Container image …
Warning Unhealthy …
证据:最近日志关键字
[FATAL] redis connect failed: i/o timeout
[INFO] graceful shutdown

资源优化建议(Right-Sizing)v2

基于历史指标聚合,给出 requests/limits 与 HPA 建议;标记僵尸 Deployment。

建议下调 CPU
128 核
年化约省 ¥xxx
建议下调内存
410 GiB
僵尸负载
23
30 天 0 流量
requests 缺失
179 Pod
高 ROI 建议清单
工作负载当前 requests实际 P95建议预计节省操作
dtmtaskservice-prodCPU 4 / Mem 8GiCPU 0.6 / Mem 1.8GiCPU 1 / Mem 2.5Gi¥xxx/月
papi-prod添加 requests/limits 基线
old-cron-x(30d 0 调用)标记下线

成本归集 / Showback v2

按命名空间 / 项目 / 团队 / 环境拆 CPU / 内存 / 存储 / 公网 / SLB / RDS。

月份 ▼ 团队 ▼ 环境:prod / fat ▼
本月总成本
¥xxx,xxx
↑ +3.8%
ACK
¥xxx
RDS
¥xxx
OSS + 公网
¥xxx
按团队
团队命名空间本月环比主因
任务中台dtmtask-* 等¥xxx+5%Cron 增量
平台platform-*¥xxx持平