为 Kubernetes 本地 DNS 创建特定的 A 记录条目
Create specific A record entry to Kubernetes local DNS
我在 AWS 中有一个 Kubernetes v1.4 集群 运行,具有自动扩展节点。
我还有一个 Mongo 具有仅 SSL 连接(FQDN 通用名称)和 public DNS 条目的副本集集群:
- node1.mongo.example.com -> 1.1.1.1
- node2.mongo.example.com -> 1.1.1.2
- node3.mongo.example.com -> 1.1.1.3
Kubernetes 节点是允许访问 mongo 集群的安全组的一部分,但只能通过它们的私有 IP。
当查询 public FQDN 时,是否有办法在 Kubernetes DNS 中使用私有 IP 创建 A 记录?
我尝试的第一件事是在启动时更新 /etc/hosts 的脚本和 ConfigMap 组合(参考 ),但这是有问题的,因为其他 Kubernetes 服务也可能更新主机文件不同的时间。
我还尝试了服务和积分配置:
---
apiVersion: v1
kind: Service
metadata:
name: node1.mongo.example.com
spec:
ports:
- protocol: TCP
port: 27017
targetPort: 27017
---
apiVersion: v1
kind: Endpoints
metadata:
name: node1.mongo.example.com
subsets:
- addresses:
- ip: 192.168.0.1
ports:
- port: 27017
但这失败了,因为服务名称不能是 FQDN...
虽然起初并不那么明显,但解决方案非常简单。最新版本的 kube-dns 镜像包含 dnsmasq
作为其组件之一。如果你查看它的手册页,你会看到一些有用的选项。在那次讲座之后,您可以选择类似这样的路径:
创建一个 ConfigMap 来存储您的 dns 映射:
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-dns
namespace: kube-system
data:
myhosts: |
10.0.0.1 foo.bar.baz
在您的集群中应用该 ConfigMap 后,您现在可以对您在 kubernetes 中使用的 kube-dns-vXX
部署进行一些更改。
定义将您的 CM 暴露给 dnsmasq
的音量
volumes:
- name: hosts
configMap:
name: kube-dns
并且挂载在 kube-dns
deployment/rc 模板的 dnsmasq
容器中
volumeMounts:
- name: hosts
mountPath: /etc/hosts.d
最后,在您的 dnsmasq 参数中添加一个小的配置标志:
args:
- --hostsdir=/etc/hosts.d
现在,当您将这些更改应用到集群中的 kube-dns-vXX
部署时,它将安装配置映射并使用安装在 /etc/hosts.d/ 中的文件(具有典型的主机文件格式)作为dnsmasq
的知识来源。因此,如果您现在在 pods 中查询 foo.bar.baz,它们将解析为相应的 IP。这些条目优先于 public DNS,因此它应该完全适合您的情况。
请注意 dnsmasq
不会监视 ConfigMap 中的更改,因此如果它发生更改,则必须手动重新启动它。
几分钟前在实时集群上对此进行了测试和验证。
我在 AWS 中有一个 Kubernetes v1.4 集群 运行,具有自动扩展节点。 我还有一个 Mongo 具有仅 SSL 连接(FQDN 通用名称)和 public DNS 条目的副本集集群:
- node1.mongo.example.com -> 1.1.1.1
- node2.mongo.example.com -> 1.1.1.2
- node3.mongo.example.com -> 1.1.1.3
Kubernetes 节点是允许访问 mongo 集群的安全组的一部分,但只能通过它们的私有 IP。
当查询 public FQDN 时,是否有办法在 Kubernetes DNS 中使用私有 IP 创建 A 记录?
我尝试的第一件事是在启动时更新 /etc/hosts 的脚本和 ConfigMap 组合(参考
我还尝试了服务和积分配置:
---
apiVersion: v1
kind: Service
metadata:
name: node1.mongo.example.com
spec:
ports:
- protocol: TCP
port: 27017
targetPort: 27017
---
apiVersion: v1
kind: Endpoints
metadata:
name: node1.mongo.example.com
subsets:
- addresses:
- ip: 192.168.0.1
ports:
- port: 27017
但这失败了,因为服务名称不能是 FQDN...
虽然起初并不那么明显,但解决方案非常简单。最新版本的 kube-dns 镜像包含 dnsmasq
作为其组件之一。如果你查看它的手册页,你会看到一些有用的选项。在那次讲座之后,您可以选择类似这样的路径:
创建一个 ConfigMap 来存储您的 dns 映射:
apiVersion: v1
kind: ConfigMap
metadata:
name: kube-dns
namespace: kube-system
data:
myhosts: |
10.0.0.1 foo.bar.baz
在您的集群中应用该 ConfigMap 后,您现在可以对您在 kubernetes 中使用的 kube-dns-vXX
部署进行一些更改。
定义将您的 CM 暴露给 dnsmasq
volumes:
- name: hosts
configMap:
name: kube-dns
并且挂载在 kube-dns
deployment/rc 模板的 dnsmasq
容器中
volumeMounts:
- name: hosts
mountPath: /etc/hosts.d
最后,在您的 dnsmasq 参数中添加一个小的配置标志:
args:
- --hostsdir=/etc/hosts.d
现在,当您将这些更改应用到集群中的 kube-dns-vXX
部署时,它将安装配置映射并使用安装在 /etc/hosts.d/ 中的文件(具有典型的主机文件格式)作为dnsmasq
的知识来源。因此,如果您现在在 pods 中查询 foo.bar.baz,它们将解析为相应的 IP。这些条目优先于 public DNS,因此它应该完全适合您的情况。
请注意 dnsmasq
不会监视 ConfigMap 中的更改,因此如果它发生更改,则必须手动重新启动它。
几分钟前在实时集群上对此进行了测试和验证。