首页 > 解决方案 > Kubernetes部署后无法访问mysql root或用户

问题描述

我有一个作为服务运行的 nodejs 应用程序,它需要访问作为另一个服务(相同的命名空间)运行的 mysql 数据库。

我还有一个 mysql 文件,我将把它导入数据库。

这是我的工作流程:

  1. 设置一个 Secret,其中包含 root 密码以及新的数据库凭据(db_name、db_user、db_password)。

  2. 使用 SQL 脚本设置 ConfigMap 以创建数据库结构。

  3. 最后用pv/pvc部署mysql,yaml文件内容如下:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---      
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
---
apiVersion: apps/v1 
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secrets
              key: DB_ROOT
        - name: MYSQL_DATABASE
          valueFrom:
            secretKeyRef:
              name: mysql-secrets
              key: DB_NAME
        - name: MYSQL_USER
          valueFrom:
            secretKeyRef:
              name: mysql-secrets
              key: DB_USER
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-secrets
              key: DB_PASS
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
        - name: mysql-initdb
          mountPath: /docker-entrypoint-initdb.d
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim        
      - name: mysql-initdb
        configMap:
          name: mysql-initdb-config

因为我的 nodejs 应用程序不访问数据库,所以我想验证是否已创建新数据库并导入 sql 文件,kubectl exec 然后运行mysql -u root -p给我这个错误:

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

在 pod 中,runningecho $MYSQL_ROOT_PASSWORD或任何其他环境变量返回正确的值。

我究竟做错了什么 ?

标签: mysqlkubernetes

解决方案


通过编辑行解决了这个问题:mountPath: /var/lib/mysql

我将其更改为/mnt/data,部署就像一个魅力。


推荐阅读