首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从外部独立应用程序连接到mysql服务器pod?

如何从外部独立应用程序连接到mysql服务器pod?
EN

Stack Overflow用户
提问于 2022-08-15 11:13:09
回答 2查看 361关注 0票数 0

我是k8s的新手,并试图了解如何将外部应用程序(即kubernetes集群外)连接到db。请将外部应用程序视为我的独立java程序(JDBC程序)。

我在我的k8s集群中有我的服务器端,我可以使用“kubectl exec.”访问它。

现在,如果我想使用mysql服务器并像独立的jdbc应用程序那样连接到我的外部应用程序来执行简单的CRUD操作,我们如何连接到mysql?相同的连接字符串可以是什么?

我是否需要首先将mysql服务器pod公开为nodeport服务,并在连接字符串中使用该IP:port?或者还有别的办法。任何提示或帮助都将不胜感激。

提前谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-15 11:34:21

第一,您需要在K8s中创建一个服务,该服务将流量从客户端路由到mysql荚。

代码语言:javascript
运行
复制
apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql # labels should be the same as the ones used in the Pod's definition.
  ports:
    - protocol: TCP
      port: 3306 # port of the service.
      targetPort: 3306 # Port that the pods have exposed.

现在,如果您的外部应用程序正在本地机器上运行&您希望它与数据库通信,请使用kubectl port-forward命令,它将在您的计算机和K8s荚之间创建一个本地会话。

代码语言:javascript
运行
复制
# kubectl port-forward svc/<service-name> <local-port>:<service-port>
kubectl port-forward svc/mysql-service 3306:3306

在生产过程中,您需要通过HTTP公开您的mysql服务。为此,您将需要一个宏控制器(如Nginx )和一个resource资源。

代码语言:javascript
运行
复制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: db-ingress
spec:
  rules:
  - http:
      paths:
      - path: /db # path at which you want to expose your service
        pathType: Prefix
        backend:
          service:
            name: mysql-service # name of the service
            port:
              number: 3306 # port of the service

如需参考,请查看以下链接

票数 2
EN

Stack Overflow用户

发布于 2022-08-16 09:56:24

是的,这是我的本地集群。

我尝试了你提到的方式,不幸的是,它失败了,我尝试了2种场景。请见下文:

代码语言:javascript
运行
复制
a) my svc details : 

kubectl get svc | grep mysql
mysql                NodePort    10.43.92.516    <none>        3306:30064/TCP   23h

b) my pod details : 

kubectl get pods -A --show-labels | grep -i mysql
default               mysql-6d86c78b54-p7srr                     1/1     Running     0            6h26m   app=mysql,pod-template-hash=6d86c78b54

C) Pod endpoint : 

kubectl get ep mysql
NAME    ENDPOINTS         AGE
mysql   10.42.0.42:3306   23h

D) Tried to get the DNS record value : 

root@mysql-6d86c78b54-p7srr:/# busybox nslookup mysql.default.svc.cluster.local
Server:    10.43.0.14
Address 1: 10.43.0.14 kube-dns.kube-system.svc.cluster.local

Name:      mysql.default.svc.cluster.local
Address 1: 10.43.92.516 mysql.default.svc.cluster.local

因此,按照您的建议,我尝试过使用namespace.service_name,但是UnknownHostException失败了:

(设想1)

代码语言:javascript
运行
复制
Connection con=DriverManager.getConnection("jdbc:mysql://default.mysql:30064/mysql","test_user","<password>");

Error : 

java.net.UnknownHostException
MESSAGE: default.mysql: Name or service not known

STACKTRACE:

java.net.UnknownHostException: default.mysql: Name or service not known
    at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:929)

Scenaio 2)我遵循了正式文档(https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/),并给出了实际的DNS条目,但这仍然是一个相同的问题。

代码语言:javascript
运行
复制
Connection con=DriverManager.getConnection("jdbc:mysql://mysql.default.svc.cluster.local:30064/mysql","test_user","<password>");

error : 

java.net.UnknownHostException
MESSAGE: mysql.default.svc.cluster.local: Temporary failure in name resolution

STACKTRACE:

java.net.UnknownHostException: mysql.default.svc.cluster.local: Temporary failure in name resolution
    at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73360213

复制
相关文章

相似问题

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