如何在Kubernetes的MySQL Deployment中添加新数据库用户?
首先明确:官方MySQL镜像(包括你用的5.6版本)只支持通过MYSQL_USER和MYSQL_PASSWORD这一组环境变量创建一个初始用户,所以没法直接添加新的环境变量来生成第二个用户。下面分场景给你具体的解决方案:
场景1:Deployment还未部署(或可以清空现有PVC数据)
如果你的MySQL实例还没启动过,或者可以备份数据后清空PVC存储,直接修改现有Deployment的环境变量即可替换test_user:
找到原配置中的env段,把MYSQL_USER和MYSQL_PASSWORD的值改成新用户的信息:
env: - name: MYSQL_ROOT_PASSWORD value: "root" - name: MYSQL_DATABASE value: "my_abc" - name: MYSQL_USER value: "new_real_user" # 替换成你的新用户名 - name: MYSQL_PASSWORD value: "your_strong_password" # 替换成你的新密码
修改后重新部署,MySQL镜像会在首次启动时自动创建这个新用户,并赋予它my_abc数据库的全部权限。
场景2:MySQL实例已在运行(保留现有数据)
如果不想清空数据,需要手动创建新用户,步骤如下:
找到MySQL Pod的名称:
kubectl get pods -n abc-sk-test输出里会有类似
abc-def-my-mysql-xxxxxx-xxxx的Pod名称。进入容器并登录MySQL:
kubectl exec -it <你的Pod名称> -n abc-sk-test -- mysql -u root -proot这里用root用户登录,密码是你配置的
MYSQL_ROOT_PASSWORD值。创建新用户并授权:
在MySQL命令行中执行以下SQL(替换成你的用户名和密码):-- 创建允许从任意IP连接的新用户 CREATE USER 'new_real_user'@'%' IDENTIFIED BY 'your_strong_password'; -- 授予新用户my_abc数据库的全部权限 GRANT ALL PRIVILEGES ON my_abc.* TO 'new_real_user'@'%'; -- 刷新权限使配置生效 FLUSH PRIVILEGES;如果需要限制新用户的连接IP,把
%改成具体的IP段(比如192.168.0.%)即可。(可选)删除旧的test_user:
DROP USER 'test_user'@'%';
场景3:需要持久化用户配置(后续重新部署自动生效)
如果希望后续重新部署时自动创建这个新用户,可以用ConfigMap挂载初始化SQL脚本:
创建初始化SQL脚本:
新建一个init-user.sql文件,内容如下:-- 确保新用户存在,不存在则创建 CREATE USER IF NOT EXISTS 'new_real_user'@'%' IDENTIFIED BY 'your_strong_password'; -- 授予权限 GRANT ALL PRIVILEGES ON my_abc.* TO 'new_real_user'@'%'; FLUSH PRIVILEGES; -- 可选:删除旧用户 -- DROP USER IF EXISTS 'test_user'@'%';创建ConfigMap:
kubectl create configmap mysql-init-scripts --from-file=init-user.sql -n abc-sk-test修改Deployment配置:
在containers的volumeMounts中添加挂载项,同时在volumes中引用ConfigMap:spec: containers: - name: mysql # 其他配置保持不变 volumeMounts: - mountPath: /var/lib/mysql name: abc-def-my-mysql-storage # 新增的初始化脚本挂载 - mountPath: /docker-entrypoint-initdb.d/init-user.sql name: mysql-init-config subPath: init-user.sql volumes: - name: abc-def-my-mysql-storage persistentVolumeClaim: claimName: abc-def-my-mysql-pvc # 新增的ConfigMap卷 - name: mysql-init-config configMap: name: mysql-init-scripts重新部署:
kubectl apply -f <你的Deployment配置文件路径> -n abc-sk-test
⚠️ 注意:官方MySQL镜像只会在数据目录为空时执行/docker-entrypoint-initdb.d/下的脚本。如果你的实例已经有数据,需要先手动执行一次脚本,或者备份后清空PVC数据再重新部署。
内容的提问来源于stack exchange,提问作者sbolla

