在 kubernetes 集群之外访问 kube-dns



类似问题:如何为集群外的查询暴露 kube-dns 服务?

我在谷歌计算引擎的虚拟机中有一个PerconaDB实例。旁边是运行Kubernetes集群,服务连接到PerconaDB。

当我使用MySQL客户端登录并执行show processlist;时,我看到以下内容:

| 175 | user       | 10.12.142.24:46124 | user | Sleep   |   14 |                                       | NULL                                                                                                 |         0 |             0 |
| 176 | user       | 10.12.142.24:46126 | user | Sleep   |   14 |                                       | NULL                                                                                                 |         0 |             0 |
| 177 | user       | 10.12.122.42:60806 | user | Sleep   |    2 |                                       | NULL                                                                                                 |         0 |             0 |
| 178 | user       | 10.12.122.43:55164 | user | Sleep   |   14 |                                       | NULL                                                                                                 |         1 |             0 |
| 179 | user       | 10.12.122.43:55166 | user | Sleep   |    4 |                                       | NULL                                                                                                 |         1 |             0 |
| 180 | user       | 10.12.141.11:35944 | user | Sleep   |   14 |                                       | NULL                                                                                                 |         1 |             0 |

请注意我不知道它们属于什么的不同 IP 的数量。这些是 Kubernetes 集群中的 pod,我想知道它们的名字,所以我可以看到myservice-0dkd0:46124而不是10.12.142.24:46124

我认为解决方案是以某种方式将kube-dns服务链接到PerconaDB VM,但我不知道如何正确执行此操作。此外,它现在正在生产中运行,所以我不想尝试太多。

目前,POD IP 的反向 DNS 查找或 PTR 类型查找仅在作为无头服务一部分的 pod 的情况下才有可能(详细信息:https://github.com/kubernetes/dns/pull/25(,但即使这样也有其局限性。此外,Kubernetes 根本没有每个 POD dns 名称的默认值,即使在 kubernetes 集群中,您也无法说curl http://<pod_name>。您有这方面的服务。你所要求的并不是像现在这样用 kubernetes 和 DNS 真正实现的。请记住,PTR 记录(IP->名称(应该与解析名称(名称>IP(的常规记录齐头并进,这也使事情变得复杂,这意味着您不能只在那里myservice-0dkd0

也就是说,您可以在此处以非 dns 方式实现您想要的。假设您在 Linux 上运行,您可以使用/etc/hosts来维护该特定系统独有的名称到 ip 和 ip 到名称列表,并且不需要遵守实际 DNS 的所有限制。

如果在 mysql 主机上,您每 1 分钟从 cron 运行一次类似以下内容,您应该几乎始终在/etc/hosts中获得正确映射的名称:

NAMESPACE=default
sed -i "/^[0-9.]*t[a-zA-Z0-9-]*.$NAMESPACE/d" /etc/hosts
kubectl get pod --namespace default --field-selector=status.phase==Running -o jsonpath='{range .items[*]}{.status.podIP}{"t"}{.metadata.name}.{.metadata.namespace}{"n"}{end}' >> /etc/hosts

看起来您需要在 mysql 服务器级别进行更改。查看此文档链接,了解有关将名称解析跳过到 IP 地址的详细信息。

默认情况下,MySQL进行DNS查找以解析客户端主机名。您可以使用选项skip_name_resolve禁用此查找。

mysql>显示变量,如"skip_name_resolve";//将显示变量的当前状态。

最新更新