深入了解 OpenShift 内部机制:揭开 Origin 仓库的秘密
如果你使用过 OpenShift 或安装过其免费发行版 OKD,一定见过 openshift/origin 仓库。在 OpenShift 3 和早期 4.x 版本时代,整个平台的核心代码都存放在这里。开发者在这里克隆了大部分 Kubernetes 代码库,并在此基础上构建自己的组件。
但如果你现在去访问这个仓库,你会发现那里已经看不到旧的结构了。没有熟悉的 controller 文件,也没有 hyperkube 二进制文件的源代码。所有代码都去哪了?Red Hat 为什么还要维护一个拥有近九千星的项目?
OpenShift 源代码去哪了
2020 年夏,在 OpenShift 4.6 发布之前,开发团队进行了重组。单体架构已经成为了障碍:在一个地方同步上游 Kubernetes 的变更并运行自己的测试,变得越来越复杂。
因此,代码库被拆分:
- 所有 Kubernetes fork 相关的工作以及构建
hyperkube等二进制文件都移到了openshift/kubernetes仓库。 openshift/origin仓库变成了一个专门的测试中心。
现在 Origin 的主要用途是为 openshift-tests 二进制文件提供归属,并提供一组 e2e 场景来验证集群是否符合 OpenShift 和 Kubernetes 标准。
openshift-tests 中的端到端测试是如何运作的
在这个项目中构建测试与运行常规 go test 完全不同。这里会编译一个完整的 openshift-tests 二进制文件,其中打包了数百个集成和 e2e 场景。
OpenShift 团队对编写 e2e 测试有严格规则。两个不同的测试不应相互重复超过 10% 的功能。不要指望对每个 API 验证错误都进行细致检查。这些测试的目的是从始至终跟踪真实用户的使用路径:部署应用程序、验证网络策略是否正常工作、确保路由正确,以及收集指标。
你可以用项目根目录下的单条命令编译测试工具:
make
生成的二进制文件既可以运行标准 Kubernetes 一致性测试,也可以运行针对 Red Hat 组件的窄范围特定检查。
环境选择器替代注解
过去,为了在特定集群配置上跳过不兼容的测试,工程师会直接在 Go 代码中附加注解。这在升级时会造成混乱。
在现代 Origin 分支中,注解已被消除。现在过滤由所谓的环境选择器(environment selectors)控制。框架在运行前会查看目标集群参数(如网络提供商类型或云平台),并动态过滤掉不适用的测试。
排除逻辑分为两个级别:
- 标准 Kubernetes 测试的异常规则位于
openshift/kubernetes中的environment_selectors.go和disabled_tests.go文件中。 - OpenShift 特定测试的规则直接位于 Origin 的
pkg/test/extensions目录中。
如果你正在为 OpenShift 编写自己的 operator,这种结构让你很容易理解为什么某个上游测试在你的环境中没有运行。
依赖同步和 Go 校验和的坑
由于 origin 依赖于 openshift/kubernetes 的一个 fork,开发者需要不断更新 Go 模块。为了避免手动操作,项目中添加了一个 hack/update-kube-vendor.sh 脚本。
你可以用以下命令为特定分支或 SHA 提交运行 vendor 更新:
./hack/update-kube-vendor.sh master
该脚本甚至可以从未合并的 pull request 中拉取更改。为此,请将你的 fork 地址作为第二个参数传递:
./hack/update-kube-vendor.sh my-feature-branch github.com/myname/kubernetes
使用这个脚本时,很容易遇到一个烦人的错误。Go 的校验和代理(sum.golang.org)有时会返回 410 Gone,如果某个提交刚刚创建,校验和数据库还没有来得及索引它。
错误看起来像这样:
go: k8s.io/[email protected] ... 410 Gone
server response: not found
解决方法很简单——在 vendor 更新期间强制禁用校验和数据库验证:
GOSUMDB=off hack/update-kube-vendor.sh master
快速运行外部示例
除了测试之外,仓库中还保留了一个有用的 hack/update-external-example.sh 脚本。它从第三方生态系统仓库下载最新的应用程序清单和快速入门指南,并将其放入 examples 文件夹。
如果你需要经过验证的 Deployment、Route 或 StatefulSet 示例用于 OpenShift,值得查看 examples/quickstarts 文件夹——其中包含经过验证的配置。
如今谁从 Origin 仓库中受益
如果你只是运维 OpenShift 集群,不需要每天都深入研究 Origin 代码。但在以下三种情况下,这个项目会非常有帮助:
- 你正在编写自己的 operator 或平台扩展,并希望在 CI/CD 流水线中运行官方 e2e 检查。
- 你正在为 OKD 开发做贡献,或在为特定硬件调试自定义 Kubernetes 构建。
- 你想了解 Go 中大规模商业项目如何实现分布式系统测试架构。
该仓库采用 Apache 2.0 许可证开源,一个活跃的社区为所有当前平台版本维护着分支。
相关项目