查看原文
其他

Istio Service Mesh中的Envoy和Pilot调试指南

ServiceMesher 几米宋 2022-09-06

作者:John A. Joyce 译者:狄卫华

原文地址:https://preliminary.istio.io/zh/help/ops/traffic-management/proxy-cmd/

本文来自 Istio 官方中文文档(由 ServiceMesher 社区翻译)。如果您对该文档有任何问题,欢迎提出建议和贡献,https://preliminary.istio.io/zh/about/contribute/

手机浏览本文可能会遇到代码格式错乱,请点击阅读原文阅读官方文档。

此任务演示如何使用 proxy-statusproxy-config 命令。 proxy-status 命令允许您获取网格的概述并识别导致问题的代理。然后, proxy-config 可用于检查 Envoy 配置并用于问题排查。

开始之前

  • 部署 Istio 和 Bookinfo 的 Kubernetes 集群(例如,如安装步骤和 Bookinfo 安装步骤中所述使用 istio.yaml 安装)。

或者

  • 对于您在 Kubernetes 集群中运行的应用运行类似的命令。

网格概览

proxy-status 命令允许您获取网格的概述。如果你怀疑其中一个 sidecar 没有收到配置或不同步,那么代理状态会通知你。

  1. $ istioctl proxy-status

  2. PROXY                                                  CDS        LDS        EDS               RDS          PILOT

  3. details-v1-6dcc6fbb9d-wsjz4.default                    SYNCED     SYNCED     SYNCED (100%)     SYNCED       istio-pilot-75bdf98789-tfdvh

  4. istio-egressgateway-c49694485-l9d5l.istio-system       SYNCED     SYNCED     SYNCED (100%)     NOT SENT     istio-pilot-75bdf98789-tfdvh

  5. istio-ingress-6458b8c98f-7ks48.istio-system            SYNCED     SYNCED     SYNCED (100%)     NOT SENT     istio-pilot-75bdf98789-n2kqh

  6. istio-ingressgateway-7d6874b48f-qxhn5.istio-system     SYNCED     SYNCED     SYNCED (100%)     SYNCED       istio-pilot-75bdf98789-n2kqh

  7. productpage-v1-6c886ff494-hm7zk.default                SYNCED     SYNCED     SYNCED (100%)     STALE        istio-pilot-75bdf98789-n2kqh

  8. ratings-v1-5d9ff497bb-gslng.default                    SYNCED     SYNCED     SYNCED (100%)     SYNCED       istio-pilot-75bdf98789-n2kqh

  9. reviews-v1-55d4c455db-zjj2m.default                    SYNCED     SYNCED     SYNCED (100%)     SYNCED       istio-pilot-75bdf98789-n2kqh

  10. reviews-v2-686bbb668-99j76.default                     SYNCED     SYNCED     SYNCED (100%)     SYNCED       istio-pilot-75bdf98789-tfdvh

  11. reviews-v3-7b9b5fdfd6-4r52s.default                    SYNCED     SYNCED     SYNCED (100%)     SYNCED       istio-pilot-75bdf98789-n2kqh

如果此列表中缺少代理,则表示它当前未连接到 Pilot 实例,因此不会接收任何配置。

  • SYNCED 表示 Envoy 已经确认了 Pilot 上次发送给它的配置。

  • SYNCED(100%) 表示 Envoy 已经成功同步了集群中的所有端点。

  • NOT SENT 表示 Pilot 没有发送任何信息给 Envoy。这通常是因为 Pilot 没有任何数据可以发送。

  • STALE 表示 Pilot 已向 Envoy 发送更新但尚未收到确认。这通常表明 Envoy 和 Pilot 之间的网络存在问题或 Istio 本身的错误。

检索 Envoy 和 Istio Pilot 之间的差异

proxy-status 命令还可用于通过提供代理 ID 来检索 Envoy 已加载的配置与 Pilot 要发送的配置之间的差异。这可以帮助您准确定位不同步的内容及其问题所在。

  1. $ istioctl proxy-status details-v1-6dcc6fbb9d-wsjz4.default

  2. --- Pilot Clusters

  3. +++ Envoy Clusters

  4. @@ -374,36 +374,14 @@

  5.             "edsClusterConfig": {

  6.                "edsConfig": {

  7.                   "ads": {

  8.                   }

  9.                },

  10.                "serviceName": "outbound|443||public-cr0bdc785ce3f14722918080a97e1f26be-alb1.kube-system.svc.cluster.local"

  11. -            },

  12. -            "connectTimeout": "1.000s",

  13. -            "circuitBreakers": {

  14. -               "thresholds": [

  15. -                  {

  16. -

  17. -                  }

  18. -               ]

  19. -            }

  20. -         }

  21. -      },

  22. -      {

  23. -         "cluster": {

  24. -            "name": "outbound|53||kube-dns.kube-system.svc.cluster.local",

  25. -            "type": "EDS",

  26. -            "edsClusterConfig": {

  27. -               "edsConfig": {

  28. -                  "ads": {

  29. -

  30. -                  }

  31. -               },

  32. -               "serviceName": "outbound|53||kube-dns.kube-system.svc.cluster.local"

  33.             },

  34.             "connectTimeout": "1.000s",

  35.             "circuitBreakers": {

  36.                "thresholds": [

  37.                   {

  38.                   }

  39. Listeners Match

  40. Routes Match

在这里,您可以看到监听器和路由匹配但集群并不同步。

Envoy 配置深度解析

proxy-config 命令可用于查看给定的 Envoy 实例的配置方式。然后,可以通过查看 Istio 配置和自定义资源来查明无法检测到的任何问题。要获取给定 pod 的集群、监听器或路由的基本摘要,请使用以下命令(在需要时更改监听器或路由的集群):

  1. $ istioctl proxy-config clusters -n istio-system istio-ingressgateway-7d6874b48f-qxhn5

  2. SERVICE FQDN                                                                     PORT      SUBSET     DIRECTION     TYPE

  3. BlackHoleCluster                                                                 -         -          -             STATIC

  4. details.default.svc.cluster.local                                                9080      -          outbound      EDS

  5. heapster.kube-system.svc.cluster.local                                           80        -          outbound      EDS

  6. istio-citadel.istio-system.svc.cluster.local                                     8060      -          outbound      EDS

  7. istio-citadel.istio-system.svc.cluster.local                                     9093      -          outbound      EDS

  8. istio-egressgateway.istio-system.svc.cluster.local                               80        -          outbound      EDS

  9. ...

为了调试 Envoy,您需要了解 Envoy 集群/监听器/路由/端点以及它们之间如何进行交互。我们将使用带有 -o json 和过滤标志的 proxy-config 命令来跟踪 Envoy 以确定将请求从 productpage pod 发送到了 reviews:9080 的 reviews pod 上。

1. 如果您在 pod 上查询监听器摘要,您会注意到 Istio 会生成以下监听器:

  • 0.0.0.0:15001 上的监听器接收进出 pod 的所有流量,然后将请求移交给虚拟监听器。

  • 每个 service IP 一个虚拟监听器,每个出站 TCP/HTTPS 流量一个非 HTTP 监听器。

  • 每个 pod 入站流量暴露的端口一个虚拟监听器。

  • 每个 出站 HTTP 流量的 HTTP 0.0.0.0 端口一个虚拟监听器。

  1.   $ istioctl proxy-config listeners productpage-v1-6c886ff494-7vxhs

  2.   ADDRESS            PORT      TYPE

  3.   172.21.252.250     15005     TCP <--+

  4.   172.21.252.250     15011     TCP    |

  5.   172.21.79.56       42422     TCP    |

  6.   172.21.160.5       443       TCP    |

  7.   172.21.157.6       443       TCP    |

  8.   172.21.117.222     443       TCP    |

  9.   172.21.0.10        53        TCP    |

  10.   172.21.126.131     443       TCP    |   Receives outbound non-HTTP traffic for relevant IP:PORT pair from listener `0.0.0.0_15001`

  11.   172.21.160.5       31400     TCP    |

  12.   172.21.81.159      9102      TCP    |

  13.   172.21.0.1         443       TCP    |

  14.   172.21.126.131     80        TCP    |

  15.   172.21.119.8       443       TCP    |

  16.   172.21.112.64      80        TCP    |

  17.   172.21.179.54      443       TCP    |

  18.   172.21.165.197     443       TCP <--+

  19.   0.0.0.0            9090      HTTP <-+

  20.   0.0.0.0            8060      HTTP   |

  21.   0.0.0.0            15010     HTTP   |

  22.   0.0.0.0            15003     HTTP   |

  23.   0.0.0.0            15004     HTTP   |

  24.   0.0.0.0            9093      HTTP   |   Receives outbound HTTP traffic for relevant port from listener `0.0.0.0_15001`

  25.   0.0.0.0            15007     HTTP   |

  26.   0.0.0.0            8080      HTTP   |

  27.   0.0.0.0            9091      HTTP   |

  28.   0.0.0.0            9080      HTTP   |

  29.   0.0.0.0            80        HTTP <-+

  30.   0.0.0.0            15001     TCP    // Receives all inbound and outbound traffic to the pod from IP tables and hands over to virtual listener

  31.   172.30.164.190     9080      HTTP   // Receives all inbound traffic on 9080 from listener `0.0.0.0_15001`

2. 从上面的摘要中可以看出,每个 sidecar 都有一个绑定到 0.0.0.0:15001 的监听器,IP tables 将 pod 的所有入站和出站流量路由到这里。此监听器把 useOriginalDst 设置为 true,这意味着它将请求交给最符合请求原始目标的监听器。如果找不到任何匹配的虚拟监听器,它会将请求发送给返回 404 的 BlackHoleCluster


  1.   $ istioctl proxy-config listeners productpage-v1-6c886ff494-7vxhs --port 15001 -o json

  2.   {

  3.       "name": "virtual",

  4.       "address": {

  5.           "socketAddress": {

  6.               "address": "0.0.0.0",

  7.               "portValue": 15001

  8.           }

  9.       },

  10.       "filterChains": [

  11.           {

  12.               "filters": [

  13.                   {

  14.                       "name": "envoy.tcp_proxy",

  15.                       "config": {

  16.                           "cluster": "BlackHoleCluster",

  17.                           "stat_prefix": "BlackHoleCluster"

  18.                       }

  19.                   }

  20.               ]

  21.           }

  22.       ],

  23.       "useOriginalDst": true

  24.   }

3. 我们的请求是到 9080 端口的 HTTP 出站请求,这意味着它被切换到 0.0.0.0:9080 虚拟监听器。然后,此监听器在其配置的 RDS 中查找路由配置。在这种情况下,它将查找由 Pilot 配置的 RDS 中的路由 9080(通过 ADS)。

  1.   $ istioctl proxy-config listeners productpage-v1-6c886ff494-7vxhs -o json --address 0.0.0.0 --port 9080

  2.   ...

  3.   "rds": {

  4.       "config_source": {

  5.           "ads": {}

  6.       },

  7.       "route_config_name": "9080"

  8.   }

  9.   ...

4. 9080 路由配置仅为每个服务提供虚拟主机。我们的请求正在前往 reviews 服务,因此 Envoy 将选择我们的请求与域匹配的虚拟主机。一旦在域上匹配,Envoy 会查找与请求匹配的第一条路径。在这种情况下,我们没有任何高级路由,因此只有一条路由匹配所有内容。这条路由告诉 Envoy 将请求发送到 outbound|9080||reviews.default.svc.cluster.local 集群。

  1.   $ istioctl proxy-config routes productpage-v1-6c886ff494-7vxhs --name 9080 -o json

  2.   [

  3.       {

  4.           "name": "9080",

  5.           "virtualHosts": [

  6.               {

  7.                   "name": "reviews.default.svc.cluster.local:9080",

  8.                   "domains": [

  9.                       "reviews.default.svc.cluster.local",

  10.                       "reviews.default.svc.cluster.local:9080",

  11.                       "reviews",

  12.                       "reviews:9080",

  13.                       "reviews.default.svc.cluster",

  14.                       "reviews.default.svc.cluster:9080",

  15.                       "reviews.default.svc",

  16.                       "reviews.default.svc:9080",

  17.                       "reviews.default",

  18.                       "reviews.default:9080",

  19.                       "172.21.152.34",

  20.                       "172.21.152.34:9080"

  21.                   ],

  22.                   "routes": [

  23.                       {

  24.                           "match": {

  25.                               "prefix": "/"

  26.                           },

  27.                           "route": {

  28.                               "cluster": "outbound|9080||reviews.default.svc.cluster.local",

  29.                               "timeout": "0.000s"

  30.                           },

  31.   ...


5. 此集群配置为从 Pilot(通过 ADS)检索关联的端点。因此,Envoy 将使用 serviceName 字段作为密钥来查找端点列表并将请求代理到其中一个端点。

  1.   $ istioctl proxy-config clusters --fqdn reviews.default.svc.cluster.local -o json

  2.   [

  3.       {

  4.           "name": "outbound|9080||reviews.default.svc.cluster.local",

  5.           "type": "EDS",

  6.           "edsClusterConfig": {

  7.               "edsConfig": {

  8.                   "ads": {}

  9.               },

  10.               "serviceName": "outbound|9080||reviews.default.svc.cluster.local"

  11.           },

  12.           "connectTimeout": "1.000s",

  13.           "circuitBreakers": {

  14.               "thresholds": [

  15.                   {}

  16.               ]

  17.           }

  18.       }

  19.   ]

检查 Bootstrap 配置

到目前为止,我们已经查看了(主要)从 Pilot 检索到的配置,但是 Envoy 需要一些引导程序配置,其中包含可以找到 Pilot 的信息。要查看此内容,请使用以下命令:

  1. $ istioctl proxy-config bootstrap -n istio-system istio-ingressgateway-7d6874b48f-qxhn5

  2. {

  3.    "bootstrap": {

  4.        "node": {

  5.            "id": "router~172.30.86.14~istio-ingressgateway-7d6874b48f-qxhn5.istio-system~istio-system.svc.cluster.local",

  6.            "cluster": "istio-ingressgateway",

  7.            "metadata": {

  8.                    "POD_NAME": "istio-ingressgateway-7d6874b48f-qxhn5",

  9.                    "istio": "sidecar"

  10.                },

  11.            "buildVersion": "0/1.8.0-dev//RELEASE"

  12.        },

  13. ...





点击【阅读原文】可以直接访问文中的链接。


社区网址:http://www.servicemesher.com

Slack:https://servicemesher.slack.com 需要邀请才能加入,有志于加入ServiceMesher社区为Service Mesh作出贡献的同学可以联系我。

Twitter: https://twitter.com/servicemesher

欢迎大家加入ServiceMesher社区,并在本公众号上踊跃投稿,投稿方式请访问:https://github.com/servicemesher/trans


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存