3

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

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

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

在此处输入图像描述

4

1 回答 1

4

我遇到了同样的问题,终于让它工作了。经过一些比较测试和很多困惑之后,这是发生了什么以及如何解决它:

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

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

      - path: /*

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

response 404 (backend NotFound), service rules for [ /kiali/ ] non-existent 

这是简单的部分,并回答了您的问题(希望如此)。现在进入下一个问题,虽然它不是你问题的一部分......

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

但我认为这还不够——而且这种现象不仅限于 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",...}'

或在 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

尽管readinessProbe要短得多:

$ cat istio-1.7.4/samples/addons/kiali.yaml
        ...
        readinessProbe:
          httpGet:
            ...
          initialDelaySeconds: 5
          periodSeconds: 30

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

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

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

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

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

问题解决了!

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

一)timeoutSecondsperiodSeconds

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

解决方案是编辑 allistio-1.7.4/samples/addons/*.yaml使其timeoutSeconds小于periodSeconds.

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

  - host: my-istio-tracing.io
    http:
      paths:
      - ...
        backend:
          ...
          servicePort: 9411  # <<=== This should be 80.
于 2020-11-13T04:07:34.247 回答