我有一个运行着 4 个节点的 kubernetes 集群,包括我的主要主节点和其他节点。我使用 kubespray 来让一切运行起来。这是在我的家庭网络上,我将在下面解释。我试图实现的是让某种 DNS 解析工作,这样我就可以继续设置入口。
我的设置:
- 网络 - 使用 USG、Cloud Key 和交换机设置 Unifi。DHCP DNS 指向主盒的内部 IP 加上 8.8.8.8 和 8.8.4.4,默认搜索域设置为我的个人域之一(以 mydomain.com 为例)
- 主服务器:Ubuntu 18.04 LTS 运行 DNS(Bind9),并充当 Kubernetes 集群的主服务器。它在内部解析为 server.mydomain.com
- 节点 1-3:Ubuntu 18.04 LTS 仅用作 Kubernetes 主机。内部解析为 nodeX.mydomain.com,其中 X 是节点编号 1-3
我猜我需要以某种方式告诉主机上运行的 DNS 服务器任何 XXX.server.mydomain.com。至少,我想象它应该如何工作?我不确定,也许我误解了。
问题是,即使我尝试手动 nslookup 服务,它似乎仍然不起作用。我尝试了类似以下方法:
> nslookup nzbget.server.mydomain.com 10.233.0.3
Server: 10.233.0.3
Address: 10.233.0.3#53
** server can't find nzbget.server.mydomain.com: NXDOMAIN
也
> nslookup nzbget 10.233.0.3
Server: 10.233.0.3
Address: 10.233.0.3#53
** server can't find nzbget.mydomain.com: REFUSED
其中 10.233.0.3 是集群中 CoreDNS 服务 IP 的 IP。
我知道这只是因为我不知道自己在做什么,但我现在甚至还不知道如何通过谷歌找到正确的方法。感谢您提供的任何指导。
答案1
您需要在 bind9 中设置通配符域/子域,如果您在 google 上搜索“绑定通配符记录”,您应该会找到此帖子 使用 BIND 的通配符 DNS
答案2
我将保留@DarkVex 的答案作为正确答案,因为它确实回答了原始问题,但我想为那些将来可能会遇到困难的人添加一些最终解决方案的细节。
基本上,我试图通过简化的内部 DNS 名称(如 jenkins.mydomain.com)访问我的 Kubernetes 服务。仅使用 Docker,我就可以在 Linux 主机上创建虚拟网卡,然后将 Docker 容器的 IP/端口映射到这些 IP/端口,然后将 Bind9 中的 DNS A 记录指向该 IP。我尝试使用 Kubernetes 做类似的事情,但不确定如何实现。
事实证明,这实际上比我想象的要容易。我要做的第一件事是向我的网络设置添加一条路由,以将 Kubernetes 中使用的 IP 子网路由到主节点的 IP。例如,我的内部网络有 3 个虚拟 LAN:10.0.xx、10.1.xx 和 10.2.xx,而我的 Kubernetes 选择了 10.233.xx。如果我的主节点在 10.0.0.10 上,那么我只需告诉我的路由器将 10.233.xx 流量发送到 10.0.0.10。这样就打开了 IP,这样我就可以从外部访问它们了。
接下来是为 Kubernetes 中的部署创建一个负载平衡模式的服务。我也可以使用 Ingress 服务器,但我认为没有必要,因为第一步允许我从内部网络的任何地方访问服务。该服务位于所有已部署的 Pod 之上,为所有底层 Pod 公开一个负载平衡 IP。这里的关键是,虽然 Pod 的 IP 可以随时更改,但服务的 IP 保持不变,直到您将其删除。
最后一步与之前相同...只需向 Bind9 添加指向服务 IP 的 A 记录即可。太棒了!我现在可以通过简化的主机名访问服务。缺点是需要一些手动步骤才能完成。如果能弄清楚如何设置 DNS 来代理所有请求,那就太好了,也许可以使用查看请求的主机名以路由到正确服务的 Ingress 设置。无论如何,我最终可能会这样做,但现在它至少让我回到了使用 Docker 的状态。