需求
kubernetes集群外部有少量服务,kubernetes集群内部pod需要通过服务所在的主机的hostname访问服务。
解决方案
通过coredns的hosts插件配置kubernetes集群的dns服务,使集群内部可通过hostname/域名访问外部服务。
参考:CoreDNS hostshosts插件格式
hosts [FILE [ZONES...]] { [INLINE] fallthrough [ZONES...] }
- FILE:需要读取与解析的hosts文件;如果省略,默认取值"/etc/hosts";每5s扫描一次hosts文件的变更。
- ZONES:如果为空,取配置块中的zone。
- INLINE:宿主机hosts文件在corefile中的内联;在"fallthrough"之前的所有"INLINE"都可视为hosts文件的附加内容,hosts文件中相同条目将被覆盖,以"INLINE"为准。
- fallthrough:如果zone匹配且无法生成记录,将请求传递给下一个插件;如果省略,对所有zones有效,如果列出特定zone,则只有列出的zone受到影响。
范例
以Kubernetes采用CoreDNS中的coredns-cm.yaml为基础变更,如下:
cat coredns-cm.yaml apiVersion: v1 kind: ConfigMap metadata: name: coredns namespace: kube-system labels: addonmanager.kubernetes.io/mode: EnsureExists data: Corefile: | .:53 { errors health # 省略了”FILE“,"ZONES"等字段 hosts { 172.30.200.21 kubenode1 172.30.200.22 kubenode2 172.30.200.23 kubenode3 fallthrough } kubernetes cluster.local in-addr.arpa ip6.arpa { pods insecure upstream fallthrough in-addr.arpa ip6.arpa } prometheus :9153 proxy . /etc/resolv.conf cache 30 loop reload loadbalance }
验证
# 替换configmap kubectl replace -f coredns-cm.yaml # ping外部hostname kubectl exec -it dnstest -- ping kubenode1 kubectl exec -it dnstest -- ping kubenode2 kubectl exec -it dnstest -- ping kubenode3
精彩评论