4

我有一个在 AWS 中运行的 Kubernetes v1.4 集群,具有自动缩放节点。我还有一个 Mongo Replica Set 集群,其中包含仅 SSL 连接(FQDN 公用名)和公共 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。

当查询公共 FQDN 时,有没有办法在 Kubernetes DNS 中使用私有 IP 创建 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

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

4

1 回答 1

7

虽然一开始并不那么明显,但解决方案非常简单。最近版本中的 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

并且 mount 在您的部署/rc 模板dnsmasq容器中kube-dns

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

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

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

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

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

几分钟前在一个实时集群上测试并验证了这一点。

于 2016-11-14T18:48:51.943 回答