升级K8s中MongoDB Helm Chart后认证报错及StatefulSet更新问题
问题描述
- 将MongoDB Helm Chart从10.1.0升级至11.2.0,原版本未开启认证
- 升级时配置root密码后,仲裁节点持续报认证错误,Pod陷入崩溃循环
- 排查发现是
persistence: true导致的问题,将其设为false并删除Helm发布后重新安装成功 - 但执行
helm3 upgrade时触发错误:Error: UPGRADE FAILED: cannot patch with kind StatefulSet: StatefulSet.apps is invalid: spec: Forbidden: updates to statefulset spec for fields other than 'replicas', 'template', and 'updateStrategy' are forbidden
当前需求:保留persistence: true并为MongoDB开启认证
环境配置
values.yaml
mongodb: architecture: replicaset replicaCount: 2 podAntiAffinityPreset: hard auth: enabled: false useStatefulSet: true persistence: enabled: true size: 1Gi resources: limits: cpu: 1 memory: 2Gi requests: cpu: 100m memory: 1Gi metrics: enabled: true livenessProbe: enabled: true readinessProbe: enabled: true resources: limits: cpu: 200m memory: 256Mi requests: cpu: 100m memory: 128Mi
GitLab CI 脚本
script: - helm3 install --namespace="$NAMESPACE" --wait --timeout $HELM_TIMEOUT ..some other stuff.. --set mongodb.auth.enabled="true" --set mongodb.auth.rootPassword="$MONGO_ROOT_PWD_STAGE" --set mongodb.auth.replicaSetKey="$MONGO_REPLICA_SET_KEY_STAGE" --values ${!HELM_VALUES} --kube-context stage "$RELEASE_NAME" chart/
解决方案
核心原因
- StatefulSet创建后,除
replicas、template、updateStrategy外的spec字段不允许修改,直接升级会触发Kubernetes的限制 - 旧PVC中的MongoDB数据未包含认证配置信息,开启认证后节点无法通过身份校验,导致崩溃循环
操作步骤
备份现有数据
- 进入主Mongo Pod:
kubectl exec -it <主Pod名称> -n $NAMESPACE -- mongosh - 导出所有数据库:
mongodump --out /tmp/mongo-backup - 将备份文件复制到本地:
kubectl cp <主Pod名称>:/tmp/mongo-backup ./mongo-backup -n $NAMESPACE
- 进入主Mongo Pod:
清理旧资源
- 删除Helm发布:
helm3 uninstall $RELEASE_NAME -n $NAMESPACE - 删除关联PVC:
kubectl delete pvc -l app.kubernetes.io/name=mongodb -n $NAMESPACE
- 删除Helm发布:
配置认证参数
可以直接修改values.yaml中的auth.enabled为true,或者保留GitLab CI中的--set参数覆盖配置,确保persistence.enabled保持true重新安装Chart
执行GitLab CI中的安装命令(或本地运行),等待Mongo集群初始化完成恢复备份数据
- 进入新的主Mongo Pod:
kubectl exec -it <新主Pod名称> -n $NAMESPACE -- mongosh -u root -p $MONGO_ROOT_PWD_STAGE - 复制本地备份到Pod:
kubectl cp ./mongo-backup <新主Pod名称>:/tmp/mongo-backup -n $NAMESPACE - 恢复数据:
mongorestore /tmp/mongo-backup --username root --password $MONGO_ROOT_PWD_STAGE
- 进入新的主Mongo Pod:
内容的提问来源于stack exchange,提问作者thepylot
相关产品推荐
相关产品推荐

