Mesh 常见问题

更新时间:

本文汇总了使用服务网格时可能遇到的常见问题及解决方案。

服务网格目前支持的微服务框架有哪些?

服务网格目前支持 Dubbo、SpringCloud 等主流微服务框架。

XDS 配置不下发

问题原因:Pilot 未启动或 Pilot 与 MOSN 网络不通。

解决方案:

  1. 查看 MOSN 连接 Pilot 是否正常。

    进入 MOSN 容器,执行如下命令,如果和pilot没有链接则检查pilot的地址是否填写正确

    netstat -na | grep 15050
  2. 进到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
    
  3. 查看 MOSN 是否接收到配置。

    若 Pilot Pod 未启动,则等待 Pilot 启动,MOSN 有自动重连机制,不需要修改。

    等待日志输出如下内容,则连接恢复正常。

    [xds] [sds subscriber] stream client reconnected

服务注册的提供者的版本号丢失

在 k8s 服务上查看应用 YAML 上是否打上 app.kubernetes.io/version: 1.0.0 Label。

    服务限流未生效

    服务限流生效链路:DsrConsole > DRM > MOSN。

    1. 首先登录微服务控制台,检查限流规则配置是否正确。

      限流方向选择客户端时,需填写客户端的应用,表示在客户端侧进行限流;限流方向在服务端时,需填写服务端的应用,表示在服务端进行限流。

    2. 查看 DRM 是否推送了限流规则。

      下图表示推送了限流规则:Image 10

    3. 查看 MOSN 和 DRM 连接是否正常。

      以客户端限流为例,输入命令如下:

      kubectl exec -it crpc-client-2-5747cf49db-q9mnn -c mosn-sidecar-container bash
      netstat -nalp |grep 9880

      出现类似下图内容,表示 MOSN 和 DRM 已经建立连接。mv

    4. 查看 MOSN 是否收到限流规则。

      打开 MOSN 的 /home/admin/logs/mosn/drm.access.log 日志文件,查找关键字 RateLimit

      grep -irn "RateLimit" *.log
      限流日志
    5. 如果未收到限流规则,则检查 DsrConsole 与 DRM 的连接是否正常。

      netstat -nalp |grep 9880

      若连接正常,但是未收到限流规则,检查 MOSN 配置的租户信息是否和 DsrConsole 里面的租户信息对应。如果不对应,则修改为 MOSN 里面的租户。

    服务熔断未生效

    服务熔断生效链路:DsrConsole > DRM > MOSN。

    1. 首先登录微服务控制台,检查熔断规则配置是否正确。

      熔断方向选择客户端的话需填写客户端的应用,表示在客户端侧进行熔断,熔断方向在服务端的话需填写服务端的应用,表示在服务端进行熔断。

    2. 查看 DRM 是否推送了熔断规则。

      下图中表示推送了熔断规则。34

    3. 查看 MOSN 和 DRM 连接是否正常。

      以客户端侧熔断为例,输入命令如下:

      kubectl exec -it crpc-client-2-5747cf49db-q9mnn -c mosn-sidecar-container bash
      netstat -nalp |grep 9880

      出现类似下图内容,表示 MOSN 和 DRM 已经建立连接。35

    4. 查看 MOSN 是否接收到了熔断规则。

      打开 MOSN 的 /home/admin/logs/mosn/drm.access.log 日志文件,查找关键字 circuitBreakerRules

      grep -irn "circuitBreakerRules" *.log
      熔断
    5. 如果未收到熔断规则,则检查 DsrConsole 与 DRM 的连接是否正常。

      netstat -na | grep 9880

      若连接正常,但是未收到熔断规则,检查 MOSN 配置的租户信息是否和 DsrConsole 里面的租户信息对应。如果不对应,则修改为 MOSN 里面的租户。

    服务降级未生效

    服务降级生效链路:DSRConsole > DRM > MOSN。

    1. 首先登录微服务控制台,检查服务降级规则配置是否正确。

      服务降级发生在客户端,请检查配置项是否填写正确(检查应用、服务、方法)。

    2. 检查 DRM 是否推送了降级规则。

      下图表示 DRM 收到了降级规则。32

    3. 查看 MOSN 和 DRM 连接是否正常。

      kubectl exec -it crpc-client-2-5747cf49db-q9mnn -c mosn-sidecar-container bash
      netstat -nalp |grep 9880

      出现类似下图内容,表示 MOSN 和 DRM 已经建立连接。35

    4. 查看 MOSN 是否收到了降级规则。

      打开 MOSN 的 /home/admin/logs/mosn/drm.access.log 日志文件,查找关键字 downgradeRule

      grep -irn "downgradeRule" *.log

      下图表示 MOSN 收到了降级规则。降级

    5. 如果未收到降级规则,则检查 DsrConsole 与 DRM 的连接是否正常。

      netstat -na | grep 9880

      若连接正常,但是未收到降级规则,检查 MOSN 配置的租户信息是否和 DsrConsole 里面的租户信息对应。如果不对应,则修改为 MOSN 里面的租户。

    故障注入未生效

    故障注入可能发生在客户端,也可能发生在服务端,通常用来注入一段时间异常或者直接注入异常。注入规则没生效时,先检查自己的注入规则是否配置正确,如客户端注入需填写客户端的应用名,服务端注入需填写服务端的应用名。

    故障注入生效链路:DSRConsole > DRM > MOSN。

    1. 首先登录微服务控制台,检查故障注入规则配置是否正确。

    2. 检查 DRM 是否推送了故障注入规则。

      下图表示 DRM 推送了规则。30

    3. 查看 MOSN 和 DRM 连接是否正常。

      kubectl exec -it crpc-client-2-5747cf49db-q9mnn -c mosn-sidecar-container bash
      netstat -nalp |grep 9880

      出现类似下图内容,表示 MOSN 和 DRM 已经建立连接。55

    4. 查看 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。

    1. 首先登录微服务控制台,检查故障隔离规则配置是否正确。

      例如下图就是错误的配置:异常比例阈值 * 异常比例倍数 = 200,最大的出错上限是 100。Image 13

    2. 观察 DRM 是否推送了故障隔离规则。

      下图表示推送了规则。26

    3. 查看 MOSN 和 DRM 连接是否正常。

      kubectl exec -it crpc-client-2-5747cf49db-q9mnn -c mosn-sidecar-container bash
      netstat -nalp |grep 9880

      出现类似下图内容,表示 MOSN 和 DRM 已经建立连接。35

    4. 查看 MOSN 是否收到了故障隔离规则。

      打开 MOSN 的 /home/admin/logs/mosn/drm.access.log 日志文件,查找关键字 faultToleranceRules

      grep -irn "faultToleranceRules" *.log

      下图表示 MOSN 收到了故障隔离规则。77

    5. 如果未收到隔离规则,则检查 DsrConsole 与 DRM 的连接是否正常。

      netstat -na | grep 9880

      若连接正常,但是未收到降级规则,检查 MOSN 配置的租户信息是否和 DsrConsole 里面的租户信息对应。如果不对应,则修改为 MOSN 里面的租户。

    服务路由未生效

    路由规则的下发顺序:

    1. 在控制台配置完成后,先调用 DsrConsole 将规则发送给 Cloudmesh OpenAPI。

    2. OpenAPI 把配置写入 k8s APIServer。

    3. Pilot 监听 k8s APIServer 中的配置信息变化,然后把配置信息发送给客户端的 MOSN。

    您可以按路由下发顺序倒着检查:

    1. 查看路由规则是否下发到 MOSN。

      进入 MOSN,输入以下命令查看日志文件,检查路由规则是否下发。

      kubectl exec -it crpc-client-1-84d49d4468-sbtc5 -c mosn-sidecar-container bash
      说明

      crpc-client-1-84d49d4468-sbtc5 代表客户端的 Pod 名称,执行时要修改为当前客户端的 Pod 名称。

      下图表示路由规则已经下发。28

    2. 执行 kubectl get virtualservice -n default 命令,查看路由规则是否下发到 k8s APIServer

      说明

      virtualservice 是自定义的内容,执行时可根据实际情况进行修改。

      下图表示内容已经下发。27

    3. 执行 netstat -an|grep 15050 命令,查看 MOSN 和 Pilot 是否建立长连接。

      下图表示建立了长连接。03

    4. 执行 kubectl get pod -n cloudmesh -o wide 命令,检查 Pilot 应用和 APIServer 应用的 IP 配置的是否正确。

      下图中查看 openapi-7b794d6796-x2wp4pilot-fb4777d78-f9nml 的 IP 配置。24

      OpenAPI 需要在 DsrConsole 上进行地址配置,如下图所示:Image 21openApiUrl(OpenAPI 的地址)这个属性是将路由规则下发到 OpenApI,Pilot 地址需要在发布应用的 YAML 文件中配置(MOSN的环境变量),配置信息如下:

      - name: PILOT_SERVER_ADDRESS
        value: 192.**.**.144
    5. 查看所有的服务列表。

      进入客户端的 MOSN 容器,输入 curl localhost:13330/servicesnapshot 命令查看所有的服务列表。Image 22如果看到的服务列表和在控制台看到的不一样,以在 MOSN 容器看到的为准。

    配置服务路由有以下注意事项:

    • 配置多条路由规则时,先匹配优先级更高的路由规则。

    • 如果开启了分流开关,当流量目的地分组没有服务实例,是否转发到其他分组。

    • 如果开启了降级开关,当前规则没有匹配的服务实例时,是否继续匹配其它规则。

    • 如果全都匹配不上,路由规则就会失效,就会优先选择本 Zone 的服务实例( Zone 信息在发布应用的 YAML 文件中)。

    • 删除一个开启的路由规则,客户端随机选择一台服务端进行调用。

    • 流量精确匹配,先根据服务实例属性进行流量过滤,过滤之后的流量再按照流量目的地进行路由。

    • 多条服务实例分组条件是与的关系(需要同时满足)。

      p33
    • 如果为同一个应用、同一个接口服务重复配置多条规则,页面上会显示到一起。

    • 如果路由粒度配置成应用级,可以在手写模式下填星号(*),或者在选择模式下,选择全部服务。

    服务鉴权未生效

    服务鉴权生效链路 DSRConsole > Clioudmesh OpenAPI > 写入 APIServer > Pilot 监听 CR 资源变化 > 把鉴权规则下发到 MOSN。

    8

    排查时按照生效链路倒着排查:

    1. 进入 DSRConsole 机器输入 env | grep auth.dispatch.target.sigma 命令查看环境变量。

      如果没有需要加上环境变量 -Dauth.dispatch.target.sigma=true

    2. 输入如下命令,打开 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"
      }'

    3. 进入 /home/admin/logs/mosn 目录,执行 grep 'mosnrbac' *.log 命令。

      如果出现类似如下日志,说明鉴权规则已经下发到了 MOSN。鉴权没生效的话,需要检查自己配置的规则是否正确。mv 如果 MOSN 没有收到鉴权规则,往下继续检查。

    4. 检查和 Pilot 连接是否正常。

      • 如果出现类似下图内容,说明和 Pilot 连接正常。36

      • 如果和 Pilot 连接不正常,查看 Pilot 地址是否正确。

        • 如果 Pilot 地址不正确,将 Pilot 地址修改正确。

        • 如果 Pilot 地址正确,往下继续检查。

    5. 在控制台里输入以下命令,查看 MOSN RbacConfig 资源。查看 CR 是否下发到 k8s APIServer

      kubectl get mosnrbacconfigs -n default --sort-by=.metadata.creationTimestamp | tail -n +2
      • 如果出现类似下图内容,说明资源已经下发到了 k8s API Server。注意最新时间。

        33
      • 如果 k8s 里没有资源,往下继续检查。

    6. 查看 DSRConsole 控制台动态配置 OpenAPI 地址是否配置正确。

      30
      • 如果 OpenAPI 地址不正确,将 OpenAPI 地址修改正确。

      • 如果 OpenAPI 地址正确,往下继续检查。

    7. 进入 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 数据未采集成功

    1. 查看 Prometheus 是否正确的配置了 业务采集 的地址。

    2. 执行 kubectl get po -o yaml 查看是否打上对应 Annotations。

    3. 执行 curl podip:34903/metrics 查看是否有指标输出。

    如何查看容器内发布的服务

    1. 本地进入 MOSN 容器:

      docker exec -it mosn-container bash
    2. 在 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 芯片

    1. 安装 rosetta。

      m1 芯片电脑需要安装 rosetta,命令如下:

      softwareupdate --install-rosetta --agree-to-license
    2. 安装 Mac 版 Docker。

      下载地址请参见 Mac with Apple chip

    3. 重启电脑或者 Docker。

    4. 重新 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/ 目录中重新编译。