3.2. Loki 对象存储
Loki Operator 支持 AWS S3,以及 Minio 和 OpenShift Data Foundation 等其他 S3 兼容对象存储。Azure、GCS 和 Swift 也支持。
对于 Loki 存储,推荐的 nomenclature 是 logging-loki-<your_storage_provider>。
下表显示了每个存储供应商 LokiStack 自定义资源(CR) 中的 type 值。如需更多信息,请参阅存储供应商部分。
| 存储供应商 | Secret type 值 |
|---|---|
| AWS | s3 |
| Azure | azure |
| Google Cloud | gcs |
| Minio | s3 |
| OpenShift Data Foundation | s3 |
| Swift | swift |
3.2.1. AWS 存储 复制链接链接已复制到粘贴板!
您可以在 Amazon Web Services (AWS)中创建对象存储来存储日志。
先决条件
- 已安装 Loki Operator。
-
已安装 OpenShift CLI(
oc)。 - 您在 AWS 上创建了存储桶。
- 您创建了 AWS IAM 策略和 IAM 用户。
步骤
运行以下命令,创建一个名为
logging-loki-aws的对象存储 secret:$ oc create secret generic logging-loki-aws \1 --from-literal=bucketnames="<bucket_name>" \ --from-literal=endpoint="<aws_bucket_endpoint>" \ --from-literal=access_key_id="<aws_access_key_id>" \ --from-literal=access_key_secret="<aws_access_key_secret>" \ --from-literal=region="<aws_region_of_your_bucket>" \ --from-literal=forcepathstyle="true"2
3.2.1.1. 启用 STS 的集群的 AWS 存储 复制链接链接已复制到粘贴板!
如果您的集群启用了 STS,Cloud Credential Operator (CCO)支持使用 AWS 令牌进行简短身份验证。
您可以运行以下命令来手动创建 Loki 对象存储 secret:
$ oc -n openshift-logging create secret generic "logging-loki-aws" \
--from-literal=bucketnames="<s3_bucket_name>" \
--from-literal=region="<bucket_region>" \
--from-literal=audience="<oidc_audience>"
- 1
- 可选注解,默认值为
openshift。
3.2.2. Azure 存储 复制链接链接已复制到粘贴板!
先决条件
- 已安装 Loki Operator。
-
已安装 OpenShift CLI(
oc)。 - 您在 Azure 上创建了存储桶。
步骤
运行以下命令,使用名称
logging-loki-azure创建对象存储 secret:$ oc create secret generic logging-loki-azure \ --from-literal=container="<azure_container_name>" \ --from-literal=environment="<azure_environment>" \1 --from-literal=account_name="<azure_account_name>" \ --from-literal=account_key="<azure_account_key>"- 1
- 支持的环境值包括
AzureGlobal、AzureChinaCloud、AzureGermanCloud或AzureUSGovernment。
3.2.2.1. 为 Microsoft Entra Workload ID 启用集群的 Azure 存储 复制链接链接已复制到粘贴板!
如果您的集群启用了 Microsoft Entra Workload ID,Cloud Credential Operator (CCO) 支持使用 Workload ID 进行短期身份验证。
您可以运行以下命令来手动创建 Loki 对象存储 secret:
$ oc -n openshift-logging create secret generic logging-loki-azure \
--from-literal=environment="<azure_environment>" \
--from-literal=account_name="<storage_account_name>" \
--from-literal=container="<container_name>"
3.2.3. Google Cloud Platform 存储 复制链接链接已复制到粘贴板!
先决条件
步骤
-
将从 GCP 接收的服务帐户凭证复制到名为
key.json的文件中。 运行以下命令,使用名称
logging-loki-gcs创建对象存储 secret:$ oc create secret generic logging-loki-gcs \ --from-literal=bucketname="<bucket_name>" \ --from-file=key.json="<path/to/key.json>"
3.2.4. Minio 存储 复制链接链接已复制到粘贴板!
您可以在 Minio 中创建对象存储来存储日志。
流程
运行以下命令,创建一个名为
logging-loki-minio的对象存储 secret:$ oc create secret generic logging-loki-minio \1 --from-literal=bucketnames="<bucket_name>" \ --from-literal=endpoint="<minio_bucket_endpoint>" \ --from-literal=access_key_id="<minio_access_key_id>" \ --from-literal=access_key_secret="<minio_access_key_secret>" --from-literal=forcepathstyle="true"2
3.2.5. OpenShift Data Foundation 存储 复制链接链接已复制到粘贴板!
您可以在 OpenShift Data Foundation 存储中创建对象存储来存储日志。
先决条件
- 已安装 Loki Operator。
-
已安装 OpenShift CLI(
oc)。 - 您已部署了 OpenShift Data Foundation。
- 为对象存储配置了 OpenShift Data Foundation 集群。https://access.redhat.com/documentation/zh-cn/red_hat_openshift_data_foundation/4.18/html/managing_and_allocating_storage_resources/adding-file-and-object-storage-to-an-existing-external-ocs-cluster
流程
在
openshift-logging命名空间中创建ObjectBucketClaim自定义资源:apiVersion: objectbucket.io/v1alpha1 kind: ObjectBucketClaim metadata: name: loki-bucket-odf namespace: openshift-logging spec: generateBucketName: loki-bucket-odf storageClassName: openshift-storage.noobaa.io运行以下命令,从关联的
ConfigMap对象获取存储桶属性:BUCKET_HOST=$(oc get -n openshift-logging configmap loki-bucket-odf -o jsonpath='{.data.BUCKET_HOST}') BUCKET_NAME=$(oc get -n openshift-logging configmap loki-bucket-odf -o jsonpath='{.data.BUCKET_NAME}') BUCKET_PORT=$(oc get -n openshift-logging configmap loki-bucket-odf -o jsonpath='{.data.BUCKET_PORT}')运行以下命令,从关联的 secret 获取存储桶访问密钥:
ACCESS_KEY_ID=$(oc get -n openshift-logging secret loki-bucket-odf -o jsonpath='{.data.AWS_ACCESS_KEY_ID}' | base64 -d) SECRET_ACCESS_KEY=$(oc get -n openshift-logging secret loki-bucket-odf -o jsonpath='{.data.AWS_SECRET_ACCESS_KEY}' | base64 -d)运行以下命令,创建一个名为
logging-loki-odf的对象存储 secret:$ oc create -n openshift-logging secret generic logging-loki-odf \1 --from-literal=access_key_id="<access_key_id>" \ --from-literal=access_key_secret="<secret_access_key>" \ --from-literal=bucketnames="<bucket_name>" \ --from-literal=endpoint="https://<bucket_host>:<bucket_port>" \ --from-literal=forcepathstyle="true"2
3.2.6. Swift 存储 复制链接链接已复制到粘贴板!
先决条件
- 已安装 Loki Operator。
-
已安装 OpenShift CLI(
oc)。 - 您在 Swift 上创建了一个存储桶。
流程
运行以下命令,创建一个名为
logging-loki-swift的对象存储 secret:$ oc create secret generic logging-loki-swift \ --from-literal=auth_url="<swift_auth_url>" \ --from-literal=username="<swift_usernameclaim>" \ --from-literal=user_domain_name="<swift_user_domain_name>" \ --from-literal=user_domain_id="<swift_user_domain_id>" \ --from-literal=user_id="<swift_user_id>" \ --from-literal=password="<swift_password>" \ --from-literal=domain_id="<swift_domain_id>" \ --from-literal=domain_name="<swift_domain_name>" \ --from-literal=container_name="<swift_container_name>"您可以通过运行以下命令来提供项目特定数据、区域或两者:
$ oc create secret generic logging-loki-swift \ --from-literal=auth_url="<swift_auth_url>" \ --from-literal=username="<swift_usernameclaim>" \ --from-literal=user_domain_name="<swift_user_domain_name>" \ --from-literal=user_domain_id="<swift_user_domain_id>" \ --from-literal=user_id="<swift_user_id>" \ --from-literal=password="<swift_password>" \ --from-literal=domain_id="<swift_domain_id>" \ --from-literal=domain_name="<swift_domain_name>" \ --from-literal=container_name="<swift_container_name>" \ --from-literal=project_id="<swift_project_id>" \ --from-literal=project_name="<swift_project_name>" \ --from-literal=project_domain_id="<swift_project_domain_id>" \ --from-literal=project_domain_name="<swift_project_domain_name>" \ --from-literal=region="<swift_region>"
3.2.7. 在使用短期凭证的集群中部署 Loki 日志存储 复制链接链接已复制到粘贴板!
对于某些存储供应商,您可以在安装过程中使用 Cloud Credential Operator 实用程序(ccoctl)来实现短期凭证。这些凭证在 OpenShift Container Platform 集群外创建和管理。如需更多信息,请参阅组件 的带有简短凭证的手动模式。
在使用此凭证策略的集群上,必须在 Loki Operator 的新安装过程中配置短期凭证身份验证。您无法重新配置使用不同凭证策略的现有集群,以使用此功能。
3.2.7.1. 使用工作负载身份联合进行身份验证以访问基于云的日志存储 复制链接链接已复制到粘贴板!
您可以使用带有简短令牌的工作负载身份联合来对基于云的日志存储进行身份验证。使用工作负载身份联邦时,您不必在集群中存储长期凭证,这降低了凭证泄漏的风险,并简化 secret 管理。
先决条件
- 有管理员权限。
流程
使用以下选项之一启用身份验证:
-
如果您使用 OpenShift Container Platform Web 控制台安装 Loki Operator,系统会自动检测到使用简短令牌的集群。系统将提示您创建角色,并提供 Loki Operator 所需的数据,以创建
CredentialsRequest对象,该对象填充 secret。 如果使用 OpenShift CLI (
oc)安装 Loki Operator,则必须手动创建Subscription对象。如以下示例所示,为您的存储供应商使用适当的模板。此身份验证策略仅支持示例中所示的存储供应商。Microsoft Azure 示例订阅
apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: loki-operator namespace: openshift-operators-redhat spec: channel: "stable-6.3" installPlanApproval: Manual name: loki-operator source: redhat-operators sourceNamespace: openshift-marketplace config: env: - name: CLIENTID value: <your_client_id> - name: TENANTID value: <your_tenant_id> - name: SUBSCRIPTIONID value: <your_subscription_id> - name: REGION value: <your_region>Amazon Web Services (AWS)示例订阅
apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: loki-operator namespace: openshift-operators-redhat spec: channel: "stable-6.3" installPlanApproval: Manual name: loki-operator source: redhat-operators sourceNamespace: openshift-marketplace config: env: - name: ROLEARN value: <role_ARN>Google Cloud Platform (GCP)示例订阅
apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: loki-operator namespace: openshift-operators-redhat spec: channel: "stable-6.3" installPlanApproval: Manual name: loki-operator source: redhat-operators sourceNamespace: openshift-marketplace config: env: - name: PROJECT_NUMBER value: <your_project_number> - name: POOL_ID value: <your_pool_id> - name: PROVIDER_ID value: <your_provider_id> - name: SERVICE_ACCOUNT_EMAIL value: example@mydomain.iam.gserviceaccount.com
-
如果您使用 OpenShift Container Platform Web 控制台安装 Loki Operator,系统会自动检测到使用简短令牌的集群。系统将提示您创建角色,并提供 Loki Operator 所需的数据,以创建
3.2.7.2. 使用 Web 控制台创建 LokiStack 自定义资源 复制链接链接已复制到粘贴板!
您可以使用 OpenShift Container Platform Web 控制台创建 LokiStack 自定义资源(CR)。
先决条件
- 有管理员权限。
- 访问 OpenShift Container Platform web 控制台。
- 已安装 Loki Operator。
步骤
-
进入 Operators
Installed Operators 页面。点 All instances 选项卡。 - 在 Create new 下拉列表中,选择 LokiStack。
选择 YAML 视图,然后使用以下模板来创建
LokiStackCR:apiVersion: loki.grafana.com/v1 kind: LokiStack metadata: name: logging-loki1 namespace: openshift-logging spec: size: 1x.small2 storage: schemas: - effectiveDate: '2023-10-15' version: v13 secret: name: logging-loki-s33 type: s34 credentialMode:5 storageClassName: <storage_class_name>6 tenants: mode: openshift-logging- 1
- 使用名称
logging-loki。 - 2
- 指定部署大小。在日志记录 5.8 及更新的版本中,Loki 实例支持的大小选项为
1x.extra-small、1x.small或1x.medium。 - 3
- 指定用于日志存储的 secret。
- 4
- 指定对应的存储类型。
- 5
- 可选字段,日志记录 5.9 及更新的版本。支持的用户配置值如下:
static是所有受支持的对象存储类型的默认身份验证模式,使用存储在 Secret 中的凭证。token是从凭证源检索的短期令牌。在这个模式中,静态配置不包含对象存储所需的凭证。相反,它们会使用服务在运行时生成,允许提供较短的凭证,以及更精细的控制。并不是所有对象存储类型都支持这个身份验证模式。当 Loki 在受管 STS 模式下运行并使用 CCO on STS/WIF 集群时,token-cco是默认值。 - 6
- 为临时存储输入存储类的名称。为获得最佳性能,请指定分配块存储的存储类。可以使用
oc get storageclasses命令列出集群的可用存储类。
3.2.7.3. 使用 CLI 为 Loki 对象存储创建 secret 复制链接链接已复制到粘贴板!
要配置 Loki 对象存储,您必须创建一个 secret。您可以使用 OpenShift CLI (oc)完成此操作。
先决条件
- 有管理员权限。
- 已安装 Loki Operator。
-
已安装 OpenShift CLI(
oc)。
步骤
运行以下命令,在包含您的证书和密钥文件的目录中创建 secret:
$ oc create secret generic -n openshift-logging <your_secret_name> \ --from-file=tls.key=<your_key_file> \ --from-file=tls.crt=<your_crt_file> \ --from-file=ca-bundle.crt=<your_bundle_file> \ --from-literal=username=<your_username> \ --from-literal=password=<your_password>
使用通用或 opaque secret 以获得最佳结果。
验证
运行以下命令验证 secret 是否已创建:
$ oc get secret -n openshift-logging
3.2.8. 对 Loki 日志的精细访问 复制链接链接已复制到粘贴板!
Red Hat OpenShift Logging Operator 默认不授予所有用户对日志的访问权限。作为管理员,您需要配置用户访问权限,除非 Operator 已升级并且以前的配置已就位。根据您的配置和需要,您可以使用以下内容配置对日志的精细访问:
- 集群范围内的策略
- 命名空间范围策略
- 创建自定义 admin 组
作为管理员,您需要创建适合部署的角色绑定和集群角色绑定。Red Hat OpenShift Logging Operator 提供以下集群角色:
-
cluster-logging-application-view授予读取应用程序日志的权限。 -
cluster-logging-infrastructure-view授予读取基础架构日志的权限。 -
cluster-logging-audit-view授予读取审计日志的权限。
如果您从以前的版本升级,则额外的集群角色 logging-application-logs-reader 和关联的集群角色绑定 logging-all-authenticated-application-logs-reader 提供向后兼容性,允许任何经过身份验证的用户在命名空间中读取访问权限。
在查询应用程序日志时,具有命名空间权限的用户必须提供命名空间。
3.2.8.1. 集群范围内的访问 复制链接链接已复制到粘贴板!
集群角色绑定资源引用集群角色,以及设置集群范围的权限。
ClusterRoleBinding 示例
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: logging-all-application-logs-reader
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-logging-application-view
subjects:
- kind: Group
name: system:authenticated
apiGroup: rbac.authorization.k8s.io
3.2.8.2. 命名空间访问 复制链接链接已复制到粘贴板!
RoleBinding 资源可用于 ClusterRole 对象来定义用户或组可以访问日志的命名空间。
RoleBinding 示例
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: allow-read-logs
namespace: log-test-0
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-logging-application-view
subjects:
- kind: User
apiGroup: rbac.authorization.k8s.io
name: testuser-0
- 1
- 指定此
RoleBinding应用到的命名空间。
3.2.8.3. 自定义 admin 组访问 复制链接链接已复制到粘贴板!
如果您的大型部署具有多个需要更广泛的权限的用户,您可以使用 adminGroup 字段创建一个自定义组。属于 LokiStack CR 的 adminGroups 字段中指定的任何组的成员的用户被视为管理员。
如果管理员还分配了 cluster-logging-application-view 角色,则管理员用户可以访问所有命名空间中的所有应用程序日志。
LokiStack CR 示例
apiVersion: loki.grafana.com/v1
kind: LokiStack
metadata:
name: logging-loki
namespace: openshift-logging
spec:
tenants:
mode: openshift-logging
openshift:
adminGroups:
- cluster-admin
- custom-admin-group
3.2.9. 为 cluster-admin 用户角色创建新组 复制链接链接已复制到粘贴板!
以 cluster-admin 用户身份查询多个命名空间的应用程序日志,其中集群中所有命名空间的字符总和大于 5120,会导致错误 Parse error: input size too long (XXXX > 5120)。为了更好地控制 LokiStack 中日志的访问,请使 cluster-admin 用户成为 cluster-admin 组的成员。如果 cluster-admin 组不存在,请创建它并将所需的用户添加到其中。
使用以下步骤为具有 cluster-admin 权限的用户创建新组。
流程
输入以下命令创建新组:
$ oc adm groups new cluster-admin输入以下命令将所需的用户添加到
cluster-admin组中:$ oc adm groups add-users cluster-admin <username>输入以下命令在组中添加
cluster-admin用户角色:$ oc adm policy add-cluster-role-to-group cluster-admin cluster-admin