1、背景
公司的项目需要使用容器化部署,为了更好的维护和管理,我将各个项目按照命名空间进行隔离开,但是却发现存在一些问题
不同的系统间需要项目调用,而且是按照服务名进行调用,但是却导致不同名称空间下pod无法解析其他的命令空间下的服务名,需要使用服务名.命名空间
才可以解析,如下(存在两个名称空间yshj-ump、和gxjhpt,其中gxjhpt下的pod需要调用yshj-ump下的api服务)
可以看ump-api无法解析,进入gxjhpt下的pod测试域名解析发现确实无法解析,但是可以使用服务名.命名空间
便可以解析
手动在pod中的/etc/hosts
中添加ump-api
的域名解析可以解决,但是这个太现实。
2、解决办法
1. 修改k8s的dns为kubedns
- k8s中负责解析服务名的dns组件有coredns、kubedns等多种,查看命令
kubectl get pod -n kube-system
,因此集群上服务互相访问,服务名解析问题首先看服务名是否在同一个命名空间namesapce,服务名是否写正确,其次检查dns组件的版本和工作状态。 - coredns、kubedns二者有个区别,是在解析ExternalName svc时,即访问外部服务有两种组合:kubedns+externalname与coredns+endpoints,这取决于k8s集群上安装了哪种dns组件。
1)coredns解析不了externalname,而定义好的externalname svc 如何才能在安装coredns的k8s集群上运行?这就需要转换一下
2)如果想改变k8s运行的解析服务名的组件,将kube-system命名空间中的coredns删除 kubectl delete deploy -n kube-system coredns
对应的deploy名称,换成kubedns
这种方式担心存在风险不敢操作,故此作罢
2. 修改coredns的configmap,使自动添加域名解析到pod的/etc/hosts
中
hosts {
10.233.49.227 ump-api
fallthrough
}
不知道为什么这里添加了还是没有生效,依然无法解析,不知道是不是添加的参数有问题还是什么原因
3. 使用hostAliases配置Pod /etc/hosts
,实现添加域名解析
- 和containers属于同一级
hostAliases:
- ip: 10.233.49.227
hostnames:
- ump-api
- yshj-ump-api
最终解决,大工搞成,只不过需要每个deploy服务都需要添加有点麻烦
要是可以使用coredns的configmap批量自动生成就好了!!!