我已经安装了 kiali 运算符并尝试从 Ingress 上的 URL(xxxx/kiali) 加载 UI。以下是我在加载 url 时得到的文本。
响应 404(后端 NotFound),[ /kiali/ ] 的服务规则不存在
我所有的集群组件都是绿色的,如下所示。任何想法 ?
我已经安装了 kiali 运算符并尝试从 Ingress 上的 URL(xxxx/kiali) 加载 UI。以下是我在加载 url 时得到的文本。
响应 404(后端 NotFound),[ /kiali/ ] 的服务规则不存在
我所有的集群组件都是绿色的,如下所示。任何想法 ?
我遇到了同样的问题,终于让它工作了。经过一些比较测试和很多困惑之后,这是发生了什么以及如何解决它:
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
这是简单的部分,并回答了您的问题(希望如此)。现在进入下一个问题,虽然它不是你问题的一部分......
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",...}'
额外的等待时间是多久?对我来说,从分配 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 个(不相关的)错误:
一)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
解决方案是编辑 allistio-1.7.4/samples/addons/*.yaml
使其timeoutSeconds
小于periodSeconds
.
b)的入口servicePort
。my-istio-tracing.io
本教程kind: Ingress
中显示的示例具有错误的端口号。正确的端口号应该是:80
- host: my-istio-tracing.io
http:
paths:
- ...
backend:
...
servicePort: 9411 # <<=== This should be 80.