在多集群环境下,您可能希望通过 OAuth2-Proxy 代理访问不同集群中的 Prometheus 端点,以实现统一认证和管理。下面介绍如何配置 OAuth2-Proxy 实现跨集群代理 Prometheus。

实现原理

如架构所示,用户请求会先到 OAuth2-Proxy 的 OpenRestry 服务, 通过 /oauth 接口进行认证,OAauth2-Proxy 收到请求后会向 Auth Provider 进行认证(也就是 KubeSphere),认证通过后,会根据请求转发到 KubeSphere APIServer, KubeSphere 会根据集群前缀选择集群,通过 ReverseProxy 功能将请求转发到目标集群的 Prometheus 服务,实现跨集群访问。

cross cluster proxy

ReverseProxy 是 KubeSphere 提供的反向代理功能,提供灵活的 API 反向代理声明,支持 rewrite、redirect、请求头注入、熔断、限流等配置。 通过 ReverseProxy,可以实现跨集群访问。

ReverseProxy 配置示例:

apiVersion: extensions.kubesphere.io/v1alpha1
kind: ReverseProxy
metadata:
  labels:
    app.kubernetes.io/managed-by: Helm
    kubesphere.io/extension-ref: whizard-monitoring
  name: prometheus
spec:
  directives:
    headerUp:
    - -Authorization
    stripPathPrefix: /proxy/prometheus.io
  matcher:
    method: '*'
    path: /proxy/prometheus.io/*
  upstream:
    url: http://prometheus-k8s.kubesphere-monitoring-system.svc:9090
status:
  state: Available
说明

安装 WizTelemetry 监控扩展组件后,会自动创建 ReverseProxy 资源。

配置步骤

1. 前提条件

  • 扩展组件 OAuth2-Proxy 版本 ≥ 7.6.3

  • 已安装 WizTelemetry 监控扩展组件。

  • 已按照 OAuth2-Proxy 配置并访问服务做好基础配置,并验证服务可用。

  • 登录用户需有目标集群的访问权限(已验证 cluster-admin 角色用户可访问,由于访问传递了用户 Token,需要用户具备可访问目标集群的 ReverseProxy 权限)。

2. 配置 OAuth2-Proxy 扩展组件

修改 OAuth2-Proxy 扩展组件配置,主要是在 openresty.configs 中添加对应集群 Prometheus 端点的配置。例如,若要代理名为 host 集群中的 Prometheus 端点,配置如下:

    global:
      # OAuth2-Proxy service external access address
      # For example, using NodePort, the address is http://172.31.19.4:32080,
      # using Ingress, the host is http://172.31.19.4.nip.io:80
      host: "http://172.31.19.4:32080"
    openresty:
      configs:
        - name: host prometheus
          description: host 集群 Prometheus 端点
          subPath: /clusters/host/prometheus/               # 注意这里的路径需要和 Prometheus externalUrl 保持一致
          link: /clusters/host/prometheus/query             # 页面访问地址,注意 /clusters/{cluster}
          endpoint: http://ks-apiserver.kubesphere-system.svc:80/clusters/host/proxy/prometheus.io/  # 借助 KubeSphere ReverseProxy 跨集群访问
          additional: |
            set $kubesphere_token "";
            if ($http_cookie ~* "kubesphere-token=([^;]+)") {
                set $kubesphere_token $1;
            }

            set $auth_header "";
            if ($kubesphere_token != "") {
                set $auth_header "Bearer $kubesphere_token";
            }

            proxy_set_header Authorization $auth_header;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        - name: member prometheus
          description: member 集群 Prometheus 端点
          subPath: /clusters/member/prometheus/
          link: /clusters/member/prometheus/query
          endpoint: http://ks-apiserver.kubesphere-system.svc:80/clusters/member/proxy/prometheus.io/
          additional: |
            set $kubesphere_token "";
            if ($http_cookie ~* "kubesphere-token=([^;]+)") {
                set $kubesphere_token $1;
            }

            set $auth_header "";
            if ($kubesphere_token != "") {
                set $auth_header "Bearer $kubesphere_token";
            }

            proxy_set_header Authorization $auth_header;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;

3. 配置 Prometheus externalUrl

为了确保 Prometheus 正确生成跨集群访问的链接,需要修改 Prometheus 的 externalUrl 配置,使其包含集群前缀。

修改 WizTelemetry 监控扩展组件的集群 Agent 配置。例如,对于 host 集群,配置如下:

kube-prometheus-stack:
  prometheus:
    prometheusSpec:
      externalUrl: /clusters/host/prometheus/

4. 验证访问

完成上述配置后,您可以通过 OAuth2-Proxy 页面,选择对应集群的 Prometheus 端点进行访问,系统会自动处理认证和跨集群代理请求。

cross cluster proxy result

方案说明

这是一个通用的跨集群代理方案,您可以根据需要配置其他服务的跨集群访问,只需在 OAuth2-Proxy 中添加相应的配置,并确保目标服务在 KubeSphere 中有对应的 ReverseProxy 配置即可。前提是应用支持 subPath 配置。