为 GKE Kubernetes API 启用 CORS

为 GKE Kubernetes API 启用 CORS

我在 Google Cloud Platform 中设置了一个 Kubernetes Engine 集群,它运行良好。我可以使用运行时看到的 Kubernetes Master 的基于 IP 的 URL 查询 Kubernetes API 本身以获取有关 Kubernetes 对象的信息kubectl cluster-info

我想为技术水平较低的用户创建一个简单的仪表板,从 Kubernetes API 中提取信息,这是在客户端完成的(使用 React)。但是,我只有基于 IP 的端点,所以我的请求被 CORS 策略阻止。我该如何简单地解决这个问题?

我知道如果我拥有该集群,我将能够更新 kube-apiserver.yaml 以提供更宽松的值--cors-allowed-origins,但据我所知,我无法在 GKE 中访问它。 https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/

我也尝试过在内部服务前面放置一个 Kong 代理kubernetes.default,但kubernetes.default它使用 Kong 不信任的自签名证书进行保护。我是否应该将 Kong 指向 Kubernetes Master IP,即使它不在集群内部?我正在使用 Kong Ingress Controller,所以我不知道是否可以将其指向“外部”端点,如 Kubernetes Master IP。我可以尝试为此启动一项服务,但不想在没有一些建议的情况下陷入困境。 https://github.com/Kong/kubernetes-ingress-controller

我还考虑过编写自己的适配器,路由kubernetes.default并使用 Kubernetes 将注入的证书颁发机构文件。我认为这可行,但要让它与watch端点的服务器发送事件一起工作会很麻烦,而且我认为这比我应该付出的努力要多。

我很惊讶这不是一个更常见的问题,这让我觉得我在做一些不寻常的事情。我很想看看通过 Kubernetes API 编写的仪表板的示例。

答案1

据我所知,没有办法为 GKE 启用 CORS。您可以尝试使用代理方法。在这种情况下,您可以将 GKE 主服务器的 CA 注入代理正在运行的容器中的根 CA。通常,最好编写一个小型包装器,仅公开所需的 Kubernetes API。

因此,由于 CORS 不在考虑范围内,您也可以尝试通过 Kubernetes apiserver 代理使用仪表板。我的意思是,您可以将服务公开为 ClusterIP 并通过代理访问它,如下例所示:

https://masterIP/api/v1/namespaces/default/services/testapp-foo-lb:80/proxy/

因此,您不会遇到 CORS 问题,因为主服务器和服务位于同一个域上。

相关内容