我正在尝试让我的第二个项目(Prm)进入云端。这两个项目(pyp和prm)访问相同的数据库,并使用相同的凭据。第一个项目成功,第二个项目拒绝用户root的访问。
我的定义中的一些摘录:
apiVersion: v1
kind: Secret
metadata:
name: pyp-secret
data:
mysql_password: "<password>"apiVersion: v1
kind: Service
metadata:
name: pyp-db
spec:
type: ClusterIP
ports:
- port: 3306
targetPort: 3306
selector:
app: pyp
service: mysql
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: pyp-db
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: pyp
service: mysql
template:
metadata:
labels:
app: pyp
service: mysql
spec:
containers:
- image: mysql:8
name: pyp-db
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: pyp-secret
key: mysql_password
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: prm
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: prm
service: cron
template:
metadata:
labels:
app: prm
service: cron
spec:
containers:
- image: prm-image-name
imagePullPolicy: Always
name: prm
env:
- name: MYSQL_HOST
value: pyp-db
- name: MYSQL_USER
value: root
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: pyp-secret
key: mysql_password这是日志中的摘录,您可以在其中看到连接数据库的url,以及我得到的错误:

这段代码来自我的java应用程序:
static Connection init(String host,String user, String password){
Connection con = null;
try {
if (con == null) {
Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
String url = "jdbc:mysql://" + host + ":3306/PP_Master?user=" + user + "&password=" + password;
logger.trace("DB url:" + url);
con = DriverManager.getConnection(url);
}
} catch (Exception ex) {
logger.error("init: " , ex);
}
return con;
}我的云托管在Minikube上,数据库是Mysql 8.0.27。当我提供相同的凭据时,它可以从我的本地主机访问。我的另一个项目(Pyp)在Tomcat中运行,并使用context.xml中定义的连接池中的凭据进行连接。它们使用相同的驱动程序来连接数据库。该项目可以很好地访问数据库。
这是在数据库中定义的用户:

我还通过url.length()计算了url中的字符数。这样就得到了与实际大小相匹配的72个字符。因此,密码中没有额外的不可见字符。
关于成功访问数据库的项目(Pyp)。几天前,我从数据库的第一条语句中得到了一个SqlSyntaxError,即使它只是“使用PP_Master",它以前也是有效的。日志上没有错误。我不得不删除Minikube容器,并开始一个新的容器。这使我能够从pyp-project访问数据库。我想知道一个使用DataConnectionPool的项目是否可以保留对数据库的访问,这样其他项目就不能访问它了?我现在已经尝试在pyp-project中从连接池更改为一次只有一个连接。但这并没有解决prm-project的问题。我还尝试简单地删除部署和pyp-pod,但这对prm-project eigther没有帮助。因此,这种假设似乎是错误的。我查看了pyp-db日志。此pod包含数据库。我不知道这些信息是否会对我的问题产生影响?

我也再次尝试删除minikube。这次我只部署了pyp-db和prm pod,以避免可能与pyp pod发生冲突。但无济于事。连接到prm pod的错误信息仍然存在。所以,这一定是prm和pyp-db之间的问题,这与pyp-pod无关。所以我已经证实这不是由于与pyp-pod的冲突。
我真的希望有人能帮助我。我已经被这个问题困扰了好几天。如果有更多的信息可以帮助你,尽管问。
发布于 2021-11-01 14:51:27
最终,我设法摆脱了“访问被拒绝”的问题。我刚刚将java-code中的内容更改为:
String url = "jdbc:mysql://" + host + ":3306/PP_Master";
con = DriverManager.getConnection(url, user, password);在此之前:
String url = "jdbc:mysql://" + host + ":3306/PP_Master?user=" + user + "&password=" + password;
con = DriverManager.getConnection(url);https://stackoverflow.com/questions/69749554
复制相似问题