在kubernetes集群之外访问kube-dns

时间:2018-08-20 20:45:58

标签: dns kubernetes google-compute-engine google-kubernetes-engine

相似的问题:How to expose kube-dns service for queries outside cluster?

我在Google计算引擎的VM中有一个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,我想知道它们的名称,所以我可以看到10.12.142.24:46124而不是myservice-0dkd0:46124

我认为解决方案是以某种方式将kube-dns服务链接到PerconaDB VM,但是我不知道如何正确地做到这一点。而且它现在正在生产中运行,所以我不想尝试太多。

2 个答案:

答案 0 :(得分:2)

目前,仅在Pod是无头服务的一部分(详细信息:https://github.com/kubernetes/dns/pull/25)的情况下,才可以对POD IP进行反向DNS查找或PTR类型查找。此外,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分钟从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

答案 1 :(得分:1)

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

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

mysql>显示类似“ skip_name_resolve”的变量; //将显示变量的当前状态。