当前位置: 首页 > 科技观察

Kubernetes配置外部DNS的方式

时间:2023-03-16 19:23:55 科技观察

问题的根源在于,在容器化的道路上,很多实践都是运行在混合环境中,即有的程序在容器中,有的在VM或物理机中。也无可厚非,毕竟技术总不能放在一个筐里,不然运维人员就崩溃了。在这样的环境下,很多企业原有的应用都是通过DNS访问的,那么容器中的应用是如何访问这些应用的呢?阿里云的Kubernetes默认使用KubeDNS(后续版本会被CoreDNS取代,敬请期待)。KubeDNS的上游DNS服务器直接使用了阿里云的DNS服务,默认无法通过DNS。访问企业这些服务的方式。本文基于阿里云Kubernetes容器服务的实践。解决方案阿里云的Kubernetes一直保持着Kubernetes的一致性和可移植性,所以可以直接参考Kubernetes官方文档:https://kubernetes.io/docs/tasks/administer-cluster/dns-custom-nameservers/主要思路是通过增加KubeDNS的上游DNS服务器来解决。下面具体演示如何在阿里云的Kubernetes中搭建上游DNS服务。具体实践中Kubedns组件的基本介绍:KubeDNS是Kubernetes的一个附加组件,主要为容器提供DNS服务。它在一个Pod中包括以下组件:kubedns:监控k8sapiserver,在内存中维护DNS记录,同时响应DNS请求dnsmasq:增加DNS缓存提高性能,主要通过日志判断错误校验这个组件。sidecar:提供统一的健康检查接口,对上面的其他两个组件进行健康检查。KubeletDNS和Kubelete相关的配置有两个:--cluster-dns=指定容器使用的dns,因为用的是kubeDNS,这里的配置是kuebDNS内部使用的域名后缀clusterip--cluster-domain=<默认本地域>k8s。默认值为:cluster.local。目前不建议更改此值。配置上游DNS支持企业服务DNS服务器。通过kubectldescribekube-dns-nkube-system可以看到kubedns的启动参数需要使用--config-dir=/kube-dns-config来读取配置文件,而这个配置是通过一个名为configmap的configmap获取的kube-dns,所以我们只需要配置这个configmapkubectlcreateconfigmap/kube-dns-nkube-systemkubectleditconfigmap/kube-dns-nkube-system然后在data下添加相应的内容,例如:upstreamNameservers:'["8.8.8.8","100.100.2.136"]'其中"8.8.8.8"和"100.100.2.136"为上游对应的DNS服务器。这里需要注意的是,容器是无法感知到configmap的变化的。这也是我对configmap吐槽最多的地方。要让这个配置生效,只能删除kube-dns对应的容器,让它重启获取对应的新配置:kubectldeletepod/-nkube-system这样,我们已经配置了上游服务器对应的DNS,容器内的应用可以使用域名的方式访问集群外的其他企业应用。填坑说明:注意阿里云中的安全组设置,因为kubeDNS是标准的DNS接口,所以主机之间需要开放UDP端口53。如果发现能ping通ip,ping不通域名,很可能是这个问题,需要查看kubedns是否开启了对应的upstreamdns。可以使用如下命令查看日志:kubectllogs-cdnsmasq-nkube-system如图:判断上游DNS服务器是否配置