首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kubernetes pod的数据库访问问题

Kubernetes pod的数据库访问问题
EN

Stack Overflow用户
提问于 2021-10-28 06:59:27
回答 1查看 100关注 0票数 0

我正在尝试让我的第二个项目(Prm)进入云端。这两个项目(pyp和prm)访问相同的数据库,并使用相同的凭据。第一个项目成功,第二个项目拒绝用户root的访问。

我的定义中的一些摘录:

代码语言:javascript
复制
apiVersion: v1
kind: Secret
metadata:
name: pyp-secret
data:
mysql_password: "<password>"

代码语言:javascript
复制
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应用程序:

代码语言:javascript
复制
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的冲突。

我真的希望有人能帮助我。我已经被这个问题困扰了好几天。如果有更多的信息可以帮助你,尽管问。

EN

回答 1

Stack Overflow用户

发布于 2021-11-01 14:51:27

最终,我设法摆脱了“访问被拒绝”的问题。我刚刚将java-code中的内容更改为:

代码语言:javascript
复制
String url = "jdbc:mysql://" + host + ":3306/PP_Master";
con = DriverManager.getConnection(url, user, password);

在此之前:

代码语言:javascript
复制
String url = "jdbc:mysql://" + host + ":3306/PP_Master?user=" + user + "&password=" + password;
con = DriverManager.getConnection(url);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69749554

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档