Kubernetes CRD的versions配置下storage字段的含义是什么?
CRD中storage字段的核心作用
storage字段的唯一作用是指定CRD的多个版本中,哪一个版本的格式会被作为持久化格式存入etcd数据库。
Kubernetes允许一个CRD同时对外提供多个版本的API服务(通过served: true开启对应版本的接口访问权限),但同一份自定义资源实例在etcd中只能存储一份,因此必须明确指定唯一的存储版本,避免多版本存储冲突。
实际运行逻辑示例
假设你定义的CRD同时存在两个版本配置:
versions: - name: v1beta1 served: true storage: false - name: v1 served: true storage: true
实际运行时的逻辑是:
- 不管用户通过
v1beta1接口还是v1接口提交自定义资源创建/更新请求,Kubernetes都会先将资源转换成v1版本的格式,再存入etcd - 不管用户请求
v1beta1接口还是v1接口查询资源,Kubernetes都会先从etcd取出v1格式的存储数据,再转换成用户请求的版本格式返回 - 两个版本的接口都可以正常对外提供服务,仅底层存储格式固定为标记
storage: true的版本
强制使用规则
- 一个CRD的所有版本中,有且仅有一个版本可以设置
storage: true,不符合该规则的CRD会直接被apiserver拒绝创建 - 存储版本变更需要配合数据迁移:如果你要将存储版本从旧版本切换到新版本,必须先将etcd中已存储的所有旧版本自定义资源全部转换为新版本格式,再修改
storage标记,否则旧数据读取会出现格式兼容问题 - 存储版本可以同时设置
served: true(正常对外提供接口),也可以在升级过渡阶段将旧存储版本设置为served: false(仅用于兼容旧存量数据,不对外提供接口访问)
内容的提问来源于stack exchange,提问作者beatrice
相关产品推荐
相关产品推荐

