本文摘自 istio 学习笔记
项目中使用了 apollo 插件,在非 istio 环境正常运行,但部署到 istio 后启动报类似如下错误:
Sync config from upstream repository class com.ctrip.framework.apollo.internals.RemoteConfigRepository failed, reason: Load Apollo Config failed - xxx, url: http://10.5.16.49:8080/configs/agent-center/see-test-02/test.common?ip=10.5.16.46 [Cause: [status code: 404] Could not find config for xxx please check whether the configs are released in Apollo!]
表示请求 apollo 的 config service 返回 404 了。
查看 envoy 的 accesslog:
response_flags
为 NR
,表示找不到路由 (参考 envoy 官网解释: No route configured for a given request in addition to 404 response code, or no matching filter chain for a downstream connection)。Host
直接用的 PodIP:Port
。PodIP:Port
属于 apollo 服务的 headless service 一个 endpoint (apollo 通过 statefulset 部署)。进一步分析之前,我们先了解下 istio 对 headless service 的 xDS 支持:
LDS
规则中会监听 headless service 所有可能的 PortIP:Port
,请求 headless service 的 Pod 时,这里先匹配上。RDS
规则进行路由,路由时会匹配 hosts,hosts 列表中列举了所有可能的 service 地址 (没有 Pod IP),如果都匹配不到就会返回 404。由于请求 apollo 的 config service 时,Host
没有使用 service 地址,而是直接使用了 PodIP:Port
,所以 RDS
匹配时找不到相应 hosts,就会返回 404。
为了实现高可用,apollo 的 java 客户端默认是从 meta server 中获取 config service 的 ip 地址 (服务发现),然后直接对该地址发起请求 (不使用 k8s service),从而导致请求 config service 时没有将其 k8s service 地址作为 Host
,最后 hosts 匹配不到返回 404。
在 istio 场景下 (kubernetes 之上),请求 config service 就不需要不走 apollo meta server 获取 config service 的 ip 来实现高可用,直接用 kubernetes 的 service 做服务发现就行。幸运的是,apollo 也支持跳过 meta server 服务发现,这样访问 config service 时就可以直接请求 k8s service 了,也就可以解决此问题。
具体配置方法参考 Apollo Java 客户端使用指南 。
2020年7月9日,2020年世界人工智能大会(the World Artificial Intelligence Con...
发布会传送门 : https://yqh.aliyun.com/live/aiotfa 近日,阿里云AIoT春季产品...
中台有机衔接稳定的后台系统和灵活多变的前端业务场景 通过抽取后台系统的数据 ...
在过去的一年中,云计算已经成为组织应对冠状病毒疫情对其业务不利影响的关键技...
MongoDB是一个基于分布式文件存储的数据库。 由C++语言编写。旨在为WEB应用提供...
怎么防御udp攻击?UDP Flood是日渐猖厥的流量型 ddos 攻击。常见的情况是利用大...
3月Techo Youth高校公开课Demo实操演练 【活动已结束】 3月Techo Youth高校公开...
最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上所...
客户简介 深圳盒子信息科技有限公司成立于2011年,是国家高新技术企业、深圳市高...
1、智能语音点餐机解决方案方案架构 架构特点 基于达摩院特有的多模态交互技术 ...