【问题标题】:Can't access mysql root or user after kubernetes deploymentkubernetes部署后无法访问mysql root或用户
【发布时间】:2020-12-27 06:20:41
【问题描述】:

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

我还有一个要导入数据库的 mysql 文件。

这是我的工作流程:

  1. 设置包含 root 密码和新数据库凭据(db_name、db_user、db_password)的 Secret。

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

  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 内,运行 echo $MYSQL_ROOT_PASSWORD 或任何其他环境变量会返回正确的值。

我做错了什么?

【问题讨论】:

  • hostPath 卷不是特别可靠的存储:如果 pod 在不同的节点上重新调度,它将丢失其存储,并且如果该主机目录中已经存在数据(包括配置的用户和凭据)这就是数据库将使用的。我会选择不同的存储类型,或者让集群内配置器自己创建 PersistentVolume 对象。
  • @DavidMaze :我怀疑这与问题有关,但是我想了解更多有关此问题的信息,如果您有任何文档链接,不胜感激。

标签: mysql kubernetes


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2016-06-12
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2020-05-21
    • 2019-06-28
    • 2021-08-24
    • 2019-08-10
    相关资源
    最近更新 更多