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 可以支持公共的证书,请将 ServiceAccountCA
和 configMap.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.data
和 reporting-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.enabled
和 reporting-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
子资源的访问权限。例如:admin
和 cluster-admin
。
reporting-operator
和 metering-operator
serviceAccounts
默认均具有这些权限,其令牌可用于身份验证。
3.5.2.2.2. 基础身份验证(用户名/密码)
在进行基础身份验证时,您可在 reporting-operator.spec.authProxy.htpasswd.data
中提供用户名和密码。用户名和密码的格式必须与 htpasswd 文件中相同。设置完成后,即可使用 HTTP 基础身份验证来提供您的用户名和密码,htpasswdData
内容中具有该用户名和密码的对应条目。