Kubernetes 云原生设计与跨组件重构:从标准日志、可注入配置到 OpenStack 编排的演进路径
【免费下载链接】communityKubernetes Community Documentation项目地址: https://gitcode.com/GitHub_Trending/com/community
导读:本文基于 KubeCon 2017 Contributor Summit 上由 Joe Beda 与 Amit Kumar Jaiswal 主持的「Cloud Native Design/Refactoring across Kubernetes」专题讨论纪要,系统梳理 Kubernetes 组件云原生化的三大支柱(标准化日志、可注入配置、可查询 API)、OpenStack-Helm / Kolla-Kubernetes 编排场景,以及社区在跨组件重构中遇到的真实 Issue、开放问题与观众反馈;同时结合本仓库中同期峰会纪要、组件配置规范文档与 SIG 组织资料,为读者还原 2017 年末 Kubernetes 组件架构演进的关键脉络,并提供可继续深挖的仓库线索。
会议定位与摘要解读
该场次是 KubeCon 2017(12 月)Contributor Summit 的专题讨论,主持人为 Kubernetes 创始人之一 Joe Beda(@jbeda)与 Amit Kumar Jaiswal(@AMIT_GKP)。讨论的核心命题是:
如何在 Kubernetes 组件中干净地支持云原生行为——标准化 Kubernetes 日志、可注入的配置以及通用的可查询 API。
值得注意的是,摘要明确指出这场讨论并不只围绕容器本身:通过 OpenStack-Helm 或 Kolla-Kubernetes 在 Kubernetes 内编排 OpenStack 的部署与管理,为获得更好的升级能力铺平了道路;同时它也能改善"独立运行单个 Kubernetes 服务"或"让 Kubernetes 服务与相邻技术组合运行"的能力。也就是说,这场讨论把"云原生"从应用层延伸到了基础设施编排层——连 OpenStack 这样的传统基础设施软件本身,也可以作为工作负载被 Kubernetes 托管和编排。
会议议程:五步主线
会议的 Agenda 勾勒出一条从宏观到落地的完整思考路径,本文后续各节即沿此脉络展开:
- Cloud Native Ecosystems——云原生生态全景;
- Kubernetes Abstractions & Primitives——Kubernetes 的抽象与原语;
- Kubernetes Design Patterns——Kubernetes 设计模式;
- Refactoring across Kubernetes——跨 Kubernetes 组件的重构;
- Benefits of using Kubernetes——使用 Kubernetes 的收益。
可以看出,讨论试图回答两个层次的问题:Kubernetes 自身组件应当如何云原生地设计与重构;以及Kubernetes 作为平台能对外部系统(尤其是 OpenStack 这类既有基础设施软件)带来什么样的编排收益。
云原生行为的三大支柱
摘要将"云原生行为"具体化为三个可验证、可落地的技术特征,这也是本场讨论最核心的技术骨架:
1. 标准化 Kubernetes 日志
Kubernetes 日志体系正在从"依赖具体运行时路径"走向"标准化采集"。本场讨论中对应的落地议题是:
- 将fluentd 改为使用 CRI 日志路径,并逐步弃用旧的容器日志路径。
这条线索与同期峰会的其他讨论相互印证:extending-kubernetes.md 明确将(gRPC) CRI列为 Kubernetes 的核心扩展机制之一,并指出"Kubelet 之下是 gRPC";本仓库 committee-steering/meeting-notes-archive/2018-meeting-notes.md 中也记录了"CRI 被提升到 v1(从 v1alpha2)"的后续进展(1.23 版本)。也就是说,"fluentd 读取 CRI 标准日志路径"正是把日志采集从"容器运行时私有格式"迁移到"Kubernetes 标准接口"这一云原生方向上的具体动作。
2. 可注入的配置(Injectable Configuration)
组件配置的注入方式是当时社区讨论的热点,核心矛盾是命令行 Flag 与文件 / ConfigMap 两种配置来源的优先级。本场讨论将其列为开放问题:
- Kubelet Flag 子字段优先级 vs 文件 / ConfigMap 到 Kubelet Config——即 Kubelet 的各 Flag 子字段与通过配置文件 / ConfigMap 提供的 Kubelet 配置,应当如何裁决优先级。
这一问题的完整背景可以在仓库文档中找到更系统的表述。contributors/devel/sig-architecture/component-config-conventions.md 开篇就指出了 Flag 驱动配置的六大痛点:扁平命名空间导致--help失去参考价值、难以按实例差异化配置、修改需重启二进制、命令行对同主机非特权进程可见(不适合传递机密)、Flag 作为公共 API 却无法版本化,以及配置变更的兼容性风险。而 archive/wg-component-standard/component-config/README.md 更是直接记录了当时社区对此问题的结论性线索:Kubelet flags take precedence over config from files/ConfigMaps(对应 kubernetes/kubernetes 的 PR #56097),并提醒"若希望多个实例共享同一份配置源(例如通过 ConfigMap 下发配置),则应避免迁移这类实例特有值(如--hostname-override)的 Flag"。这为"Flag 与 ConfigMap 优先级"提供了当时社区的裁决方向。
3. 通用可查询 API(Common Queryable APIs)
"可查询"意味着组件能力应通过统一的 API 面暴露,而不是散落在私有命令行与日志中。本场讨论关联的具体诉求包括:
- 帮助社区完善API 文档与配置最佳实践;
- 在OpenAPI schema 中定义对象定义(Object definition),例如
PersistentVolumeSpec、PersistentVolumeClaimSpec的定义; - 讨论
PersistentVolumeSpec / PersistentVolumeClaimSpec这类对象在 OpenAPI 描述中的组织方式,为自动化工具(如 kubectl、客户端库、校验工具)提供机器可读的契约。
仓库中 contributors/devel/sig-architecture/api-conventions.md 正是这一方向上的长期成果沉淀(其中专门讨论了 ConfigMap 等资源在 OpenAPI 规范中 group 省略等细节),可作为读者继续研究 API 约定的入口。
OpenStack 编排:云原生设计的外部延伸
摘要中特别点名的两个项目是OpenStack-Helm与Kolla-Kubernetes——它们都是在 Kubernetes 之上部署与管理 OpenStack 的典型方案。讨论认为这类编排带来两个直接收益:
- 更好的升级能力:把 OpenStack 组件容器化并纳入 Kubernetes 编排后,升级可以借助滚动更新、健康检查与声明式状态管理来执行,而不是依赖手工的逐机操作;
- 更强的组合能力:单个 Kubernetes 服务既可以独立运行,也可以与相邻技术(如监控、日志、网络组件)自由组合。
从社区组织演进的视角看,本仓库也保留了后续线索:committee-steering/meeting-notes-archive/2018-meeting-notes.md 中记录了 Steering Committee 对SIG Cloud Provider 与 SIG OpenStack 合并的推动,以及围绕"OpenStack 抽取 KEP"的讨论;sigs.yaml 中sig-cloud-provider条目下的 Slack 频道(api-reviews、bugs、feature-requests、maintainers、pr-reviews、proposals 等)也印证了云厂商接入话题在社区治理层面的正式化。这些资料表明,"在 Kubernetes 内编排 OpenStack"并非一次性的技术演示,而是进入了长期的组织化推进轨道。
跨 Kubernetes 重构:现场提出的实战议题
会议纪要的 Issues 部分列出的是面向贡献者的开放任务,也是本场讨论最具可操作性的内容:
1. 寻找重构 Issue 的协作者
会议明确在寻找帮助处理跨 Kubernetes 重构类 Issue 的贡献者,列举了 kubernetes/kubernetes 仓库中的#51405、#46735、#54090、#55151等编号(原文未展开每个 Issue 的具体内容,仅作为重构工作量的样例)。对于想参与开源重构的读者,这类"从具体 Issue 切入"的方式是标准的贡献路径,可参照仓库 contributors/guide/issue-triage.md 了解 Issue 治理流程。
2. 整合 volume 工具文件
一个具体到文件级别的重构任务:整合 volume 相关的 util 文件,包括:
pkg/volume/util.gopkg/volume/util/util.gopkg/volume/util/volumehelper/volumehelper.go
会议提出的诉求是为每个文件补充更好的文档,明确其各自职责边界。这类"文件越聚越多、边界模糊"的问题,是单体仓库中典型的可重构信号——与同期 breaking-up-the-monolith.md 讨论的"把代码移动到看起来像多个仓库"的思路一脉相承。
3. 增强 e2e 测试以跟踪云厂商 API Quota
- Enhancing e2e tests to track cloud provider's API Quotas——即在端到端测试中跟踪云厂商 API 配额。
这一议题与同期 cloud-provider.md 的讨论高度呼应:该场次提到 e2e 测试中存在大量if !GCE -> skip式的跳过逻辑,缺乏对非 GCE 云厂商的覆盖,并讨论了分布式 CI 下各云厂商自建测试、结果回传 testgrid 的设想。跟踪 API Quota 的目的在于:当集群规模或并发操作逼近云厂商限流阈值时,e2e 测试能提前暴露问题,而不是在生产环境才触发配额错误。
4. fluentd 迁移到 CRI 日志路径
- 将 fluentd 改为使用 CRI 日志路径,最终弃用旧容器路径(详见上文"标准化日志"一节)。
5. 特定应用场景下的部署 / 采纳问题
- Issues with deploying/adopting Kubernetes for specific applications use-cases——针对特定应用用例部署/采纳 Kubernetes 时遇到的问题。这属于"落地反馈反哺平台演进"的议题,与本场讨论"既有平台能力、又服务于具体业务"的定位一致。
现场开放问题(Questions)与解决线索
Questions 部分记录了现场提出的技术问题,以下结合仓库资料给出当时的讨论背景与线索:
| 开放问题 | 讨论要点与仓库线索 |
|---|---|
| 安全与 Kubernetes 的粒度 | 如何在组件与 API 层面实现更细粒度的安全控制;相关延伸机制见 extending-kubernetes.md 中列出的 admission webhooks、RBAC、KMS 等扩展点。 |
Kube API 不应依赖--cloud-provider与--cloud-config | 这是云厂商接入解耦的核心诉求。同期 cloud-provider.md 给出了对应方案:引入cloud-controller-manager(CCM)、将cloudprovider=external设为新 Flag,使 API Server 不再直接感知具体云厂商。 |
| API 文档与配置最佳实践 | 见 contributors/devel/sig-architecture/api-conventions.md 与 component-config-conventions.md。 |
| 面向 NFV/SDN 的测试框架 | 网络功能虚拟化与软件定义网络场景下的测试工具需求,属于 Kubernetes 网络生态的前沿问题。 |
| Kubelet Flag 子字段优先级 vs 文件 / ConfigMap | 上文已述,社区最终方向是Flag 优先于文件 / ConfigMap(PR #56097),见 archive/wg-component-standard/component-config/README.md。 |
| 如何从快照动态供给 AWS EBS 卷 | 存储供给能力需求,属于云厂商存储插件与 CSI 演进的前奏;同期 cloud-provider.md 也提到卷方案从依赖 FlexVolume 转向CSI,时间点不早于 Q3。 |
OpenAPI 中PersistentVolumeSpec、PersistentVolumeClaimSpec的对象定义 | API 描述能力的完善需求,与"通用可查询 API"支柱直接相关。 |
| K8s cephfs 的 FUSE client 支持 | 存储接入方式(内核态 vs FUSE 用户态挂载)的取舍,属于存储生态的开放议题。 |
与同期峰会讨论的交叉印证:组件解耦的整体图景
本场讨论并非孤立的头脑风暴。它与同目录下的三份纪要共同拼出了 2017 年末 Kubernetes 组件架构演进的完整图景:
- cloud-provider.md:详述了云厂商代码外移的进展——kube-controller-manager 被禁用、cloud-controller-manager 在 GCE 上完成集群拉起验证;还记录了"胜利标准"(major cloud providers 运行 CCM、卷可留在树内直到 CSI 生产可用)以及"删光树内云厂商代码后 thockin 请蛋糕和啤酒"的社区趣闻。
- breaking-up-the-monolith.md:围绕"是否拆分 k/k 单体仓库"展开激辩,核心论据之一是云厂商代码是天然的拆分突破口——外移后长尾云厂商不必等待上游发布节奏(
staging目录被视作"已拆分"的样板)。 - extending-kubernetes.md:系统盘点扩展机制(API 扩展、admission webhooks、Finalizers、FlexVolume、CSI、CRI、CNI、KMS、kubectl 插件、External Cloud Provider 等),为本场讨论的"可查询 API"与"可注入配置"提供了机制层面的支撑。
将四份纪要放在一起可以看出,"云原生设计/重构"在 2017 年末的共识是:通过标准接口(CRI、CSI、CCM、ConfigMap)把组件能力外置化、模块化,让 Kubernetes 核心保持精简,同时让外部系统(如 OpenStack)成为一等公民工作负载。这一方向在后续多年被持续兑现(cloud-controller-manager 正式化、CSI GA、CRI v1 等),本仓库 sig-cloud-provider、sig-storage、sig-node 等 SIG 目录即为这些工作的长期载体。
总结:一场讨论映射出的云原生重构方法论
回顾这场 2017 年的专题讨论,其价值不在于给出最终答案,而在于确立了判断组件是否"云原生"的三个可操作判据:
- 日志是否走标准路径——fluentd 迁移到 CRI 日志路径,弃用私有容器路径;
- 配置是否可注入、可版本化——Flag 与文件 / ConfigMap 的优先级得到明确裁决(Flag 优先),配置 API 走向
*.config.k8s.io版本化体系; - 能力是否通过可查询 API 暴露——OpenAPI 对象定义、API 文档与最佳实践持续完善。
在此基础上,跨组件重构的具体抓手(volume util 文件整合、云厂商 API Quota 的 e2e 跟踪、云厂商代码外移)与开放问题(Kube API 解耦--cloud-provider、EBS 快照供给、cephfs FUSE 支持等),共同构成了 Kubernetes 从"单体编排器"走向"云原生平台"的真实演进路径。读者可沿本仓库的 component-config-conventions.md、cloud-provider.md 与 extending-kubernetes.md 继续深入,观察这些 2017 年的设想如何在代码与治理层面逐步落地。
【免费下载链接】communityKubernetes Community Documentation项目地址: https://gitcode.com/GitHub_Trending/com/community
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考