我正在考虑将一些 k8s 应用程序迁移到 KNative 服务,这意味着我需要使用 Istio 入口网关而不是 Traefik 入口。但是,我在尝试迁移 basicAuth HTTP 身份验证时遇到了问题,以便用户必须在请求路由到 pod 之前提供正确的用户名/密码(这是在 Traefik 中使用 Ingress 资源上的中间件注释完成的)。
理想情况下,我想在每个服务的基础上配置此身份验证层,某些服务可能不需要身份验证,某些服务需要针对不同的秘密资源进行身份验证。添加 HTTP 身份验证的好方法是什么?谢谢!
我尝试查找并发现这个文档,它配置网关与外部身份验证服务进行通信。 这个文档使用 sidecar 容器在将请求转发到实际容器之前执行身份验证。
我理解它们是如何工作的,但我只是想知道是否有更轻量级的方法来解决我遇到的这个特定问题。
如果他们允许我指定每个服务的秘密,我愿意切换到不同的身份验证方案。
更新:我尝试添加每个服务的身份验证 EnvoyFilter 来对请求标头执行检查。然而,这使得 KNative 激活器探测失败:
{"severity":"ERROR","timestamp":"2023-11-02T06:44:48.95474761Z","logger":"activator","caller":"net/revision_backends.go:398","message":"Failed to probe clusterIP 172.20.137.61:80","commit":"f60eb32","knative.dev/controller":"activator","knative.dev/pod":"activator-575d6749db-r9mdm","knative.dev/key":"kn-test/echo-server-00001","error":"unexpected status code: want [200], got 401","stacktrace":"knative.dev/serving/pkg/activator/net.(*revisionWatcher).checkDests\n\tknative.dev/serving/pkg/activator/net/revision_backends.go:398\nknative.dev/serving/pkg/activator/net.(*revisionWatcher).run\n\tknative.dev/serving/pkg/activator/net/revision_backends.go:443"}
所以到目前为止,我认为身份验证检查不应该在 KNative 的“边界”内。也许在我们的服务网格的入口点(istio 入口网关)?会进一步观察。
在探索了许多选项之后,我最终决定在 Knative 之外添加基本身份验证层。
我通过从 KnativeServing CR 中删除域名来停止向外部公开 Knative 服务,因此只能通过“svc.cluster.local”url 从集群内部访问它们。
然后,我为 Nginx 入口控制器创建了入口资源,以与内部 KNative 集群本地 url 进行通信。我可以通过设置 Ingress 注释轻松配置基本身份验证。
棘手的部分是 1. 我需要让 Ingress 指向作为 Knative 服务的一部分创建的ExternalName 服务。 2. 我需要操作“upstream-vhost”标头将主机设置为集群本地 url。
但是一旦设置完毕,这就会提供我想要的行为。如果用户未通过身份验证,则请求在 Nginx 上终止,Knative 不会进行扩容。