我是k8s的新手,并试图了解如何将外部应用程序(即kubernetes集群外)连接到db。请将外部应用程序视为我的独立java程序(JDBC程序)。
我在我的k8s集群中有我的服务器端,我可以使用“kubectl exec.”访问它。
现在,如果我想使用mysql服务器并像独立的jdbc应用程序那样连接到我的外部应用程序来执行简单的CRUD操作,我们如何连接到mysql?相同的连接字符串可以是什么?
我是否需要首先将mysql服务器pod公开为nodeport服务,并在连接字符串中使用该IP:port?或者还有别的办法。任何提示或帮助都将不胜感激。
提前谢谢!
发布于 2022-08-15 11:34:21
第一,您需要在K8s中创建一个服务,该服务将流量从客户端路由到mysql荚。
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荚之间创建一个本地会话。
# kubectl port-forward svc/<service-name> <local-port>:<service-port>
kubectl port-forward svc/mysql-service 3306:3306在生产过程中,您需要通过HTTP公开您的mysql服务。为此,您将需要一个宏控制器(如Nginx )和一个resource资源。
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如需参考,请查看以下链接
发布于 2022-08-16 09:56:24
是的,这是我的本地集群。
我尝试了你提到的方式,不幸的是,它失败了,我尝试了2种场景。请见下文:
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)
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条目,但这仍然是一个相同的问题。
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)https://stackoverflow.com/questions/73360213
复制相似问题