为Kubernetes本地DNS创建特定的A记录条目

Tim*_*nes 3 dns amazon-web-services kubernetes kube-dns

我在AWS中运行了一个带有自动缩放节点的Kubernetes v1.4集群.我还有一个具有仅SSL连接(FQDN通用名称)和公共DNS条目的Mongo副本集群集:

  • 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访问.

有没有办法在查询公共FQDN时使用私有IP在Kubernetes DNS中创建A记录?

我尝试的第一件事是在启动时更新/ etc/hosts的脚本和ConfigMap组合(参考.这是一种向kube-dns添加任意记录的方法吗?),但这是有问题的,因为其他Kubernetes服务也可能更新主机在不同时间提交文件.

我还尝试了一个Services&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
Run Code Online (Sandbox Code Playgroud)

但这失败了,因为服务名称不能是FQDN ...

Rad*_*nka 6

虽然起初并不那么明显,但解决方案非常简单.最近版本中的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
Run Code Online (Sandbox Code Playgroud)

在群集中应用ConfigMap后,您现在可以对kube-dns-vXX您在kubernetes中使用的部署进行一些更改.

定义将CM暴露给的卷 dnsmasq

  volumes:
  - name: hosts
    configMap:
      name: kube-dns
Run Code Online (Sandbox Code Playgroud)

和mount在deploy/rc模板的dnsmasq容器中kube-dns

    volumeMounts:
    - name: hosts
      mountPath: /etc/hosts.d
Run Code Online (Sandbox Code Playgroud)

最后,在你的dnsmasq参数中添加一个小的配置标志:

    args:
    - --hostsdir=/etc/hosts.d
Run Code Online (Sandbox Code Playgroud)

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

请注意,dnsmasqConfigMap中没有注意更改,因此如果更改,必须手动重新启动.

几分钟前在实时集群上对此进行了测试和验证.