Skip to content

CRD 管理

原文:https://gateway-api.sigs.k8s.io/guides/getting-started/crd-management/

Gateway API 基于 CRD 构建。这带来了个重要的好处:其中值得注意的,Gateway API 的每一次发布都支持 Kubernetes 的近 5 个次要版本。这意味着你通常不需要为获得最新 API 版本而升级 Kubernetes 集群。

这种灵活性带来了一些容易混淆的余地。本指南在回答与 Gateway API CRD 管理相关的最常见问题。

CRD 应由谁管理?

归根结底,CRD 是一类权限很高集群级资源。这意味着应该由集群管理员集群提供方来负责管理集群中的 CRD。

从实践角度来说,下述任何一种方式是合理的:

  • 集群管理员安装 CRD。
  • 集群供应工具或提供方安装并管理 CRD。

部分实现可能希望 CRD 打包进自己的安装包里以简化安装流程。这种做法是可以接受的只要它们永远不会:

  1. 覆盖那些无法识别版本更新的 Gateway API CRD。
  2. 覆盖那些发布通道不同的 Gateway API CRD。
  3. 删除 Gateway API CRD。

Issue #2678 探讨了一种可行的实现方案。

升级到新版本

Gateway API 通过两个发布通道来发布 CRD。坚持使用标准通道的 CRD,可以让 CRD 升级更简单让升级更安全

总体准则

  1. 避免回退(rollback)。新版本 CRD 可能新增字段和特性。回退到 CRD 的旧版本可能导致这些配置丢失
  2. 升级前阅读发布说明。某些情况下,发布说明中可能包含你升级前必须遵守的指导。
  3. 了解 Gateway API 的版本策略知道哪些内容可能发生变化。
  4. 虽然通常情况下一次跨多个 Gateway API 次要版本升级是安全的,但最安全、最经实战检验的路径还是一个次要版本一个次要版本升。

校验 Webhook

早期版本的 Gateway API 带有一个校验 webhook。从 v1.0 开始,该 webhook 已正式被弃用,改用直接嵌入 CRD 内部的 CEL 校验。在 Gateway API v1.1 中,该 webhook 将被完全移除。这意味着:升级到较新版本的 Gateway API 时,校验 webhook 已不再需要单独考虑。

API 版本移除

NOTE

注意

这是一个进阶使用场景,目前只适用于从 v0.5.0 起就一直在同一集群里使用 Gateway API 的用户。

Gateway API 的某个发布可能移除一个 alpha API 版本(如 v1alpha2)——前提是该 CRD 更新更稳定的 API 版本。在标准通道中,移除一个 API 版本拆分至少 4 个次要发布:

  1. 较新版本被设置为存储版本(storage version)。
  2. 该版本被弃用(会发布说明中说明,并使用该弃用版本时给出弃用警告)。
  3. 该版本不再被 served,但依然被保留在 CRD 中以支持 API 版本之间的自动转换。
  4. 该版本不再包含在 CRD 中。

如果你正在使用的某个 CRD 走完了这个过程(包括存储版本迁移),可能会有部分资源仍然停留在旧的(被弃用的)存储版本上。当某个 CRD 的存储版本被更新时,该更新只会在该资源被重新保存对该资源本身生效。

例如,如果你在 Gateway API v0.5.0 的 CRD 下创建了一个名为 foo 的 GatewayClass,那么该 GatewayClass 的存储版本v1alpha2。如果这个 foo GatewayClass 自那以后从未被修改或更新过,那么你将无法直接升级到 Gateway API v1.0.0 的 CRD——因为我们的某个资源仍然在使用 v1alpha2 作为存储版本,而 v1alpha2 已经不再包含在 CRD 中(上面的步骤 4)。

能够升级,你需要采取某种动作,把仍在使用旧存储版本的 GatewayClass 更新一下。例如,对个 GatewayClass 发出一个kubectl patch 可以起到这种效果。幸运的是有工具可以把这个过程自动化——kube-storage-version-migrator 会自动更新资源,保证它们使用最新的存储版本。

实验通道

顾名思义,实验通道并不提供与标准通道同样的稳定性保证。对一个次要发布来说,下面任何一种情况实验通道 CRD 都是可能的

  • 对现有 API 字段或资源做破坏性变更
  • 不经过弃用就直接移除 API 字段或资源。

实践中这意味着:升级到新的实验版本时,可能需要你先卸载再重装实验 CRD。如果出现这种情况,发布说明中做明确说明。

基于 MIT 协议发布