Kubernetes pod 应用程序与不在容器上的 Mysql 数据库的连接

Posted

技术标签:

【中文标题】Kubernetes pod 应用程序与不在容器上的 Mysql 数据库的连接【英文标题】:Kubernetes pod application connectivity with Mysql database which is not on container 【发布时间】:2020-06-12 12:19:46 【问题描述】:

我可以将 k8 的 POD 与非容器应用程序连接起来吗,我的 kubernetes POD 在 10.200.x.x 子网上运行,而我的 mysql 在容器以外的简单 linux 服务器上运行 如何连接数据库? 由于我在一个有很多网络限制的组织工作,我必须打开端口和 IP 才能访问 我是否有可能将容器应用程序与非容器数据库连接起来,因为子网掩码也不同

【问题讨论】:

尝试在您的容器中安装某种网络“ping”工具...尝试排除故障。请参阅cyberciti.biz/faq/…,这是一个 apt 安装(您可能不需要 curl,但会显示 apt 安装提示)请参阅 ***.com/questions/34571711/… 了解 Curl。 感谢兄弟的评论,只是为了澄清,我已经检查过,由于网络问题,我无法连接到 JDBC,但只需要确认我需要允许容器 IP 与 DB 或机器容器运行的IP? kubernetes 容器 IP 无处不在。您需要学习如何将您的容器公开为服务......使用更专用的 IP。 kubernetes.io/docs/concepts/services-networking/service "Kubernetes Pod 是会死的。它们出生,死后不会复活。" 这会让你继续前进。我不是k8专家。但我确实知道其中的一小部分。 【参考方案1】:

如果您可以从工作节点访问 mysql,那么您也应该能够从运行在该节点上的 pod 访问它。

检查您的公司防火墙并确保来自工作节点的数据包可以到达运行 mysql 的实例。还要确保这些网络没有以其他方式分开。

通常,从您的应用程序 pod 发送到 mysql 实例的数据包会将源 ip 设置为工作节点 ip(因此您希望允许从 k8s 节点到 mysql 实例的流量)。 这是因为 k8s 网络(具有大多数 CNI)是一种虚拟网络,只有 k8s 节点知道并且外部流量能够返回到 pod,网络中的路由器需要知道路由到哪里交通到。这就是为什么在 k8s 网络之外的 pod 流量会被 NAT。

对于在 k8s 中封装内部流量的大多数 CNI 来说都是如此,但请记住,也有一些 CNI 不封装流量,它可以直接从私有网络内的任何位置访问 pod,而不仅仅是从 k8s 节点(例如 Azure CNI)。

在 NATed 网络的第一种情况下,请确保您允许从所有工作节点访问 mysql 实例,而不仅仅是一个,因为当这个特定节点发生故障并且 pod 被重新调度到其他节点时,它将无法连接到数据库.

在第二种情况下,您使用的是使用直接网络(没有 NAT)的 CNI,它更复杂,因为当 pod 重新调度时,它每次都会获得不同的 ip,我无法帮助您,因为这完全取决于特定的 CNI .

【讨论】:

感谢您的详细信息,我怎么知道我正在使用哪个 CNI,让我分享一下我的 POD 网络为 10.200.0.0/16 的详细信息,其中我的 mysql 服务器位于不同的子网,即 10.172 .0.56 ?所以请你指导我,我应该怎么做才能从 PODS 访问 MYSQL,我的工作节点 ip 是 10.172.0.66 最重要的是,我可以从我的工作节点成功连接到 Mysql DB,但是从具有 IP 10.200.1.39 telnet 10.172.11.55 3306 Trying 10.172.11.55... 连接到的工作节点 POD 给出错误10.172.11.55。转义字符是'^]'。 不是从运行 pod 的工作节点运行,而不是从 POD 内部运行 通信链路故障 最后一个成功发送到服务器的数据包是 0 毫秒前。驱动程序没有收到来自服务器的任何数据包。在 com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) 在 com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) 在 com.mysql.cj.jdbc .ConnectionImpl.createNewIO(ConnectionImpl.java:835) "我怎么知道我使用的是哪个 CNI?" - 您应该知道您是否创建了集群,因为您需要显式安装它。如果没有,那就问别人是怎么做的。另外,您是如何设置集群的?

以上是关于Kubernetes pod 应用程序与不在容器上的 Mysql 数据库的连接的主要内容,如果未能解决你的问题,请参考以下文章

JVM故障问题排查心得「内存诊断系列」JVM内存与Kubernetes中pod的内存容器的内存不一致所引发的OOMKilled问题总结(上)

Kubernetes基石-pod容器

JVM故障问题排查心得「内存诊断系列」JVM内存与Kubernetes中pod的内存容器的内存不一致所引发的OOMKilled问题总结(上)

Kubernetes网络自学系列 | Pod的核心:pause容器

Kubernetes —— Pod

Kubernetes —— Pod