dns - 在 Kubernetes 集群外访问 kube-dns

标签 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,但我不知道如何正确地做到这一点。此外,它现在正在生产中运行,所以我不想进行太多实验。

最佳答案

目前,仅当 Pod 是 headless 服务的一部分时,才可以对 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维护专属于该特定系统的 name-to-ip 和 ip-to-name 列表,并且不需要遵守真实 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

关于dns - 在 Kubernetes 集群外访问 kube-dns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51938261/

相关文章:

amazon-web-services - Aerospike 配置使用 DNS 而不是私有(private) ip

docker - 无法将本地Kubernetes集群导入Rancher

kubernetes - Google Cloud Container Engine (GKE) 上的 IAM 和 RBAC 冲突

google-compute-engine - 使用gcloud创建一个新的Google Cloud项目

docker - Heapster 无法从 Kubernetes 集群上的 Kubelet 获取容器统计信息

python-3.x - 如何使用 Google Cloud Function 将文件从 Cloud Storage 存储桶推送到实例中?

linux - 如何让 dhclient 知道 namespace ?

redirect - DNS 记录将 www 重定向到非 www

ssl - 是否可以将子域映射到 S3 存储桶中的文件夹?

docker - 使用卷挂载将文件从容器复制到本地