[英]Database access problems from Kubernetes pod
我正在尝试将我的第二个项目 (prm) 放入云中。 这两个项目(pyp 和 prm)使用相同的凭据访问相同的数据库。 第一个项目成功,第二个项目被 root 用户拒绝访问。
一些摘录自我的定义:
apiVersion: v1
kind: Secret
metadata:
name: pyp-secret
data:
mysql_password: "M1BKdnIrNjRyaDZ0aGJGR0gy"
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,即使它只是“USE PP_Master”,而且它以前也工作过。 日志上没有错误。 我不得不删除 Minikube 容器,然后开始一个新容器。 这让我可以从 pyp-project 访问数据库。 我想知道使用 DataConnectionPool 的一个项目是否可以保留对数据库的访问权限,因此其他项目无法访问它? 我现在尝试在 pyp 项目中从连接池更改为一次只有一个连接。 但这并没有解决 prm 项目的问题。 我还尝试简单地删除部署和 pyp-pod,但这对 prm-project 也没有帮助。 所以这个假设似乎是错误的。 我查看了 pyp-db 日志。 这个 pod 包含数据库。 我不知道这些信息中的一些是否会对我的问题产生影响? 我也尝试再次删除 minikube。 这次我只部署了 pyp-db 和 prm pod,以避免与 pyp pod 可能发生冲突。 但无济于事。 连接到 prm pod 的错误消息仍然存在。 所以,肯定是prm和pyp-db之间有问题,与pyp-pod无关。 所以我已经证明这不是由于与 pyp-pod 的冲突。
我真的希望有人能够帮助我。 我已经被这个问题困了好几天了。 如果有更多信息可以提供帮助,请询问。
最终,我设法摆脱了“拒绝访问”问题。 我只是将java代码中的内容更改为:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.