SpringCloud容器化服务发现及注册实现方法解析
springclould项目容器化过程中,可能是采用部分部分容器化,逐步迁移到容器环境,这时候我们就会面临一个问题:外部服务如何调用k8s内部服务.
EurekaServer提供服务注册服务,各个节点启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,consumer通过Eureka发现其他节点/服务.
应用场景
Eureka,gateway,app01,app02处于k8s集群外部
app03,app04位于k8s内部
问题:k8s集群内部可以访问外部eureka,gateway等服务,但是外部服务无法访问k8s内部app03,app04.
打通网络
打通外部环境与k8s环境service与pod网段,可以做的网络直连.使得外部服务可以直接访问k8s内网.
方案一:k8snode节点可以直接访问pod与service网段,我们只需要将其中一个节点作为Gateway,其他外部机器添加静态路由网关执行这台node节点即可.
方案二:将其他机器部署flannel插件,打通pod与service网段.
PS这里我们使用第一种方案.
PS阿里云环境下由于使用VPC,这是我们只需要在VPC添加路由策略即可.
开启服务器路由转发
node节点
vim/etc/sysctl.conf
net.ipv4.conf.default.rp_filter=1
sysctl-p
外部服务器添加静态路由
10.0.0.0/16pod网段
10.10.0.0/16service网段
172.17.71.209开启路由转发的node节点.
iprouteadd10.0.0.0/16via172.17.71.208deveth0
iprouteadd10.10.0.0/16via172.17.71.208deveth0
Eureka注册问题
打通网络后,我们启动服务,我们发现虽然节点已经注册到Eureka,但是使用的是hostname:port的格式,而springclould中节点相互访问就是使用的Eureka中的注册信息,这样也就意味着我k8s里的springclould节点注册的是pod的hostname(Eureka在k8s外部不需要打通网络也可以正常注册)
也就是外部服务虽然可以访问k8s内部网络,但是这个hostname解析不成对于的IP,也就是还是没有办法相互调用.
也就是说我们节点注册时而是使用podIP注册就可以解决这个问题,下边我们修改下k8s内部的springclould节点配置
vimBOOT-INF/classes/application-k8s.yml #配置服务注册中心的地址 eureka: client: serviceUrl: defaultZone:http://xx:xxx@sreg-smix3-k8s-t:7000/eureka/ instance: preferIpAddress:true#使用IP注册
重新打版,重启pod.看起来和之前一样,我们点击进去看下:
虽然显示是hostname,但是注册地址以及改成了ip,这时候其他非容器化节点去访问时就可以正常调通了.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。