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批量自动生成就好了!!!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐