【发布时间】:2020-12-27 06:20:41
【问题描述】:
我有一个作为服务运行的 nodejs 应用程序,它需要访问作为另一个服务(相同命名空间)运行的 mysql 数据库。
我还有一个要导入数据库的 mysql 文件。
这是我的工作流程:
-
设置包含 root 密码和新数据库凭据(db_name、db_user、db_password)的 Secret。
-
使用 SQL 脚本设置 ConfigMap 以创建 db 结构。
-
最后用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