3.5. 配置 reporting-operator

reporting-operator 负责从 Prometheus 中收集数据,存储指标数据至 Presto 中,对 Presto 运行报告查询,并通过 HTTP API 显示查询结果。配置 Operator 主要通过 MeteringConfig 文件进行。

3.5.1. Prometheus 连接

在 OpenShift Container Platform 上安装 metering 时,使用 https://prometheus-k8s.openshift-monitoring.svc:9091/ 访问 Prometheus。

为保护与 Prometheus 的连接,默认 metering 安装使用 OpenShift Container Platform 的 CA。如果您的 Prometheus 实例使用了不同的 CA,则可通过 ConfigMap 来添加该 CA。请参见以下示例。

spec:
  reporting-operator:
    spec:
      config:
        prometheus:
          certificateAuthority:
            useServiceAccountCA: false
            configMap:
              enabled: true
              create: true
              name: reporting-operator-certificate-authority-config
              filename: "internal-ca.crt"
              value: |
                -----BEGIN CERTIFICATE-----
                (snip)
                -----END CERTIFICATE-----

另外,要使系统的 CA 可以支持公共的证书,请将 ServiceAccountCAconfigMap.enabled 设置为 false

此外,还可将 reporting-operator 配置为使用一个指定的 token 令牌搭配 Prometheus 进行身份验证。请参见以下示例。

spec:
  reporting-operator:
    spec:
      config:
        prometheus:
          metricsImporter:
            auth:
              useServiceAccountToken: false
              tokenSecret:
                enabled: true
                create: true
                value: "abc-123"

3.5.2. 公开 reporting API

在 OpenShift Container Platform 中,默认 metering 安装会自动公开一个路由,以提供报告 API(reporting API)。它提供以下功能:

  • 自动 DNS
  • 基于集群 CA 的自动 TLS

此外,默认安装还支持利用 OpenShift 服务来提供证书,以通过 TLS 保护报告 API。OpenShift Oauth 代理被部署为 reporting-operator 的 side-car 容器,通过身份验证来保护报告 API。

3.5.2.1. 使用 OpenShift 身份验证

报告 API 默认通过 TLS 和身份验证进行保护。可通过配置 reporting-operator 以部署包含 reporting-operator 容器和运行 OpenShift auth-proxy 的 sidecar 容器的 Pod 来实现这一目的。

要访问报告 API,Metering Operator 会公开一个路由。路由安装好后,即可运行以下命令获取该路由的主机名。

METERING_ROUTE_HOSTNAME=$(oc -n openshift-metering get routes metering -o json | jq -r '.status.ingress[].host')

下一步,设置身份验证,可使用服务帐户令牌验证,也可通过用户名/密码进行基础验证。

3.5.2.1.1. 使用服务帐户令牌进行身份验证

要使用此法,您需要在报告 Operator 的服务账户中使用令牌,并将 bearer 令牌传输至以下命令中的身份验证标头中:

TOKEN=$(oc -n openshift-metering serviceaccounts get-token reporting-operator)
curl -H "Authorization: Bearer $TOKEN" -k "https://$METERING_ROUTE_HOSTNAME/api/v1/reports/get?name=[Report Name]&namespace=openshift-metering&format=[Format]"

务必要替换上面 URL 中的 name=[Report Name]format=[Format] 参数。format 参数可为 json 、csv 或 tabular。

3.5.2.1.2. 使用用户名和密码进行身份验证

我们可使用用户名和密码组合进行基础身份验证,用户名和密码已在 htpasswd 文件的内容中指定。在默认情况下,会创建一个包括空 htpasswd 数据的 secret。您可通过配置 reporting-operator.spec.authProxy.htpasswd.datareporting-operator.spec.authProxy.htpasswd.createSecret 键来使用此法。

在 MeteringConfig 中指定了以上内容后,即可运行以下命令:

curl -u testuser:password123 -k "https://$METERING_ROUTE_HOSTNAME/api/v1/reports/get?name=[Report Name]&namespace=openshift-metering&format=[Format]"

务必将 testuser:password123 替换为有效的用户名和密码组合。

3.5.2.2. 手动配置身份验证

要手动配置身份验证,或在 report-operator 中禁用 OAuth,必须在 MeteringConfig 中设置 spec.tls.enabled: false

警告

该设置同时还禁用 report-operator、presto 和 hive 之间的所有 TLS/身份验证。您需要自行手动配置这些资源。

身份验证可通过配置以下选项来启用。启用身份验证会将 reporting-operator Pod 配置为将 OpenShift auth-proxy 作为 Pod 中的 sidecar 来运行。这样做会调整端口,以便 report-operator API 不会被直接公开,而是通过 auth-proxy sidecar 容器进行代理。

  • reporting-operator.spec.authProxy.enabled
  • reporting-operator.spec.authProxy.cookie.createSecret
  • reporting-operator.spec.authProxy.cookie.seed

您需要将 reporting-operator.spec.authProxy.enabledreporting-operator.spec.authProxy.cookie.createSecret 设置为 true,将 reporting-operator.spec.authProxy.cookie.seed 设置为 32 个字符的随机字符串。

您可使用以下命令来生成 32 个字符的随机字符串。

$ openssl rand -base64 32 | head -c32; echo.
3.5.2.2.1. 令牌身份验证

当以下选项被设置为 true 时,将针对报告 REST API 启用使用 bearer 令牌的身份验证。bearer 令牌可由服务账户或用户提供。

  • reporting-operator.spec.authProxy.subjectAccessReview.enabled
  • reporting-operator.spec.authProxy.delegateURLs.enabled

启用身份验证后,必须通过以下任一角色向用于查询该用户或 serviceAccount 报告 API 的 bearer 令牌授予访问权限:

  • report-exporter
  • reporting-admin
  • reporting-viewer
  • metering-admin
  • metering-viewer

metering-operator 可为您创建 RoleBindings,从而通过在 spec.permissions 部分指定主题列表来授予这些权限。例如,请参阅以下 advanced-auth.yaml 示例配置。

apiVersion: metering.openshift.io/v1
kind: MeteringConfig
metadata:
  name: "operator-metering"
spec:
  permissions:
    # anyone in the "metering-admins" group can create, update, delete, etc any
    # metering.openshift.io resources in the namespace.
    # This also grants permissions to get query report results from the reporting REST API.
    meteringAdmins:
    - kind: Group
      name: metering-admins
    # Same as above except read only access and for the metering-viewers group.
    meteringViewers:
    - kind: Group
      name: metering-viewers
    # the default serviceaccount in the namespace "my-custom-ns" can:
    # create, update, delete, etc reports.
    # This also gives permissions query the results from the reporting REST API.
    reportingAdmins:
    - kind: ServiceAccount
      name: default
      namespace: my-custom-ns
    # anyone in the group reporting-readers can get, list, watch reports, and
    # query report results from the reporting REST API.
    reportingViewers:
    - kind: Group
      name: reporting-readers
    # anyone in the group cluster-admins can query report results
    # from the reporting REST API. So can the user bob-from-accounting.
    reportExporters:
    - kind: Group
      name: cluster-admins
    - kind: User
      name: bob-from-accounting

  reporting-operator:
    spec:
      authProxy:
        # htpasswd.data can contain htpasswd file contents for allowing auth
        # using a static list of usernames and their password hashes.
        #
        # username is 'testuser' password is 'password123'
        # generated htpasswdData using: `htpasswd -nb -s testuser password123`
        # htpasswd:
        #   data: |
        #     testuser:{SHA}y/2sYAj5yrQIN4TL0YdPdmGNKpc=
        #
        # change REPLACEME to the output of your htpasswd command
        htpasswd:
          data: |
            REPLACEME

另外,您还可使用任何具有授予 reports/export get 权限规则的角色。具体指 get reporting-operator 命名空间中报告资源的 export 子资源的访问权限。例如:admincluster-admin

reporting-operatormetering-operator serviceAccounts 默认均具有这些权限,其令牌可用于身份验证。

3.5.2.2.2. 基础身份验证(用户名/密码)

在进行基础身份验证时,您可在 reporting-operator.spec.authProxy.htpasswd.data 中提供用户名和密码。用户名和密码的格式必须与 htpasswd 文件中相同。设置完成后,即可使用 HTTP 基础身份验证来提供您的用户名和密码,htpasswdData 内容中具有该用户名和密码的对应条目。