在 GKE 上安装 kiali 会出现后端 NotFound 错误

San*_*ana 4 google-kubernetes-engine istio kiali

我已经安装了 kiali 运算符并尝试从 Ingress 上的 URL(xxxx/kiali) 加载 UI。以下是我在加载网址时收到的文本。

响应 404(后端 NotFound),[ /kiali/ ] 的服务规则不存在

我的所有集群组件都是绿色的,如下所示。任何想法 ?

在此输入图像描述

Vin*_*Yin 6

我遇到了同样的问题,最后成功了。经过一些比较测试和大量的困惑之后,以下是发生的情况以及如何解决它:

  1. 最新的官方 istio 1.7.4 教程pathType提供了一个示例 ingress yaml,其中包含一个仅在 GKE 1.18 及更高版本上可用的新属性:
kind: Ingress
...
  - host: my-kiali.io
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          serviceName: kiali
          ...
Run Code Online (Sandbox Code Playgroud)

现在,GKE 1.18 仅在 GCP 的 RAPID 发布渠道中可用。对于 GCP 控制台中默认的 REGULAR 通道,目前最高版本为 GKE 1.17。如果是这样,很明显会注意到并修复,因为 1.17kubectl apply会抱怨语法错误。不明显的是,在 1.17 及更早版本中,我们需要附加一个通配符,path以便它显示:

      - path: /*
Run Code Online (Sandbox Code Playgroud)

如果没有通配符*ingress将向浏览器返回您提到的错误消息(此请求的 HTTP 回复状态代码确实是文本正文中建议的 404):

response 404 (backend NotFound), service rules for [ /kiali/ ] non-existent 
Run Code Online (Sandbox Code Playgroud)

这是简单的部分,可以回答您的问题(希望如此)。现在进入下一个问题,尽管它并不是您问题的一部分......

  1. 假设我们已经解决了问题 1。我们现在使用 部署入口kubectl apply ...。然后,我们需要等待几分钟,让 GCP 创建外部负载均衡器。各种互联网文献都说要等到分配外部IP地址——您可以在负载均衡器的GCP控制台上检查,或者:
$ kubectl describe ingress istio-system -n istio-system | grep Address
Run Code Online (Sandbox Code Playgroud)

但我认为这还不够——而且这种现象并不局限于 Istio。分配IP地址后,您还需要进一步等待GCP报告所有后端健康检查都处于HEALTHY状态。您可以在 CLI 中检查它:

$ kubectl get ingress istio-system -n istio-system -o yaml | grep ingress.kubernetes.io/backends

    ingress.kubernetes.io/backends: '{...,"k8s1-898cbc37-istio-system-kiali-20001-dfe8fc73":"HEALTHY",...}'
Run Code Online (Sandbox Code Playgroud)

或在 GCP 控制台中:GCP 负载均衡器后端运行状况检查

额外的等待时间是多长?对我来说,从分配IP到后端健康,花了7分钟:

$ kubectl describe ingress istio-system -n istio-system
...
Events:
  Type    Reason  Age    From                     Message
  ----    ------  ----   ----                     -------
  Normal  ADD     ...    loadbalancer-controller  istio-system/istio-system
  Normal  CREATE  7m21s  loadbalancer-controller  ip: 34.120.142.25
Run Code Online (Sandbox Code Playgroud)

尽管要readinessProbe短得多:

$ cat istio-1.7.4/samples/addons/kiali.yaml
        ...
        readinessProbe:
          httpGet:
            ...
          initialDelaySeconds: 5
          periodSeconds: 30
Run Code Online (Sandbox Code Playgroud)

实际等待和等待之间的巨大差异periodSeconds可能会在操作过程中造成相当大的混乱。

当浏览器尝试访问http://my-kiali.io(顺便说一句,必须将该主机名添加到C:\Windows\System32\drivers\etc\hosts)时,浏览器在等待的不同阶段将经历以下情况:

  • 在 7 分钟等待的大部分时间(分配 IP 后),浏览器将收到 HTTP 404。请注意,这与您的问题中的错误不同。这里的 404 是第一个 URL http://my-kiali.io/的 HTTP 状态,这意味着后端不处于健康状态——HTTP 请求从未到达 Kiali pod。相比之下,您的 404 实际上前面有一个 HTTP 302(从 重定向//kiali/),这意味着后端是健康的(这就是 HTTP 302 回复/重定向的生成方式——由 Kiali pod 生成),但负载均衡器找不到重定向 URL 路径的转发规则/kiali/(因为该规则缺少通配符*)。

  • 在 7 分钟的等待即将结束时,浏览器可能会短暂收到 HTTP 502(“错误网关”)。这只是负载均衡器正在转换时的情况。

  • 7 分钟等待后,浏览器将首先收到 HTTP 302(“重定向”),该 HTTP 302 重定向自/to /kiali/,然后是 HTTP 200(成功重定向后)。Kiali GUI 控制台成功显示在浏览器上。

问题解决了!

PS:如果您确实遵循 Istio官方教程,您可能会遇到其他 2 个(不相关的)错误:

a)timeoutSeconds对比periodSeconds

Error during sync: error running backend syncing routine: googleapi: Error 400: Invalid value for field 'resource.timeoutSec': '30'. TimeoutSec should be less than checkIntervalSec., invalid
Run Code Online (Sandbox Code Playgroud)

解决方案是编辑所有内容,istio-1.7.4/samples/addons/*.yaml使其timeoutSeconds小于periodSeconds

b)servicePort进入my-istio-tracing.io本教程kind: Ingress中显示的示例的端口号错误。正确的端口号应该是:80

response 404 (backend NotFound), service rules for [ /kiali/ ] non-existent 
Run Code Online (Sandbox Code Playgroud)