Mesh 常见问题
本文汇总了使用服务网格时可能遇到的常见问题及解决方案。
服务网格目前支持的微服务框架有哪些?
服务网格目前支持 Dubbo、SpringCloud 等主流微服务框架。
XDS 配置不下发
问题原因:Pilot 未启动或 Pilot 与 MOSN 网络不通。
解决方案:
查看 MOSN 连接 Pilot 是否正常。
进入 MOSN 容器,执行如下命令,如果和pilot没有链接则检查pilot的地址是否填写正确
netstat -na | grep 15050
进到MOSN容器,在
/home/admin/logs/mosn/default.log
下,查看 XDS Client 是否初始化成功。若出现如下日志,表示 XDS Client 连接失败,可能是 Pilot 地址错误或 Pilot 未启动。
2020-12-07 16:02:50,791 [INFO] fail to create stream client: rpc error: code = Unavailable desc = connection error: desc = "transport: Error while dialing dial tcp 11.**.**.206:15050: connect: connection refused" 2020-12-07 16:02:50,791 [INFO] [xds] [ads client] stream client reconnect failed, retry after 4s 2020-12-07 16:02:50,973 [INFO] [xds] [ads client] stream client closed, sleep 1s and wait for reconnect
查看 MOSN 是否接收到配置。
若 Pilot Pod 未启动,则等待 Pilot 启动,MOSN 有自动重连机制,不需要修改。
等待日志输出如下内容,则连接恢复正常。
[xds] [sds subscriber] stream client reconnected
服务注册的提供者的版本号丢失
在 k8s 服务上查看应用 YAML 上是否打上 app.kubernetes.io/version: 1.0.0
Label。
服务限流未生效
服务限流生效链路:DsrConsole > DRM > MOSN。
首先登录微服务控制台,检查限流规则配置是否正确。
限流方向选择客户端时,需填写客户端的应用,表示在客户端侧进行限流;限流方向在服务端时,需填写服务端的应用,表示在服务端进行限流。
查看 DRM 是否推送了限流规则。
下图表示推送了限流规则:
查看 MOSN 和 DRM 连接是否正常。
以客户端限流为例,输入命令如下:
kubectl exec -it crpc-client-2-5747cf49db-q9mnn -c mosn-sidecar-container bash netstat -nalp |grep 9880
出现类似下图内容,表示 MOSN 和 DRM 已经建立连接。
查看 MOSN 是否收到限流规则。
打开 MOSN 的
/home/admin/logs/mosn/drm.access.log
日志文件,查找关键字RateLimit
:grep -irn "RateLimit" *.log
如果未收到限流规则,则检查 DsrConsole 与 DRM 的连接是否正常。
netstat -nalp |grep 9880
若连接正常,但是未收到限流规则,检查 MOSN 配置的租户信息是否和 DsrConsole 里面的租户信息对应。如果不对应,则修改为 MOSN 里面的租户。
服务熔断未生效
服务熔断生效链路:DsrConsole > DRM > MOSN。
首先登录微服务控制台,检查熔断规则配置是否正确。
熔断方向选择客户端的话需填写客户端的应用,表示在客户端侧进行熔断,熔断方向在服务端的话需填写服务端的应用,表示在服务端进行熔断。
查看 DRM 是否推送了熔断规则。
下图中表示推送了熔断规则。
查看 MOSN 和 DRM 连接是否正常。
以客户端侧熔断为例,输入命令如下:
kubectl exec -it crpc-client-2-5747cf49db-q9mnn -c mosn-sidecar-container bash netstat -nalp |grep 9880
出现类似下图内容,表示 MOSN 和 DRM 已经建立连接。
查看 MOSN 是否接收到了熔断规则。
打开 MOSN 的
/home/admin/logs/mosn/drm.access.log
日志文件,查找关键字circuitBreakerRules
:grep -irn "circuitBreakerRules" *.log
如果未收到熔断规则,则检查 DsrConsole 与 DRM 的连接是否正常。
netstat -na | grep 9880
若连接正常,但是未收到熔断规则,检查 MOSN 配置的租户信息是否和 DsrConsole 里面的租户信息对应。如果不对应,则修改为 MOSN 里面的租户。
服务降级未生效
服务降级生效链路:DSRConsole > DRM > MOSN。
首先登录微服务控制台,检查服务降级规则配置是否正确。
服务降级发生在客户端,请检查配置项是否填写正确(检查应用、服务、方法)。
检查 DRM 是否推送了降级规则。
下图表示 DRM 收到了降级规则。
查看 MOSN 和 DRM 连接是否正常。
kubectl exec -it crpc-client-2-5747cf49db-q9mnn -c mosn-sidecar-container bash netstat -nalp |grep 9880
出现类似下图内容,表示 MOSN 和 DRM 已经建立连接。
查看 MOSN 是否收到了降级规则。
打开 MOSN 的
/home/admin/logs/mosn/drm.access.log
日志文件,查找关键字downgradeRule
:grep -irn "downgradeRule" *.log
下图表示 MOSN 收到了降级规则。
如果未收到降级规则,则检查 DsrConsole 与 DRM 的连接是否正常。
netstat -na | grep 9880
若连接正常,但是未收到降级规则,检查 MOSN 配置的租户信息是否和 DsrConsole 里面的租户信息对应。如果不对应,则修改为 MOSN 里面的租户。
故障注入未生效
故障注入可能发生在客户端,也可能发生在服务端,通常用来注入一段时间异常或者直接注入异常。注入规则没生效时,先检查自己的注入规则是否配置正确,如客户端注入需填写客户端的应用名,服务端注入需填写服务端的应用名。
故障注入生效链路:DSRConsole > DRM > MOSN。
首先登录微服务控制台,检查故障注入规则配置是否正确。
检查 DRM 是否推送了故障注入规则。
下图表示 DRM 推送了规则。
查看 MOSN 和 DRM 连接是否正常。
kubectl exec -it crpc-client-2-5747cf49db-q9mnn -c mosn-sidecar-container bash netstat -nalp |grep 9880
出现类似下图内容,表示 MOSN 和 DRM 已经建立连接。
查看 MOSN 是否收到了故障注入规则。
打开 MOSN 的
/home/admin/logs/mosn/drm.access.log
日志文件,查找关键字faultInjectRules
:grep -irn "faultInjectRules" *.log
如果未收到故障注入规则,则检查 DsrConsole 与 DRM 的连接是否正常。
netstat -na | grep 9880
若连接正常,但是未收到故障注入规则,检查 MOSN 配置的租户信息是否和 DsrConsole 里面的租户信息对应。如果不对应,则修改为 MOSN 里面的租户。
故障隔离未生效
故障隔离生效链路:DSRConsole > DRM > MOSN。
首先登录微服务控制台,检查故障隔离规则配置是否正确。
例如下图就是错误的配置:异常比例阈值 * 异常比例倍数 = 200,最大的出错上限是 100。
观察 DRM 是否推送了故障隔离规则。
下图表示推送了规则。
查看 MOSN 和 DRM 连接是否正常。
kubectl exec -it crpc-client-2-5747cf49db-q9mnn -c mosn-sidecar-container bash netstat -nalp |grep 9880
出现类似下图内容,表示 MOSN 和 DRM 已经建立连接。
查看 MOSN 是否收到了故障隔离规则。
打开 MOSN 的
/home/admin/logs/mosn/drm.access.log
日志文件,查找关键字faultToleranceRules
:grep -irn "faultToleranceRules" *.log
下图表示 MOSN 收到了故障隔离规则。
如果未收到隔离规则,则检查 DsrConsole 与 DRM 的连接是否正常。
netstat -na | grep 9880
若连接正常,但是未收到降级规则,检查 MOSN 配置的租户信息是否和 DsrConsole 里面的租户信息对应。如果不对应,则修改为 MOSN 里面的租户。
服务路由未生效
路由规则的下发顺序:
在控制台配置完成后,先调用 DsrConsole 将规则发送给 Cloudmesh OpenAPI。
OpenAPI 把配置写入 k8s APIServer。
Pilot 监听 k8s APIServer 中的配置信息变化,然后把配置信息发送给客户端的 MOSN。
您可以按路由下发顺序倒着检查:
查看路由规则是否下发到 MOSN。
进入 MOSN,输入以下命令查看日志文件,检查路由规则是否下发。
kubectl exec -it crpc-client-1-84d49d4468-sbtc5 -c mosn-sidecar-container bash
说明crpc-client-1-84d49d4468-sbtc5
代表客户端的 Pod 名称,执行时要修改为当前客户端的 Pod 名称。下图表示路由规则已经下发。
执行
kubectl get virtualservice -n default
命令,查看路由规则是否下发到k8s APIServer
。说明virtualservice
是自定义的内容,执行时可根据实际情况进行修改。下图表示内容已经下发。
执行
netstat -an|grep 15050
命令,查看 MOSN 和 Pilot 是否建立长连接。下图表示建立了长连接。
执行
kubectl get pod -n cloudmesh -o wide
命令,检查 Pilot 应用和 APIServer 应用的 IP 配置的是否正确。下图中查看
openapi-7b794d6796-x2wp4
和pilot-fb4777d78-f9nml
的 IP 配置。OpenAPI 需要在 DsrConsole 上进行地址配置,如下图所示:
openApiUrl(OpenAPI 的地址)
这个属性是将路由规则下发到 OpenApI,Pilot 地址需要在发布应用的 YAML 文件中配置(MOSN的环境变量),配置信息如下:- name: PILOT_SERVER_ADDRESS value: 192.**.**.144
查看所有的服务列表。
进入客户端的 MOSN 容器,输入
curl localhost:13330/servicesnapshot
命令查看所有的服务列表。如果看到的服务列表和在控制台看到的不一样,以在 MOSN 容器看到的为准。
配置服务路由有以下注意事项:
配置多条路由规则时,先匹配优先级更高的路由规则。
如果开启了分流开关,当流量目的地分组没有服务实例,是否转发到其他分组。
如果开启了降级开关,当前规则没有匹配的服务实例时,是否继续匹配其它规则。
如果全都匹配不上,路由规则就会失效,就会优先选择本 Zone 的服务实例( Zone 信息在发布应用的 YAML 文件中)。
删除一个开启的路由规则,客户端随机选择一台服务端进行调用。
流量精确匹配,先根据服务实例属性进行流量过滤,过滤之后的流量再按照流量目的地进行路由。
多条服务实例分组条件是与的关系(需要同时满足)。
如果为同一个应用、同一个接口服务重复配置多条规则,页面上会显示到一起。
如果路由粒度配置成应用级,可以在手写模式下填星号(*),或者在选择模式下,选择全部服务。
服务鉴权未生效
服务鉴权生效链路 DSRConsole > Clioudmesh OpenAPI > 写入 APIServer > Pilot 监听 CR 资源变化 > 把鉴权规则下发到 MOSN。
排查时按照生效链路倒着排查:
进入
DSRConsole
机器输入env | grep auth.dispatch.target.sigma
命令查看环境变量。如果没有需要加上环境变量
-Dauth.dispatch.target.sigma=true
。输入如下命令,打开
defult.logDEBUG
日志。curl -X POST \ http://127.0.0.1:34901/api/v1/update_loglevel \ -d '{ "log_level":"DEBUG", "log_path":"./logs/mosn/default.log" }'
进入
/home/admin/logs/mosn
目录,执行grep 'mosnrbac' *.log
命令。如果出现类似如下日志,说明鉴权规则已经下发到了 MOSN。鉴权没生效的话,需要检查自己配置的规则是否正确。如果 MOSN 没有收到鉴权规则,往下继续检查。
检查和 Pilot 连接是否正常。
如果出现类似下图内容,说明和 Pilot 连接正常。
如果和 Pilot 连接不正常,查看 Pilot 地址是否正确。
如果 Pilot 地址不正确,将 Pilot 地址修改正确。
如果 Pilot 地址正确,往下继续检查。
在控制台里输入以下命令,查看
MOSN RbacConfig
资源。查看 CR 是否下发到k8s APIServer
。kubectl get mosnrbacconfigs -n default --sort-by=.metadata.creationTimestamp | tail -n +2
如果出现类似下图内容,说明资源已经下发到了
k8s API Server
。注意最新时间。如果 k8s 里没有资源,往下继续检查。
查看
DSRConsole
控制台动态配置 OpenAPI 地址是否配置正确。如果 OpenAPI 地址不正确,将 OpenAPI 地址修改正确。
如果 OpenAPI 地址正确,往下继续检查。
进入
Cloudmesh OpenAPI
容器,查看日志/home/admin/logs/cloudmesh
。openapi.log
:错误日志打印到这个文件。request.log
:调用请求日志打印到这个文件。
发送一个请求,查看请求是否打到了 OpenAPI,查看日志是否出错。
Trace 展示不出来
在 MOSN 里面检查 TRACING_SWITCH
环境变量是否是合法的 SkyWalking 或 Zipkin。
env | grep TRACING_SWITCH
如果 TRACING_SWITCH=SkyWalking,则检查 SKY_WALKING_ADDRESS 和 SKY_WALKING_PORT 是否正确配置了 SkyWalking 地址。
如果 TRACING_SWITCH=Zipkin,则检查 ZIPKIN_ADDRESS 和 ZIPKIN_PORT 是否正确配置了 Zipkin 地址。
Metric 数据未采集成功
查看
Prometheus
是否正确的配置了 业务采集 的地址。执行
kubectl get po -o yaml
查看是否打上对应 Annotations。执行
curl podip:34903/metrics
查看是否有指标输出。
如何查看容器内发布的服务
本地进入 MOSN 容器:
docker exec -it mosn-container bash
在 MOSN 容器内部执行以下命令,查看当前 MOSN Pub 服务 hosts 地址:
curl localhost:34901/api/v1/config_dump?allclusters= | python -m json.tool
如何查看插件是否 load 成功
您可以执行如下命令查看:
grep codec /home/admin/logs/mosn/default.log --col
load go plugin codec succeed: /go/src/mosn.io/extensions/go-plugin/build/codecs/bolt/codec-bolt.so
如何适配苹果 m1 芯片
安装 rosetta。
m1 芯片电脑需要安装 rosetta,命令如下:
softwareupdate --install-rosetta --agree-to-license
安装 Mac 版 Docker。
下载地址请参见 Mac with Apple chip。
重启电脑或者 Docker。
重新 pull 一下脚手架代码。
在
go-plugin
目录执行以下命令:git pull
开源 Mesh demo 编译问题
当编译 sofastack-mesh-demo 遇到无法拉取 JAR 问题,报错如下:
[ERROR] Non-resolvable import POM:
Could not transfer artifact com.alipay.sofa:sofaboot-enterprise-dependencies:pom:3.2.2
from/to maven-default-http-blocker (http://0.0.0.0/): Blocked mirror for repositories:
[alipay-cloud-server@public (http://mvn.cloud.alipay.com/nexus/content/groups/open,
default, releases)] @ line 23, column 25
请将 settings.xml 文件放置到 ~/.m2/
目录中重新编译。