在 Kubernetes 集群外访问 kube-dns

Voj*_*ěch 5 dns google-compute-engine kubernetes google-kubernetes-engine

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

我在 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 |
Run Code Online (Sandbox Code Playgroud)

请注意我不知道它们属于什么的不同 IP 的数量。这些是 Kubernetes 集群内的 pod,我想知道它们的名字,这样10.12.142.24:46124我就无法看到myservice-0dkd0:46124.

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

Rad*_*nka 3

目前,只有在 Pod 属于无头服务的情况下才可以对 POD IP 进行反向 DNS 查找或 PTR 类型查找(详细信息: 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
Run Code Online (Sandbox Code Playgroud)