2016-11-14 85 views
1

我有一个在AWS中运行的Kubernetes v1.4集群,具有自动扩展节点。 我也有一个蒙戈副本集簇只有SSL的连接(FQDN通用名)和公共DNS条目:创建特定的记录条目到Kubernetes本地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节点是一个安全组,允许访问所述蒙戈群集的一部分,而是仅经由它们的私人IP。

当公共FQDN被查询时,是否有方法在Kubernetes DNS中使用私有IP创建A记录?

我想的第一件事是一个脚本& ConfigMap组合更新/ etc /在启动时的主机(参见Is it a way to add arbitrary record to kube-dns?),但是这是有问题的其他Kubernetes服务还可以更新主机在不同的时间文件。

我也尝试了服务& Enpoints配置:

--- 
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 ......

+0

你有没有想过使用mongo实例AWS公共DNS(公共主机名)?当从ec2实例调用时,它重定向到专用IP:http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-ip-addressing.html#vpc-public-ip-addresses –

回答

5

。最近版本中的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集群中的应用,你现在可以做一些改变你使用kube-dns-vXX部署在你的kubernetes。

定义卷,将暴露你的CM到dnsmasq

volumes: 
    - name: hosts 
    configMap: 
     name: kube-dns 

,并安装在你的kube-dns部署/ RC模板dnsmasq容器

volumeMounts: 
    - name: hosts 
     mountPath: /etc/hosts.d 

最后,添加一个小的配置标志,以您的dnsmasq参数:

args: 
    - --hostsdir=/etc/hosts.d 

现在,当您将这些更改应用于群集中的kube-dns-vXX部署时,它将挂载configmap并使用挂载在/etc/hosts.d/中的文件(具有典型主机文件格式)作为dnsmasq的知识来源。因此,如果您现在在您的容器中查询foo.bar.baz,它们将解析为相应的IP。这些条目优先于公共DNS,因此它应该完全适合您的情况。

请注意dnsmasq不在监视ConfigMap中的更改,因此如果更改它必须手动重新启动。

几分钟前在一个活动群集上进行了测试和验证。