使用Helm部署MariaDB至K8s集群遇FORBIDDEN错误求助
问题场景
在M2芯片(ARM64架构)的MacBook上,用Docker Desktop内置的K8s集群,通过groundhog2k/MariaDB Helm包部署MariaDB,执行了以下操作:
- 添加Helm仓库:
helm repo add groundhog2k https://groundhog2k.github.io/helm-charts/
- 执行安装命令:
helm upgrade --install my-local-cluster groundhog2k/mariadb \ --version 0.8.0 \ --namespace mariadb \ --set auth.rootPassword="my-root-pwd" \ --set master.persistence.size=10Gi \ --set auth.username="my-usr-name" \ --set auth.password="my-pwd"
收到错误提示:
UPGRADE FAILED: cannot patch "my-local-cluster" with kind StatefulSet: StatefulSet.apps "my-local-cluster" is invalid: spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', 'updateStrategy', 'persistentVolumeClaimRetentionPolicy' and 'minReadySeconds' are forbidden"
错误原因
这个错误的核心是Kubernetes StatefulSet的更新限制:StatefulSet的spec字段里,只有replicas、template、updateStrategy、persistentVolumeClaimRetentionPolicy和minReadySeconds这几个字段允许后续更新,其他字段(比如存储PVC的大小、初始化阶段设置的认证参数等)一旦StatefulSet创建完成,就不能通过patch方式修改。
你用helm upgrade --install时,如果该Release(my-local-cluster)已经存在,Helm会尝试更新现有StatefulSet,但你修改的master.persistence.size以及认证相关参数属于StatefulSet不允许更新的字段,触发了K8s的校验拦截。
解决方法
方法1:删除现有Release后重新安装(适合无数据保留需求)
如果当前集群里的MariaDB实例没有需要保留的数据,直接删除现有Release再重新安装即可:
# 删除现有Release helm uninstall my-local-cluster --namespace mariadb # 重新执行安装命令 helm upgrade --install my-local-cluster groundhog2k/mariadb \ --version 0.8.0 \ --namespace mariadb \ --set auth.rootPassword="my-root-pwd" \ --set master.persistence.size=10Gi \ --set auth.username="my-usr-name" \ --set auth.password="my-pwd"
方法2:保留数据的前提下调整配置
如果需要保留现有数据,分两部分处理:
修改PVC存储大小
- 先找到对应PVC名称(通常为
data-my-local-cluster-0):kubectl get pvc -n mariadb - 编辑PVC,修改存储大小:
将kubectl edit pvc data-my-local-cluster-0 -n mariadbspec.resources.requests.storage的值改为10Gi,保存退出即可。
- 先找到对应PVC名称(通常为
修改认证参数
认证参数存在Secret中,直接修改Secret后重启Pod生效:# 更新root密码(注意替换为你的密码) kubectl patch secret my-local-cluster-mariadb -n mariadb -p '{"data": {"root-password": "'$(echo -n "my-root-pwd" | base64)'"}}' # 更新普通用户密码 kubectl patch secret my-local-cluster-mariadb -n mariadb -p '{"data": {"password": "'$(echo -n "my-pwd" | base64)'"}}' # 重启Pod让新配置生效 kubectl delete pod my-local-cluster-0 -n mariadb
方法3:强制更新(不推荐)
可以用helm upgrade --install --force强制执行更新,但这会删除并重建StatefulSet的Pod,大概率导致数据丢失,仅适合测试环境临时使用。
内容的提问来源于stack exchange,提问作者user842225

