已关闭
新增提案:0035-安装部署支持多仓库镜像以及兼容k8s的1.28.8版本 #62
xuyouh创建于 1月29日关闭于 22 天前
新增提案:0035-安装部署支持多仓库镜像以及兼容k8s的1.28.8版本 #62
已关闭
xuyouh创建于 1月29日关闭于 22 天前
1 个文件变更+713-0
@@ -0,0 +1,713 @@
1+<!-- 格式合规检查:已通过 -->
2+---
3+# 提案标题
4+title: 支持多仓库镜像部署以及兼容 k8s 的 1.28.8 版本安装
5+# 提案编号
6+ofep-number: 0035
7+# 提案作者
8+authors:
9+ - "@xuyouhong"
10+# 提案主导SIG
11+owning-sig: sig-Installation
12+# 提案协作SIG
13+participating-sigs: []
14+# 提案状态(初步草案|准备开始实现|已在SIG中实现并合并|提案被暂缓|提案被否决|作者主动撤回提案|被另一个oFEP取代)
15+status: provisional
16+# 创建日期
17+creation-date: 2025-01-29
18+# 评审人
19+reviewers:
20+ - TBD
21+# 批准人
22+approvers:
23+ - TBD
24+# 相关联的其他oFEP
25+see-also:
26+ - "/ofeps/sig-Installation/ofep-0013-安装部署完全支持离线环境.md"
27+ - "/ofeps/sig-Installation/ofep-0040-引导节点安仓库自依赖安装和提供bkeagent健康端口.md"
28+# 当前oFEP替代了哪些已有提案
29+replaces: []
30+# 当前oFEP被哪些提案替代,当status为replaced时需要填写此字段
31+replaced-by: []
32+# 此oFEP当前开发阶段
33+stage: alpha
34+# 最近一次推进的版本
35+latest-milestone: "v26.03"
36+# 各阶段目标版本
37+milestone:
38+ alpha: ""
39+ beta: ""
40+ stable: ""
41+# 功能开关及影响组件
42+feature-gates:
43+ - name: MultiRegistryImageDeploy
44+ components:
45+ - bkeadm
46+ - cluster-api-provider-bke
47+ - bke-manifests
48+ - name: K8s1288OfflineInstall
49+ components:
50+ - bkeadm
51+ - bke-manifests
52+# 是否支持关闭该功能
53+disable-supported: true
54+# 该功能引入的监控指标
55+metrics: []
56+---
57+ 
58+# oFEP-0035:支持多仓库镜像部署以及兼容 k8s 的 1.28.8 版本安装
59+ 
60+<!-- toc -->
61+- [发布签核清单](#release-signoff-checklist)
62+- [摘要](#summary)
63+- [动机](#motivation)
64+ - [目标](#goals)
65+ - [非目标](#non-goals)
66+- [提案](#proposal)
67+ - [用户故事与用例视图](#user-stories)
68+ - [注释/约束/警告](#notesconstraintscaveats)
69+ - [风险与缓解措施](#risks-and-mitigations)
70+- [设计细节](#design-details)
71+ - [架构与设计前提](#architecture-and-design-premises)
72+ - [特性描述](#feature-description)
73+ - [4+1 架构视图](#41-architecture-views)
74+ - [模块接口与配置约定](#module-interfaces-and-configuration)
75+ - [关键设计决策表](#关键设计决策表)
76+ - [DFX 质量属性设计](#dfx-quality-attributes)
77+ - [测试计划](#test-plan)
78+ - [毕业标准](#graduation-criteria)
79+ - [升级/降级策略](#upgrade--downgrade-strategy)
80+ - [版本倾斜策略](#version-skew-strategy)
81+- [生产可用性审查](#production-readiness-review)
82+- [实施历史](#implementation-history)
83+- [缺点](#drawbacks)
84+- [替代方案](#alternatives)
85+- [所需基础设施](#infrastructure-needed)
86+<!-- /toc -->
87+ 
88+## 发布签核清单
89+ 
90+标记有(R)的项目*在达到里程碑/发布*之前是必需的。
91+ 
92+- [ ](R)发布里程碑中的增强问题,链接到 [openfuyao/ofep](https://gitcode.com/openfuyao/ofep) 中的 oFEP 目录
93+- [ ] (R) oFEP 审批者已批准 oFEP 状态为“可实施”
94+- [ ] (R) 设计细节已适当记录
95+- [ ](R)测试计划已到位,并考虑了 SIG 架构和 SIG 测试的输入(包括测试重构)
96+ - [ ] 针对所有 Beta API 操作(端点)进行 e2e 测试
97+ - [ ] (R) 确保 GA e2e 测试满足一致性测试的要求
98+ - [ ] (R) GA e2e 测试至少需要两周时间才能证明测试结果无 flake(不稳定或偶发失败)
99+- [ ] (R) 毕业标准已设定
100+- [ ] (R) 生产准备情况审查完成
101+- [ ] (R) 生产准备情况审查已获批准
102+- [ ] “实施历史”部分已更新里程碑
103+- [ ] 面向用户的文档已在 [openfuyao/docs](https://gitcode.com/openfuyao/docs) 创建,以便发布到 [openfuyao.com](https://openfuyao.com/)
104+- [ ] 支持文档 - 例如,额外的设计文档、邮件列表讨论/SIG 会议链接、相关 PR/问题、发行说明
105+ 
106+- [openfuyao.com](https://openfuyao.com/)
107+- [openfuyao/ofep](https://gitcode.com/openfuyao/ofep)
108+- [openfuyao/docs](https://gitcode.com/openfuyao/docs)
109+ 
110+## 摘要
111+ 
112+本提案涵盖 openFuyao 安装部署链路上的两项增强能力:
113+ 
114+1. **多仓库镜像部署**:集群安装过程中,镜像不再强制来自单一 `cr.openfuyao.cn` 仓库,而是按社区制品规范分别从自编译镜像仓、可再分发三方仓(`hub.oepkgs.net`)及各自上游仓(如 `registry.k8s.io``docker.io`)拉取;同时支持用户将镜像导入**同一自定义内部仓库**(仓库名+项目名相同场景)后,通过模板渲染统一 `repo` 参数或 registry 重定向完成安装。
115+2. **兼容 Kubernetes v1.28.8 离线安装**:社区制备 v1.28.8 版本镜像与二进制,支持用户在离线制品包中指定 K8s 版本后完成 **≥ v1.28.8** 的低版本集群离线部署(containerd v2.1.1 已初步验证可拉起 Pod);在线安装暂不支持指定该低版本。
116+ 
117+与 [oFEP-0013](/ofeps/sig-Installation/ofep-0013-安装部署完全支持离线环境.md) 的关系:oFEP-0013 聚焦全离线制品包与 containerd 单点 mirror;本 oFEP 扩展为**多来源镜像**在线/自定义仓场景,并增加 K8s 1.28.8 离线版本支持。
118+ 
119+## 动机
120+ 
121+openFuyao 社区与政企伙伴在安装部署中存在以下痛点:
122+ 
123+| 痛点 | 现状 | 影响 |
124+|------|------|------|
125+| 镜像来源单一 | 官方安装路径默认所有镜像来自 `cr.openfuyao.cn` | 与社区制品分仓规范(cr / oepkg / 上游)不一致;流水线无法按来源归类 |
126+| 自定义仓能力受限 | 模板渲染仅支持单一 `repo` 参数替换 | 伙伴将镜像导入同一内部 Harbor 后,无法灵活覆盖多来源 YAML |
127+| K8s 版本固定 | 仅支持社区当前主推 K8s 版本 | 部分客户需 v1.28.8 等较低版本离线部署,无法满足合规或存量环境 |
128+ 
129+部分发行版伙伴会将安装所需镜像统一导入内部**同一 URL、同一 repo/项目**下,需要 openFuyao 安装工具链支持该交付形态。
130+ 
131+### 目标
132+ 
133+1. **流水线场景(多来源)**:在线/离线安装时,Pod 可按镜像来源分别从 `cr.openfuyao.cn``hub.oepkgs.net``registry.k8s.io``docker.io` 等拉取,满足社区制品分仓要求。
134+2. **自定义仓场景(单 repo)**:支持用户将镜像导入同一内部仓库(仓库名+项目名相同),通过 **统一 `repo` 模板渲染****registry 重定向** 完成引导集群与管理/业务集群安装。
135+3. **引导集群离线小包 2**:支持不含 openFuyao 前端/console 的最小引导集安装(与 oFEP-0040 自依赖方向对齐)。
136+4. **K8s v1.28.8 离线安装**:社区提供 v1.28.8 对应 kube-*、etcd 等镜像与二进制;用户修改版本配置 YAML 后可离线部署;组件安装支持按 K8s 版本进行模板渲染。
137+5. openFuyao 核心组件 YAML/chart 整改,暴露 `repo` 或可 `--set` 的 values 参数。
138+ 
139+### 非目标
140+ 
141+1. 不改造第三方上游 chart 内写死的镜像地址(保持原状,文档说明限制)。
142+2. K8s v1.28.8 **在线**安装自动同步 OBS 低版本文件(当前不支持,仅离线)。
143+3. 不在本 oFEP 解决扩展组件应用市场多 repo 强制统一(扩展组件仅梳理镜像来源,不要求同一 repo)。
144+4. 不覆盖 oFEP-0013 已定义的增量 patch 制品包全流程(可复用 containerd mirror 能力)。
145+5. 不支持低于 v1.28.8 的 K8s 版本。
146+ 
147+## 提案
148+ 
149+本提案通过 registry 重定向(k3s/containerd)、manifest 模板渲染、离线制品版本配置及 bke-manifests 整改,使安装部署同时满足社区多仓流水线与伙伴单仓导入两种交付诉求。
150+ 
151+**成功衡量标准:**
152+ 
153+**多仓库镜像部署:**
154+ 
155+- 在线安装场景下,CAPI 等组件镜像可从 `registry.k8s.io` 拉取,openFuyao 组件从 `cr.openfuyao.cn` 拉取,三方镜像从各自上游或 `hub.oepkgs.net` 拉取(P0)。
156+- 自定义单 repo 场景:传入统一 `repo` 参数后,核心组件 Pod 镜像前缀正确渲染(P0)。
157+- 离线安装场景:引导集群 k3s mirror、业务集群 containerd `certs.d` 重定向生效(P0)。
158+ 
159+**K8s v1.28.8 离线安装:**
160+ 
161+- 离线包指定 `v1.28.8` 后,kube-apiserver/controller-manager/scheduler、etcd、kube-proxy 等以 1.28.8 版本镜像拉起且 Pod Running(P0)。
162+- containerd v2.1.1 + 1.28.8 控制面组合通过 SIG 回归(P0)。
163+ 
164+### 用户故事与用例视图
165+ 
166+#### 故事 1:社区多来源镜像在线安装
167+ 
168+作为社区流水线维护者,我希望集群安装时自编译镜像、oepkg 三方镜像及不可再分发镜像各从其规范仓库拉取,而非全部指向 `cr.openfuyao.cn`
169+ 
170+#### 故事 2:伙伴单仓自定义镜像安装
171+ 
172+作为政企运维人员,我将所有安装镜像导入内部 Harbor 同一项目下,希望通过配置 `imageRepo` 或统一 `repo` 参数完成集群安装,无需逐个改 YAML。
173+ 
174+#### 故事 3:K8s 1.28.8 离线部署
175+ 
176+作为离线环境客户,我希望在制备离线包时指定 Kubernetes v1.28.8,引导节点与业务集群均使用该版本控制面组件完成离线安装。
177+ 
178+**用例图:**
179+ 
180+```mermaid
181+flowchart LR
182+ Ops((运维/流水线))
183+ 
184+ subgraph multi["多仓库镜像部署"]
185+ UC1["配置 imageRepo / repo"]
186+ UC2["registry 重定向或模板渲染"]
187+ UC3["集群 Pod 多源拉镜像"]
188+ end
189+ 
190+ subgraph k128["K8s 1.28.8"]
191+ UC4["离线包指定版本"]
192+ UC5["版本化模板渲染"]
193+ end
194+ 
195+ Ops --> UC1
196+ UC1 --> UC2
197+ UC2 --> UC3
198+ Ops --> UC4
199+ UC4 --> UC5
200+```
201+ 
202+**设计意图**:多仓与低版本 K8s 两条能力正交——前者解决镜像来源规范与自定义仓,后者解决控制面版本选型;均通过安装时配置与模板/重定向实现,不改动运行时业务逻辑。
203+ 
204+### 注释/约束/警告
205+ 
206+1. **镜像分仓规范**:自编译 → `cr.openfuyao.cn`;可再分发三方 → `hub.oepkgs.net`;不可再分发 → 各自上游。
207+2. **模板渲染限制**:统一 `repo` 参数仅支持**一个**仓库前缀,适用于「同仓同项目」自定义场景。
208+3. **k3s 重定向**:引导集群新增 mirror 项需**重启 k3s 容器**;containerd `certs.d` 新增 hosts 一般**无需重启** containerd。
209+4. **K8s 1.28.8**:仅验证离线路径;在线 OBS 版本同步暂不支持指定 1.28.8。
210+5. 扩展组件 chart 中写死的三方镜像不做统一 repo 改造。
211+ 
212+### 风险与缓解措施
213+ 
214+| 风险 | 影响 | 缓解措施 |
215+|------|------|----------|
216+| 多 mirror 配置错误 | ImagePullBackOff | 文档提供 k3s/containerd 配置样例;安装前校验脚本 |
217+| 模板 `repo` 与镜像路径不匹配 | 渲染后镜像不存在 | 默认值回退社区官方路径;安装日志打印最终 image |
218+| 1.28.8 与最新 addon 不兼容 | 扩展组件安装失败 | 明确兼容矩阵;离线包绑定 VersionConfig |
219+| 重定向 TLS 跳过验证 | 中间人风险 | 内网场景文档警示;生产建议配置 CA |
220+| chart 内镜像无法 `--set` | 部分扩展组件仍走上游 | 非目标明确;用户手册说明手动/import 策略 |
221+ 
222+## 设计细节
223+ 
224+### 架构与设计前提
225+ 
226+**多仓库拉取目标态:**
227+ 
228+```mermaid
229+sequenceDiagram
230+ participant Bootstrap as 引导节点
231+ participant Cluster as 业务/管理集群
232+ participant CR as cr.openfuyao.cn
233+ participant OEPKG as hub.oepkgs.net
234+ participant Upstream as registry.k8s.io / docker.io
235+ 
236+ Bootstrap->>Bootstrap: 编辑 BC,设置 imageRepo
237+ Bootstrap->>Cluster: 创建集群
238+ Cluster->>CR: 拉取自编译镜像
239+ Cluster->>OEPKG: 拉取可再分发三方镜像
240+ Cluster->>Upstream: 拉取不可再分发三方镜像
241+```
242+ 
243+**K8s 1.28.8 离线安装流程:**
244+ 
245+```mermaid
246+flowchart TD
247+ A[开始] --> B[安装 containerd v2.1.1]
248+ B --> C[从 cr.openfuyao.cn 安装 k8s 1.28.8 与 etcd]
249+ C --> D[安装 kube-proxy]
250+ D --> E[安装 coredns、calico]
251+ E --> F[安装 openFuyao 核心组件]
252+ F --> G[结束]
253+```
254+ 
255+**实现前提:**
256+ 
257+- 引导集群使用 k3s,mirror 配置位于 `/etc/rancher/k3s/registry.yaml`
258+- 管理/业务集群使用 containerd,多仓库重定向位于 `/etc/containerd/certs.d/<registry>/hosts.yaml`
259+- 核心组件 manifest/chart 支持 `repo` 占位符或 `--set`;扩展组件按应用市场独立安装。
260+- K8s 低版本通过离线制品 VersionConfig 与版本化模板选择对应 tag。
261+ 
262+### 特性描述
263+ 
264+#### 背景与目标
265+ 
266+见「动机」与「提案」。涉及仓库:`bkeadm``cluster-api-provider-bke``bke-manifests``openfuyao-system-controller`(核心组件安装)。
267+ 
268+#### 依赖组件
269+ 
270+| 组件 | 描述 | 可获得性 |
271+|------|------|----------|
272+| bkeadm | 引导 init、离线包构建、registry 配置 | 必选 |
273+| cluster-api-provider-bke | BKECluster 调谐、containerd 配置下发 | 必选 |
274+| bke-manifests | 安装 YAML/chart 模板与 `repo` 占位符 | 必选 |
275+| k3s | 引导集群 CRI,registry.yaml mirror | 引导集群必选 |
276+| containerd v2.1.1 | 节点 CRI,certs.d 多仓 pull | 集群节点必选 |
277+| hub.oepkgs.net / 上游 registry | 三方镜像来源 | 在线必选 |
278+ 
279+#### License
280+ 
281+Mulan PSL v2 License。
282+ 
283+### 4+1 架构视图
284+ 
285+#### 上下文与用例视图 (Context and Use Case View)
286+ 
287+```mermaid
288+flowchart TB
289+ User((运维人员))
290+ CR[cr.openfuyao.cn]
291+ OEPKG[hub.oepkgs.net]
292+ Upstream[上游 registry]
293+ Custom[自定义 Harbor]
294+ 
295+ subgraph Bootstrap[引导集群]
296+ K3s[k3s mirror]
297+ end
298+ 
299+ subgraph Cluster[管理业务集群]
300+ CD[containerd certs.d]
301+ Pods[工作负载 Pod]
302+ end
303+ 
304+ User -->|imageRepo repo| K3s
305+ User -->|离线版本 YAML| CD
306+ Pods --> CD
307+ K3s --> CR
308+ K3s --> OEPKG
309+ K3s --> Upstream
310+ K3s --> Custom
311+ CD --> CR
312+ CD --> OEPKG
313+ CD --> Upstream
314+ CD --> Custom
315+```
316+ 
317+**设计意图**:安装配置在引导节点录入,运行时由 k3s/containerd 按 mirror 或渲染后 image 从多 registry 拉取。
318+ 
319+#### 逻辑视图 (Logical View)
320+ 
321+```mermaid
322+flowchart TB
323+ subgraph install["安装控制面"]
324+ BC[BKECluster spec]
325+ Template[模板渲染 engine]
326+ MirrorK3s[k3s registry mirror]
327+ MirrorCD[containerd certs.d]
328+ end
329+ 
330+ subgraph artifacts["制品"]
331+ Manifests[bke-manifests YAML/chart]
332+ VersionCfg[VersionConfig / K8s 版本]
333+ end
334+ 
335+ BC --> Template
336+ BC --> MirrorK3s
337+ BC --> MirrorCD
338+ Manifests --> Template
339+ VersionCfg --> Template
340+ Template --> Pods[Pod spec image]
341+ MirrorK3s --> Pull[镜像拉取]
342+ MirrorCD --> Pull
343+```
344+ 
345+**设计意图**`imageRepo`/`repo` 与版本配置驱动模板;mirror 与渲染两条路径互补,覆盖在线多仓与单仓自定义场景。
346+ 
347+#### 开发视图 (Development View)
348+ 
349+```mermaid
350+flowchart TB
351+ subgraph bkeadm_repo["bkeadm"]
352+ init_pkg["pkg/initialize · repository"]
353+ build_pkg["pkg/build · 离线包/版本配置"]
354+ end
355+ 
356+ subgraph cap_repo["cluster-api-provider-bke"]
357+ containerd_cfg["ContainerdConfig · certs.d 生成"]
358+ phase["phase 渲染 · repo 参数"]
359+ end
360+ 
361+ subgraph manifests["bke-manifests"]
362+ core_yaml["核心组件 YAML 模板"]
363+ charts["chart values.repo"]
364+ k128_tpl["K8s 1.28.8 版本模板"]
365+ end
366+```
367+ 
368+**设计意图**:模板与 mirror 配置分属 manifests 与 CAP-BKE/bkeadm;K8s 低版本模板与 VersionConfig 同仓维护。
369+ 
370+#### 运行视图 (Runtime View)
371+ 
372+```mermaid
373+sequenceDiagram
374+ actor User
375+ participant BKE as bkeadm CAP
376+ participant K3s as k3s containerd
377+ participant Reg as 多 registry
378+ 
379+ User->>BKE: 创建集群(imageRepo / repo / 版本)
380+ BKE->>BKE: 渲染 manifest / 写入 mirror 配置
381+ BKE->>K3s: 应用 Pod / 更新 registry 配置
382+ K3s->>Reg: pull 自编译镜像
383+ K3s->>Reg: pull oepkg / 上游镜像
384+ Note over K3s: 1.28.8 离线:pull v1.28.8 tag
385+```
386+ 
387+**设计意图**:安装阶段一次性写入配置与渲染结果;运行期由 CRI 按配置拉取,无额外控制面轮询。
388+ 
389+#### 部署视图 (Deployment View)
390+ 
391+```mermaid
392+flowchart TB
393+ CR[cr.openfuyao.cn]
394+ OEPKG[hub.oepkgs.net]
395+ UP[上游 registry]
396+ HARBOR[自定义 Harbor]
397+ 
398+ subgraph bootstrap[引导节点]
399+ k3s_reg[k3s registry.yaml]
400+ k3s[k3s]
401+ end
402+ 
403+ subgraph nodes[集群节点]
404+ certs[containerd certs.d]
405+ ctr[containerd]
406+ end
407+ 
408+ CR --> k3s_reg
409+ OEPKG --> k3s_reg
410+ UP --> k3s_reg
411+ HARBOR --> k3s_reg
412+ k3s_reg --> k3s
413+ CR --> certs
414+ OEPKG --> certs
415+ UP --> certs
416+ HARBOR --> certs
417+ certs --> ctr
418+```
419+ 
420+**设计意图**:引导节点与集群节点分别通过 k3s registry.yaml 与 containerd certs.d 对接多 registry。
421+ 
422+### 模块接口与配置约定
423+ 
424+#### 1. 多仓库镜像部署
425+ 
426+##### 1.1 镜像来源规划
427+ 
428+| 镜像来源 | 存储位置 |
429+|----------|----------|
430+| 自编译镜像 | `cr.openfuyao.cn` |
431+| license 允许分发的三方镜像 | `hub.oepkgs.net` |
432+| 不允许分发的三方镜像 | 各自上游仓库 |
433+ 
434+**示例 Pod 镜像分布:**
435+ 
436+```yaml
437+# CAPI
438+image: registry.k8s.io/cluster-api/cluster-api-controller:v1.4.3
439+# openFuyao
440+image: cr.openfuyao.cn/openfuyao/cluster-api-provider-bke:latest
441+# 三方
442+image: docker.io/library/openssl:latest
443+```
444+ 
445+##### 1.2 安装场景与处理方式
446+ 
447+**引导集群:**
448+ 
449+| 场景 | 处理方式 |
450+|------|----------|
451+| 在线安装 | 无须额外处理 |
452+| 离线安装 | k3s registry 重定向 |
453+| 自定义仓:同仓同项目 | 模板渲染 或 离线小包 |
454+| 自定义仓:同仓不同项目 | 手动改 YAML 或 离线小包 |
455+| 自定义仓:多仓同映射 | k3s 重定向 或 离线小包 |
456+ 
457+**管理/业务集群:**
458+ 
459+| 场景 | 处理方式 |
460+|------|----------|
461+| 在线安装 | 无须额外处理 |
462+| 离线安装 | containerd 重定向(certs.d) |
463+| 自定义仓:同仓同项目 | 模板渲染 |
464+| 自定义仓:同仓不同项目 | 手动改 K8s YAML |
465+| 自定义仓:多仓同映射 | containerd 重定向 |
466+ 
467+##### 1.3 Registry 重定向配置
468+ 
469+**引导集群 k3s**`/etc/rancher/k3s/registry.yaml`,变更需重启 k3s):
470+ 
471+```yaml
472+mirrors:
473+ cr.openfuyao.cn:
474+ endpoint:
475+ - "https://deploy.bocloud.k8s:443"
476+ registry.k8s.io:
477+ endpoint:
478+ - "https://deploy.bocloud.k8s:443"
479+ docker.io:
480+ endpoint:
481+ - "https://deploy.bocloud.k8s:443"
482+configs:
483+ "cr.openfuyao.cn":
484+ tls:
485+ insecure_skip_verify: true
486+```
487+ 
488+**管理/业务集群 containerd**`/etc/containerd/certs.d/docker.io/hosts.yaml`,新增文件无需重启):
489+ 
490+```yaml
491+server = "https://docker.io"
492+[host."https://deploy.bocloud.k8s:40443"]
493+ capabilities = ["pull", "resolve", "push"]
494+ skip_verify = true
495+```
496+ 
497+##### 1.4 模板渲染(统一 repo)
498+ 
499+BKECluster 字段:`spec.clusterConfig.cluster.imageRepo`;渲染参数:`repo`(单前缀,适用于同仓同项目)。
500+ 
501+```yaml
502+image: {{ if .repo }}{{ .repo }}{{ else }}registry.k8s.io/cluster-api/{{ end }}cluster-api-controller:v1.4.3
503+image: {{ if .repo }}{{ .repo }}{{ else }}cr.openfuyao.cn/openfuyao/{{ end }}cluster-api-provider-bke:latest
504+image: {{ if .repo }}{{ .repo }}{{ else }}docker.io/{{ end }}openssl:latest
505+```
506+ 
507+**核心组件**:openfuyao-system-controller 安装;yaml 用 `sed -i` 或 chart `--set repo=...`(prometheus、ingress、metrics-server 等)。
508+ 
509+**扩展组件**:应用市场安装;梳理 cr/oepkg/三方来源,**不要求**统一 repo;chart values 暴露的可 `--set`,写死在 yaml 的暂不处理。
510+ 
511+##### 1.5 终态交付诉求
512+ 
513+- 流水线:满足场景 1(多来源在线)与场景 2(离线 redirect)。
514+- 伙伴客户:满足场景 3.1(同仓同项目自定义在线仓)。
515+- 支持引导集群**离线小包 2**(openFuyao 前端/console 相关镜像与 chart)。
516+- openFuyao 核心组件 YAML 整改 + 统一 `repo` 模板渲染。
517+ 
518+#### 2. 兼容 Kubernetes v1.28.8 离线安装
519+ 
520+##### 2.1 验证组件矩阵(初步)
521+ 
522+| 组件 | 版本 |
523+|------|------|
524+| kube-apiserver / controller-manager / scheduler / kubectl / kubelet | v1.28.8 |
525+| kube-proxy | v1.28.8 |
526+| etcd | 3.5.12-0 |
527+| calico | 3.31.3 |
528+| coredns | 1.12.2-of.1 |
529+| containerd | v2.1.1 |
530+ 
531+##### 2.2 使用方式
532+ 
533+- **离线**:用户修改离线制品版本 YAML(K8s 版本为 v1.28.8)后上传/制备;社区提供 1.28.8 镜像与二进制。
534+- **在线**:OBS 版本文件自动同步,**暂不支持**指定 1.28.8。
535+ 
536+##### 2.3 版本化模板
537+ 
538+安装 K8s 组件时根据 VersionConfig 选择对应版本模板,拉起 v1.28.8 控制面及 etcd 镜像(非当前默认 latest/of-v1.33 线路)。
539+ 
540+### 关键设计决策表
541+ 
542+| 决策点 | 选项 | 选定方案 | 理由 |
543+|--------|------|----------|------|
544+| 多来源在线拉取 | 单仓聚合 / 分仓拉取 | **分仓按社区规范** | 符合流水线制品治理 |
545+| 自定义单仓 | 仅重定向 / 仅模板 / 两者 | **重定向 + 模板渲染** | 覆盖引导/集群不同 CRI 与伙伴导入习惯 |
546+| 统一 repo 粒度 | 多 repo 参数 / 单 repo | **单 `repo` 前缀** | 匹配「同 URL 同项目」伙伴诉求,实现简单 |
547+| 扩展组件 chart | 强制改 repo / 保持原状 | **保持三方 chart 原状** | 降低维护成本,文档说明 |
548+| K8s 1.28.8 范围 | 在线+离线 / 仅离线 | **仅离线** | 在线 OBS 同步链路未扩展低版本 |
549+| 引导集群小包 | 仅全量离线包 / 分包 | **支持离线小包 2** | 与最小引导集、oFEP-0040 方向一致 |
550+| containerd 重定向 | 主配置 mirror / certs.d | **certs.d hosts.yaml(v2)** | 增删 mirror 无需重启 containerd |
551+ 
552+### DFX 质量属性设计
553+ 
554+#### 性能
555+ 
556+- 多 registry 并行 pull 不增加控制面 API 负载;节点首次 pull 延迟取决于各 registry RTT。
557+- 模板渲染为安装时一次性操作,不引入运行时开销。
558+ 
559+#### 可靠性
560+ 
561+- mirror 配置错误时 CRI 拉取失败应 fail-fast,Pod 处于 ImagePullBackOff,安装流程可重试。
562+- K8s 1.28.8 离线包与 VersionConfig 绑定,避免 tag 漂移。
563+ 
564+#### 安全
565+ 
566+- 生产环境 mirror 应配置 CA,避免长期使用 `insecure_skip_verify`
567+ 
568+#### 兼容性
569+ 
570+- 未配置多仓/ repo 时保持现有单 `cr.openfuyao.cn` 行为(`disable-supported: true`)。
571+- K8s 1.28.8 与默认高版本安装路径并存,由离线包版本字段选择。
572+- 与 oFEP-0013 containerd 全局 mirror 配置可共存,文档说明优先级。
573+ 
574+#### 可服务性
575+ 
576+- 提供 k3s `registry.yaml` 与 containerd `certs.d` 样例及排障:`crictl pull` 验证。
577+- 明确 1.28.8 兼容矩阵与不支持在线低版本的说明。
578+ 
579+#### 可测试性
580+ 
581+- 单元测试:模板 `repo` 渲染默认值与自定义值。
582+- 集成测试:多 mirror 配置后 `crictl images` 来源正确。
583+- e2e:在线多源 pull;单 repo 渲染;1.28.8 离线全链路。
584+ 
585+#### 易用性
586+ 
587+- 伙伴场景优先文档化「同仓同项目 + 单一 repo 参数」最短路径。
588+- 扩展组件三方 chart 限制在 FAQ 中说明。
589+ 
590+### 测试计划
591+ 
592+[ ] 我/我们理解,相关组件的所有者可能会要求更新已有的测试,以便在提交实现该增强功能所需的更改之前,使代码达到足够稳固的质量标准。
593+ 
594+#### 先决条件测试更新
595+ 
596+- 补充 bke-manifests 模板渲染单测(`repo` 占位符)。
597+- 补充 containerd certs.d 生成逻辑单测。
598+ 
599+#### 单元测试
600+ 
601+| 包 | 覆盖重点 |
602+|----|----------|
603+| bke-manifests | `repo` 模板渲染、默认 registry 回退 |
604+| cluster-api-provider-bke | ContainerdConfig / certs.d 生成 |
605+| bkeadm/pkg/build | VersionConfig 1.28.8 制品解析 |
606+ 
607+#### 集成测试
608+ 
609+| 编号 | 场景 | 预期 |
610+|------|------|------|
611+| INT-MR-001 | 在线安装,多来源 YAML | Pod 分别从 cr/oepkg/上游 pull 成功 |
612+| INT-MR-002 | 单 repo 模板渲染 | 所有核心 Pod image 前缀一致 |
613+| INT-MR-003 | k3s registry.yaml 重定向 | 引导 Pod 从内部 Harbor pull |
614+| INT-MR-004 | containerd certs.d 重定向 | 节点 Pod 从内部 Harbor pull |
615+| INT-K128-001 | 离线包 v1.28.8 | 控制面 Pod 版本为 1.28.8 且 Running |
616+ 
617+#### e2e 测试
618+ 
619+| 编号 | 优先级 | 步骤 | 预期 |
620+|------|--------|------|------|
621+| MR-001-在线多仓 | P0 | 官方在线安装多组件集群 | 镜像来源符合分仓表 |
622+| MR-002-单repo自定义 | P0 | 导入 Harbor + repo 参数 | 集群安装成功 |
623+| MR-003-离线redirect | P0 | 离线包 + containerd mirror | 无公网 pull |
624+| K128-001-离线1.28.8 | P0 | 修改版本 YAML → 离线安装 | 控制面 1.28.8 Ready |
625+| K128-002-在线默认 | P1 | 在线安装不传低版本 | 仍为社区默认 K8s 版本 |
626+ 
627+### 毕业标准
628+ 
629+#### Alpha 阶段
630+ 
631+- 多仓在线 pull 与单 repo 模板渲染代码合入。
632+- K8s 1.28.8 离线制品与模板合入。
633+- P0 集成/e2e 用例通过。
634+ 
635+#### Beta 阶段
636+ 
637+- P0 + P1 用例稳定 ≥ 2 周。
638+- 至少 1 个伙伴环境完成单 repo 自定义安装验证。
639+- 1.28.8 离线安装文档与 VersionConfig 发布。
640+ 
641+#### GA 阶段
642+ 
643+- ≥ 3 次生产/准生产多仓或 1.28.8 离线部署记录。
644+- Beta 反馈问题关闭。
645+ 
646+### 升级/降级策略
647+ 
648+- **升级**:新增 mirror/模板不影响已有集群;新集群安装默认启用多仓规范。K8s 版本仅在**新装**离线包时选择,已装集群不自动降级控制面。
649+- **降级**:关闭多仓行为可回退为单 `cr.openfuyao.cn`(不传 repo、不配置额外 mirror)。
650+- 1.28.8 集群升级到高版本 K8s 不在本 oFEP 范围,遵循社区升级文档。
651+ 
652+### 版本倾斜策略
653+ 
654+- bkeadm、bke-manifests、CAP-BKE 版本需对齐,否则模板 tag 与 VersionConfig 可能不一致。
655+- K8s 1.28.8 节点与 1.33.x 引导节点可共存于不同集群,同一集群内控制面组件版本须一致。
656+- containerd v2.1.1 为 1.28.8 路径验证版本,与其他 K8s 版本组合需在矩阵中声明。
657+ 
658+## 生产可用性审查
659+ 
660+### 功能启用和回滚
661+ 
662+- **启用**:安装时配置 `imageRepo`/`repo`、mirror 文件或离线包 K8s 版本即可;无全局 Feature Gate 强制开启。
663+- **回滚**:移除额外 mirror 配置并重启 k3s/containerd(如适用);或使用默认在线/离线包不带低版本字段。
664+- **disable-supported**:true。
665+ 
666+### 监控要求
667+ 
668+- 安装失败可通过 Pod ImagePullBackOff 事件与 `crictl pull` 诊断。
669+- 暂无新增 Prometheus 指标;后续可考虑记录 pull 失败 registry 维度。
670+ 
671+### 依赖项
672+ 
673+- 各镜像 registry 可用性直接影响安装;hub.oepkgs.net 与上游 registry 网络策略需提前放通。
674+- K8s 1.28.8 依赖社区制品库发布对应 tag 镜像。
675+ 
676+### 故障排除
677+ 
678+| 故障模式 | 检测 | 缓解 |
679+|----------|------|------|
680+| mirror 配置错误 | ImagePullBackOff | 核对 registry.yaml / hosts.yaml |
681+| repo 渲染错误 | Pod image 路径异常 | 检查 BC 与模板默认值 |
682+| 1.28.8 镜像缺失 | pull 404 | 确认离线包 VersionConfig 与制品同步 |
683+ 
684+## 实施历史
685+ 
686+| 日期 | 里程碑 |
687+|------------|--------|
688+| 2026-01-29 | oFEP-0035 草案创建 |
689+| 2026-02-01 | 按 oFEP-0040 格式优化:补全摘要/目标/4+1 视图/Mermaid/DFX/测试计划 |
690+ 
691+## 缺点
692+ 
693+1.`repo` 参数无法覆盖「同仓不同项目」场景,仍需手动改 YAML。
694+2. 三方 chart 镜像无法统一改造,扩展组件体验不一致。
695+3. k3s mirror 变更需重启,引导集群有短暂影响。
696+4. K8s 1.28.8 仅离线支持,在线客户无法选用该版本。
697+5. 多 mirror + TLS skip 配置增加安全审计成本。
698+ 
699+## 替代方案
700+ 
701+| 方案 | 描述 | 未采纳原因 |
702+|------|------|------------|
703+| 全部镜像预聚合到单仓 | 安装前脚本 sync 所有镜像到 Harbor | 违背社区分仓规范;包体与同步成本高 |
704+| 仅手动改 YAML | 不提供模板与 mirror | 维护成本极高,易漏改 |
705+| 仅重定向不模板 | 所有场景用 mirror | 同仓同项目伙伴场景配置复杂 |
706+| 在线支持 1.28.8 | OBS 同步多版本 | 实现与测试范围大,首期仅离线 |
707+ 
708+## 所需基础设施
709+ 
710+- 社区制品流水线按 cr / oepkg / 上游分仓构建与校验。
711+- 发布 K8s v1.28.8 离线镜像与二进制制品及 VersionConfig。
712+- bke-manifests 仓库核心 YAML/chart 整改 PR 与评审流程。
713+- CI:多仓 pull 与 1.28.8 离线安装冒烟用例。