DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

ECK 修改存储模板报 Any other change is forbidden:先区分扩容与换盘

ECK 更新 volumeClaimTemplates 被拒绝时,对照已有 NodeSet 判断扩容、换 StorageClass 和减小容量,按 Operator 管理流程处理并保护数据。

给 ECK 管理的 Elasticsearch 更新配置,Webhook 拒绝 volumeClaimTemplates,提示:

volume claim templates can only have their storage requests increased, if the storage class allows volume expansion.
Any other change is forbidden

已经设置 allowVolumeExpansion: true,也不表示整个存储模板都能修改。这项设置允许符合条件的容量增加,不能让已有 NodeSet 随意更换 StorageClass、缩小容量或改其他模板字段。

本文针对 ECK 的 Elasticsearch 自定义资源,不是单独创建的 PVC。Elasticsearch 版本号不能代替 ECK Operator 和 CSI 驱动的版本;处理前应核对当前安装组合。

PVC 列表为空,仍要查已有 Elasticsearch 对象

更新同名资源时,校验面对的是旧资源与新配置的差异。只运行不带命名空间的 kubectl get pvc,看到 default 中没有 PVC,不能证明目标命名空间里没有旧 Elasticsearch 对象或存储模板。

以下是只读检查示例,app、es 和 ebs-sc 都须换成实际名称:

kubectl -n app get elasticsearch es -o yaml
kubectl -n app get statefulset
kubectl -n app get pvc
kubectl get storageclass ebs-sc -o yaml

将现有 Elasticsearch 对象与待提交配置逐项比较,重点看相同 NodeSet 名称下的 volumeClaimTemplates:请求容量是否增加、storageClassName 是否变化、访问模式和其他字段是否相同。比较的是当前集群对象,不能只与本地上一次保存的 YAML 比较。

若同名资源确实不存在,或者模板只有允许的容量增加却仍被拒绝,应保留完整校验错误、实际对象和 Operator 版本继续定位。不要把所有相同错误都直接归为 StorageClass 不支持扩容,也不要为了验证猜测先删除 PVC。

只增加容量:在 ECK 管理入口更新请求值

确认仍使用原来的 StorageClass,且它允许扩容、对应 CSI 驱动支持扩容时,可以在 Elasticsearch 资源的存储模板中增加请求容量。下面只展示既有模板内的一项示例变化,例如从 100Gi 增至 150Gi:

resources:
  requests:
    storage: 150Gi

保留原 NodeSet 名称、模板名及其他字段,通过项目原有 Helm、GitOps 或资源发布入口应用。ECK 会相应更新 PVC,并自动重建管理中的 StatefulSet;不要绕过 Operator,另改它生成的 StatefulSet 来保留两套不一致的目标配置。

StorageClass 开关只是前提之一。云盘配额、驱动能力和文件系统扩容过程仍可能失败;需要检查 PVC 的请求值、状态容量、事件,以及应用实际可用空间。只看到模板提交成功不代表文件系统已经变大。

支持使用中扩容的驱动可以在线完成相应文件系统调整;不支持时,可能需要在卷扩容后按驱动与 ECK 的要求受控替换 Pod。替换前检查集群健康、副本和允许的维护影响,不能把单个存储开关当作无中断保证。

不要直接增加 PV 的 capacity 来假装磁盘已扩容。控制平面可能因此认为期望状态已满足,而实际底层盘并未改变。已经成功扩大的卷也不能靠把 YAML 改回原容量缩小;容量增加前就应确认成本、容量和恢复预案。

更换 StorageClass 或减小目标容量:走新 NodeSet 迁移

这类变化需要新的存储,而不是对已有 PVC 原地改模板。可规划一个名称不同的新 NodeSet,保留所需角色与节点配置,使用目标 StorageClass 和容量,先让它加入集群,再通过 ECK 管理流程移除旧 NodeSet。

迁移前完成可验证的 Elasticsearch 数据备份,确认新存储容量能容纳数据、集群有足够资源和迁移期间的冗余,并保留旧配置。新节点无法调度、卷未绑定或分片迁移受限时,应停在旧节点仍可用的阶段检查,不能先删除旧 PVC 让流程继续。

ECK 在移除旧 NodeSet 的 Pod 前会协调数据迁移,但这不等于独立备份,也不能保证任意集群配置都顺利完成。采用分阶段更新,能在撤掉旧节点前核对新节点就绪、分片迁移、业务请求和集群健康;仅改名字再立即改回,无法代替这些检查。

还要核对删除策略:ECK 缩减节点时会删除对应 PVC,PV 及底层盘是否保留取决于回收策略。DeleteOnScaledownOnly 只在删除整个 Elasticsearch 资源时保留 PVC,并不会阻止缩容删除 PVC。不要把这个选项当作迁移过程中旧数据一定保留的保证。

以实际容量和数据状态验收

扩容方案应确认请求值、PVC 状态容量和容器内文件系统容量一致,原有数据可读写;迁移方案还要确认新节点承担了预期分片,旧节点移除后集群和业务仍正常。报错消失只是第一步。

迁移尚未撤掉旧节点时,可恢复原管理配置并按集群状态停止后续切换。旧卷已经删除后,不能仅凭恢复 NodeSet 名字找回数据,应使用事先确认的保留卷或备份恢复流程。整个排查不需要禁用校验 Webhook,也不应改用 emptyDir 绕过持久化限制。