在Kubernetes集群之外访问kube-dns

5

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

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

当我使用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集群中的Pods,我想知道它们的名称,以便不再显示10.12.142.24:46124而是显示myservice-0dkd0:46124
我认为解决方案是将kube-dns服务与PerconaDB VM连接起来,但我不知道如何正确操作。另外,这现在正在生产环境中运行,所以我不想进行太多实验。
2个回答

3
此刻,只有作为无头服务的一部分的Pod才能进行反向DNS查找或PTR类型查找(详情请参见:https://github.com/kubernetes/dns/pull/25),但即使如此也存在限制。此外,Kubernetes没有默认的每个POD DNS名称,在Kubernetes集群内,您甚至不能说curl http://<pod_name>。您需要使用服务来实现此功能。以当前 Kubernetes 和 DNS 的形式,您所要求的实际上是不可行的。请记住,PTR记录(IP->name)应该与解析名称(name->IP)的常规记录相配合,这也使事情变得复杂,并意味着您不能仅仅在其中放置一个myservice-0dkd0
话虽如此,您可以通过非DNS方式来实现您想要的功能。假设您运行的是Linux系统,您可以使用/etc/hosts来维护一个专属于该特定系统的名称到IP和IP到名称列表,不需要遵守真实DNS的所有限制。
如果在您的MySQL主机上大约每1分钟运行以下操作,则几乎始终可以在/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

1

看起来您需要在MySQL服务器层面进行更改。请查看this文档链接,了解有关跳过名称解析到IP地址的详细信息。

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

mysql> show variables like "skip_name_resolve"; //将显示变量的当前状态。


这不是我的问题的答案。 - Vojtěch
这个答案并不是一个解决方案,而更多地是对为什么是这样的说明,并告诉您在需要时如何调试它。有几个选项可用,比如skydns,或Coredns。您也可以尝试使用 StatefulSet,根据这个 post 中的说明,因为 StatefulSet 为它们的 Pod 维护了一个粘性标识。因此,由于大多数这些选项都需要进行自定义调整,最好尝试使用测试集群。 - Sunny J
我不确定我理解了:1. 禁用skip_name_resolve,不会让我得到pod的名称。相反,我需要名称解析。2. 它没有解释如何将DNS服务映射到pods。 - Vojtěch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接