大家好,今天来为大家分享域名解析的方式有的一些知识点,和5种容器内指定特定域名解析结果的方式的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
本文分享自华为云社区《容器内指定特定域名解析结果的几种方式-云社区-华为云》,作者:张俭。
在本篇文章中,我们将探讨如何在容器内指定特定域名解析结果的几种方式。为了方便演示,首先我们创建一个演示用的Deployment配置文件。
apiVersion:apps/v1\nkind:Deployment\nmetadata:\nname:busybox-deployment\nlabels:\napp:busybox\nspec:\nreplicas:1\nselector:\nmatchLabels:\napp:busybox\ntemplate:\nmetadata:\nlabels:\napp:busybox\nspec:\ncontainers:\n-name:busybox\nimage:busybox\nargs:\n-/bin/sh\n--c\n-"whiletrue;doechoHello,Kubernetes!;sleep10;done"\n
这个deployment会创建1个busybox的pod,容器每隔10s会打印“Hello,Kubernetes!”到控制台
如需对接三方的DNS服务器,推荐采用
修改/etc/hosts是最传统的方式,直接在容器内修改相应的文件来实现域名解析,在Pod级别生效。由于其可维护性较差(每次pod发生重启都需要手动修改),不推荐在生产环境使用。
例如,我们可以在/etc/hosts里面添加这样一条记录
250.250.250.250four-250\n
/#pingfour-250\nPINGfour-250(250.250.250.250):56databytes\n添加HostAliases记录
HostAliases是kubernetes中Pod配置的一个字段,它提供了Pod内容器的/etc/hosts文件的附加记录。这在某些情况下非常有用,特别是当你想要覆盖某个主机名的解析结果,或者提供网络中没有的主机名解析时。
这个可以在Pod、Replica、Deployment、StatefulSet的级别修改,维护性稍强。举个,我们将上面的yaml修改为
apiVersion:apps/v1\nkind:Deployment\nmetadata:\nname:busybox-deployment\nlabels:\napp:busybox\nspec:\nreplicas:3\nselector:\nmatchLabels:\napp:busybox\ntemplate:\nmetadata:\nlabels:\napp:busybox\nspec:\nhostAliases:\n-ip:"250.250.250.250"\nhostnames:\n-"four-250"\ncontainers:\n-name:busybox\nimage:busybox\nargs:\n-/bin/sh\n--c\n-"whiletrue;doechoHello,Kubernetes!;sleep10;done"\n
这个时候我们查看容器的/etc/hosts,发现它被kubernetes自动插入了一条记录**EntriesaddbyHostAliases。**这就是hostAliases的实现原理
在kubelet_pods代码中进行了这样的写入动作
funchostsEntriesFromHostAliases(hostAliases[]v1.HostAlias)[]byte{\n\tiflen(hostAliases)==0{\n\t\treturn[]byte{}\n\t}\n\n\tvarbufferbytes.Buffer\n\tbuffer.WriteString("\\n")\n\tbuffer.WriteString("#EntriesaddedbyHostAliases.\\n")\n\t//foreachIP,writeallaliasesontosinglelineinhostsfile\n\tfor_,hostAlias:=rangehostAliases{\n\t\tbuffer.WriteString(fmt.Sprintf("%s\\t%s\\n",hostAlias.IP,strings.Join(hostAlias.Hostnames,"\\t")))\n\t}\n\treturnbuffer.Bytes()\n}\nCoredns配置
我们可以通过修改ConfigMap来实现让容器解析特定域名的目的。
我们可以通过以下命令修改Coredns的配置:
kubectleditcmcoredns-nkube-system\n原有的configmap
Corefile:|\n.:53{\nlog\nerrors\nhealth{\nlameduck5s\n}\nready\nkubernetescluster.localin-addr.arpaip6.arpa{\npodsinsecure\nfallthroughin-addr.arpaip6.arpa\nttl30\n}\nprometheus:9153\nhosts{\n192.168.65.2host.minikube.internal\nfallthrough\n}\nforward./etc/resolv.conf{\nmax_concurrent1000\n}\ncache30\nloop\nreload\nloadbalance\n}\n
在hosts里面加上特定的记录
250.250.250.250four-250\n
如果您没有配置reload插件,则需要重启Coredns才能生效,默认的reload时间是30s,在plugin/reload/setup.go的defaultInterval中定义
通过修改DNS策略。使得对于单个Pod/Deploy/StatefulSet将特定的域名解析发给特定的服务器来达到效果,如下,可以对pod添加dns的服务器以及search域
spec:\ndnsConfig:\nnameservers:\n-1.2.3.4\nsearches:\n-search.prefix\ncontainers:\n-name:busybox\nimage:busybox\nargs:\n-/bin/sh\n--c\n-"whiletrue;doechoHello,Kubernetes!;sleep10;done"\n使用第三方DNS插件
不推荐,使用其他的DNS插件,来做一些炫酷的自定义操作。而且目前Coredns也是业内的主流,没有很好的替代。
关注#华为云开发者联盟#\u0002点击下方,第一时间了解华为云新鲜技术~
华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云
文章分享结束,域名解析的方式有和5种容器内指定特定域名解析结果的方式的答案你都知道了吗?欢迎再次光临本站哦!