首页 > 解决方案 > 如何对与 Kubernetes 服务的通信进行故障排除

问题描述

设置 jaeger 跟踪...所以以前我有一个二进制可执行文件 (jaeger-agent) 在 Linux CentOS 8 机器上与服务器端应用程序一起运行。跟踪跨度被发送到端口 14250 上的 jaeger-collector 服务(由 kubernetes 设置),并且一切正常。然后最近由于系统崩溃,我们不得不重新启动 jaeger 跟踪服务。现在一切都停止了,从日志中可以看到“504 网关超时”,并且代理无法再与收集器通信。

在 AWS 中,我们运行了一个 kubernetes 服务“jaeger-collector”,它符合这里的服务 https://github.com/jaegertracing/jaeger-kubernetes/blob/master/jaeger-production-template.yml唯一的区别是我使用的是 1.16 版。

该服务没有外部IP。如何使用curljaeger-collector 服务测试通信?还是我需要一个外部 IP,也许这就是网关超时的原因?我尝试curl与 ClusterIP 一起使用,但这似乎不起作用。

标签: kubernetesjaeger

解决方案


我尝试在 Kubernetes 1.16 集群上应用您的文件,但存在几个问题:

  1. 它使用在 Kubernetes 1.16中被弃用的 apiVersions 。ie-apiVersion: extensions/v1beta1应该变成apps/v1.
  2. Deployment 没有任何选择器,Daemonset 也没有。

.spec.selector 字段定义了 Deployment 如何找到要管理的 Pod。

看起来你正在应用一些超级旧的东西。Kubernetes 在其文档中记录了以下内容,所以我想知道这是否适用于默认选择器的旧版本 Kubernetes。

从 Kubernetes 1.8 开始,您必须指定与 .spec.template 的标签匹配的 pod 选择器。Pod 选择器在留空时将不再默认。

看来您应该采用一种新方法——环顾四周,我在这里这里找到了一些很好的教程,Jaeger 自己在这里也提供了类似的方法。他们都使用Kubernetes Operators

Kubernetes 操作员是一个特定于应用程序的控制器,它扩展了 Kubernetes API 的功能,以代表 Kubernetes 用户创建、配置和管理复杂应用程序的实例

我不知道您所说的“所以以前我有一个二进制可执行文件(jaeger-agent)在 Linux CentOS 8 机器上与服务器端应用程序一起运行”

您正在应用的文件看起来像是将代理部署为 daemonset,这意味着代理在集群的每个节点上作为 pod 运行。如果它在您的 k8 集群中运行,那么这就是我通常处理 kubernetes 服务故障排除的方式。如果它完全在集群外部运行,那么您需要确保它与之通信的服务暴露在集群外部,可能使用类型 LoadBalancer。


推荐阅读