我在AWS中运行了一个带有自动缩放节点的Kubernetes v1.4群集。 我还有一个Mongo副本集群集,它只有SSL连接(FQDN通用名称)和公共DNS条目:
Kubernetes节点是安全组的一部分,允许访问mongo集群,但只能通过其私有IP。
有没有办法在查询公共FQDN时使用私有IP在Kubernetes DNS中创建A记录?
我尝试的第一件事是剧本& ConfigMap组合在启动时更新/ etc / hosts(参考{{3}}),但这是有问题的,因为其他Kubernetes服务也可能在不同时间更新hosts文件。
我也尝试过服务& 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 :(得分: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后,您现在可以对您在kubernetes中使用的kube-dns-vXX
部署进行一些更改。
定义将您的CM展示为dnsmasq
volumes:
- name: hosts
configMap:
name: kube-dns
和mount位于dnsmasq
部署/ rc模板
kube-dns
容器中
volumeMounts:
- name: hosts
mountPath: /etc/hosts.d
最后,在你的dnsmasq参数中添加一个小的配置标志:
args:
- --hostsdir=/etc/hosts.d
现在,当您将这些更改应用于群集中的kube-dns-vXX
部署时,它将挂载configmap并使用/etc/hosts.d/中安装的文件(具有典型的主机文件格式)作为知识来源为dnsmasq
。因此,如果您现在在pod中查询foo.bar.baz,它们将解析为相应的IP。这些条目优先于公共DNS,因此它完全适合您的情况。
请注意dnsmasq
没有注意ConfigMap中的更改,因此如果它发生更改,则必须手动重新启动。
几分钟前在实时群集上对此进行了测试和验证。