2.3. 核心设置和配置


基于角色的访问控制、基本监控和 pod 放置来部署 Loki。

2.3.1. 授权 LokiStack 规则 RBAC 权限

管理员可以允许用户通过将集群角色绑定到 username 来创建和管理自己的警报和记录规则。集群角色定义为 ClusterRole 对象,其中包含用户所需的基于角色的访问控制(RBAC)权限。

LokiStack 有以下用于警报和记录规则的集群角色:

Expand
运行名称描述

alertingrules.loki.grafana.com-v1-admin

具有此角色的用户具有管理级别访问权限来管理警报规则。此集群角色授予在 loki.grafana.com/v1 API 组中创建、读取、更新、删除、列出和监视 AlertingRule 资源的权限。

alertingrules.loki.grafana.com-v1-crdview

具有此角色的用户可以查看与 loki.grafana.com/v1 API 组中的 AlertingRule 资源相关的自定义资源定义(CRD)的定义,但没有修改或管理这些资源的权限。

alertingrules.loki.grafana.com-v1-edit

具有此角色的用户有权创建、更新和删除 AlertingRule 资源。

alertingrules.loki.grafana.com-v1-view

具有此角色的用户可以读取 loki.grafana.com/v1 API 组中的 AlertingRule 资源。它们可以检查现有警报规则的配置、标签和注解,但不能对它们进行任何修改。

recordingrules.loki.grafana.com-v1-admin

具有此角色的用户具有管理记录规则的管理级别访问权限。此集群角色授予在 loki.grafana.com/v1 API 组中创建、读取、更新、删除、列出和监视 RecordingRule 资源的权限。

recordingrules.loki.grafana.com-v1-crdview

具有此角色的用户可以查看与 loki.grafana.com/v1 API 组中的 RecordingRule 资源相关的自定义资源定义(CRD)的定义,但没有修改或管理这些资源的权限。

recordingrules.loki.grafana.com-v1-edit

具有此角色的用户有权创建、更新和删除 RecordingRule 资源。

recordingrules.loki.grafana.com-v1-view

具有此角色的用户可以读取 loki.grafana.com/v1 API 组中的 RecordingRule 资源。它们可以检查现有警报规则的配置、标签和注解,但不能对它们进行任何修改。

2.3.1.1. 例子

要为用户应用集群角色,您必须将现有集群角色绑定到特定用户名。

集群角色可以是集群或命名空间范围,具体取决于您使用的角色绑定。使用 RoleBinding 对象时,如使用 oc adm policy add-role-to-user 命令时,集群角色仅适用于指定的命名空间。当使用 ClusterRoleBinding 对象时,如使用 oc adm policy add-cluster-role-to-user 命令时,集群角色会应用到集群中的所有命名空间。

以下示例命令为指定用户在集群中的特定命名空间中创建、读取、更新和删除(CRUD)权限:

特定命名空间中警报规则 CRUD 权限的集群角色绑定命令示例

$ oc adm policy add-role-to-user alertingrules.loki.grafana.com-v1-admin -n <namespace> <username>
Copy to Clipboard Toggle word wrap

以下命令为所有命名空间中的警报规则授予指定用户管理员权限:

管理员权限的集群角色绑定命令示例

$ oc adm policy add-cluster-role-to-user alertingrules.loki.grafana.com-v1-admin <username>
Copy to Clipboard Toggle word wrap

2.3.2. 使用 Loki 创建基于日志的警报规则

AlertingRule CR 包含一组规格和 webhook 验证定义,用于声明单个 LokiStack 实例的警报规则组。另外,webhook 验证定义支持规则验证条件:

  • 如果 AlertingRule CR 包含无效的 interval 周期,则它是一个无效的警报规则
  • 如果 AlertingRule CR 包含无效的 for 周期,则它是一个无效的警报规则
  • 如果 AlertingRule CR 包含无效的 LogQL expr,则它是一个无效的警报规则。
  • 如果 AlertingRule CR 包含两个同名的组,则它是一个无效的警报规则。
  • 如果以上都不适用,则警报规则被视为有效。
Expand
表 2.2. AlertingRule 定义
租户类型AlertingRule CR 的有效命名空间

application

<your_application_namespace>

audit

openshift-logging

infrastructure

openshift-/*, kube-/\*, default

流程

  1. 创建 AlertingRule 自定义资源 (CR):

    基础架构 AlertingRule CR 示例

      apiVersion: loki.grafana.com/v1
      kind: AlertingRule
      metadata:
        name: loki-operator-alerts
        namespace: openshift-operators-redhat 
    1
    
        labels: 
    2
    
          openshift.io/<label_name>: "true"
      spec:
        tenantID: "infrastructure" 
    3
    
        groups:
          - name: LokiOperatorHighReconciliationError
            rules:
              - alert: HighPercentageError
                expr: | 
    4
    
                  sum(rate({kubernetes_namespace_name="openshift-operators-redhat", kubernetes_pod_name=~"loki-operator-controller-manager.*"} |= "error" [1m])) by (job)
                    /
                  sum(rate({kubernetes_namespace_name="openshift-operators-redhat", kubernetes_pod_name=~"loki-operator-controller-manager.*"}[1m])) by (job)
                    > 0.01
                for: 10s
                labels:
                  severity: critical 
    5
    
                annotations:
                  summary: High Loki Operator Reconciliation Errors 
    6
    
                  description: High Loki Operator Reconciliation Errors 
    7
    Copy to Clipboard Toggle word wrap

    1
    创建此 AlertingRule CR 的命名空间必须具有与 LokiStack spec.rules.namespaceSelector 定义匹配的标签。
    2
    labels 块必须与 LokiStack spec.rules.selector 定义匹配。
    3
    infrastructure 租户的 AlertingRule CR 只在 openshift-*, kube-\*, 或 default 命名空间中被支持。
    4
    kubernetes_namespace_name: 的值必须与 metadata.namespace 的值匹配。
    5
    此必需字段的值必须是 criticalwarninginfo
    6
    这个字段是必须的。
    7
    这个字段是必须的。

    应用程序 AlertingRule CR 示例

      apiVersion: loki.grafana.com/v1
      kind: AlertingRule
      metadata:
        name: app-user-workload
        namespace: app-ns 
    1
    
        labels: 
    2
    
          openshift.io/<label_name>: "true"
      spec:
        tenantID: "application"
        groups:
          - name: AppUserWorkloadHighError
            rules:
              - alert:
                expr: | 
    3
    
                  sum(rate({kubernetes_namespace_name="app-ns", kubernetes_pod_name=~"podName.*"} |= "error" [1m])) by (job)
                for: 10s
                labels:
                  severity: critical 
    4
    
                annotations:
                  summary:  
    5
    
                  description:  
    6
    Copy to Clipboard Toggle word wrap

    1
    创建此 AlertingRule CR 的命名空间必须具有与 LokiStack spec.rules.namespaceSelector 定义匹配的标签。
    2
    labels 块必须与 LokiStack spec.rules.selector 定义匹配。
    3
    kubernetes_namespace_name: 的值必须与 metadata.namespace 的值匹配。
    4
    此必需字段的值必须是 criticalwarninginfo
    5
    此必需字段的值是规则的摘要。
    6
    此必填字段的值是规则的详细描述。
  2. 应用 AlertingRule CR:

    $ oc apply -f <filename>.yaml
    Copy to Clipboard Toggle word wrap

2.3.3. 配置 Loki 以容许 memberlist 创建失败

在 OpenShift Container Platform 集群中,管理员通常使用非专用 IP 网络范围。因此,Loki memberlist 配置会失败,因为默认情况下,它只使用私有 IP 网络。

作为管理员,您可以为 memberlist 配置选择 pod 网络。您可以修改 LokiStack 自定义资源(CR)以使用 hashRing spec 中的 podIP 地址。要配置 LokiStack CR,请使用以下命令:

$ oc patch LokiStack logging-loki -n openshift-logging  --type=merge -p '{"spec": {"hashRing":{"memberlist":{"instanceAddrType":"podIP"},"type":"memberlist"}}}'
Copy to Clipboard Toggle word wrap

LokiStack 示例,使其包含 podIP

apiVersion: loki.grafana.com/v1
kind: LokiStack
metadata:
  name: logging-loki
  namespace: openshift-logging
spec:
# ...
  hashRing:
    type: memberlist
    memberlist:
      instanceAddrType: podIP
# ...
Copy to Clipboard Toggle word wrap

2.3.4. 使用 Loki 启用基于流的保留

您可以根据日志流配置保留策略。您可以在全局范围内、每个租户或两者都设置保留规则。如果同时配置这两个,则租户规则会在全局规则之前应用。

重要

如果没有在 s3 存储桶或 LokiStack 自定义资源 (CR) 中定义保留周期,则不会修剪日志,它们会永久保留在 s3 存储桶中,这可能会填满 s3 存储。

注意
  • 虽然日志记录版本 5.9 及更新的版本支持 schema v12,但推荐使用 schema v13 以获得将来的兼容性。
  • 为了有效地进行日志修剪,请直接在对象存储供应商上配置保留策略。使用存储供应商的生命周期管理功能来确保自动删除旧日志。这也可避免从 Loki 额外处理并删除对 S3 的请求。

    如果对象存储不支持生命周期策略,您必须将 LokiStack 配置为在内部强制保留。支持的保留周期最多为 30 天。

先决条件

  • 有管理员权限。
  • 已安装 Loki Operator。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 要启用基于流的保留,请创建一个 LokiStack CR,并将它保存为 YAML 文件。在以下示例中,它名为 lokistack.yaml

    S3 的全局基于流的保留示例

    apiVersion: loki.grafana.com/v1
    kind: LokiStack
    metadata:
      name: logging-loki
      namespace: openshift-logging
    spec:
      limits:
       global: 
    1
    
          retention: 
    2
    
            days: 20
            streams:
            - days: 4
              priority: 1
              selector: '{kubernetes_namespace_name=~"test.+"}' 
    3
    
            - days: 1
              priority: 1
              selector: '{log_type="infrastructure"}'
      managementState: Managed
      replicationFactor: 1
      size: 1x.small
      storage:
        schemas:
        - effectiveDate: "2020-10-11"
          version: v13
        secret:
          name: logging-loki-s3
          type: s3
      storageClassName: gp3-csi
      tenants:
        mode: openshift-logging
    Copy to Clipboard Toggle word wrap

    1
    为所有日志流设置保留策略。此策略不会影响对象存储中的保留周期。
    2
    通过在 CR 中添加 保留块来在集群中启用保留
    3
    指定 LogQL 查询,将日志流与保留规则匹配。

    S3 基于每个租户流的保留示例

    apiVersion: loki.grafana.com/v1
    kind: LokiStack
    metadata:
      name: logging-loki
      namespace: openshift-logging
    spec:
      limits:
        global:
          retention:
            days: 20
        tenants: 
    1
    
          application:
            retention:
              days: 1
              streams:
                - days: 4
                  selector: '{kubernetes_namespace_name=~"test.+"}' 
    2
    
          infrastructure:
            retention:
              days: 5
              streams:
                - days: 1
                  selector: '{kubernetes_namespace_name=~"openshift-cluster.+"}'
      managementState: Managed
      replicationFactor: 1
      size: 1x.small
      storage:
        schemas:
        - effectiveDate: "2020-10-11"
          version: v13
        secret:
          name: logging-loki-s3
          type: s3
      storageClassName: gp3-csi
      tenants:
        mode: openshift-logging
    Copy to Clipboard Toggle word wrap

    1
    设置每个租户的保留策略。有效的租户类型是 applicationauditinfrastructure
    2
    指定 LogQL 查询,将日志流与保留规则匹配。
  2. 应用 LokiStack CR:

    $ oc apply -f lokistack.yaml
    Copy to Clipboard Toggle word wrap

2.3.5. Loki pod 放置

您可以通过在 pod 上使用容忍度或节点选择器来控制 Loki pod 在哪些节点上运行,并防止其他工作负载使用这些节点。

您可以使用 LokiStack 自定义资源 (CR) 将容限应用到日志存储 pod,并将污点应用到具有节点规格的节点。节点上的污点是一个 key:value 对,它指示节点排斥所有不允许污点的 pod。通过使用不在其他 pod 上的特定 key:value 对,可确保只有日志存储 pod 能够在该节点上运行。

带有节点选择器的 LokiStack 示例

apiVersion: loki.grafana.com/v1
kind: LokiStack
metadata:
  name: logging-loki
  namespace: openshift-logging
spec:
# ...
  template:
    compactor: 
1

      nodeSelector:
        node-role.kubernetes.io/infra: "" 
2

    distributor:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    gateway:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    indexGateway:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    ingester:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    querier:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    queryFrontend:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    ruler:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
# ...
Copy to Clipboard Toggle word wrap

1
指定应用到节点选择器的组件 pod 类型。
2
指定移到包含定义标签的节点的 pod。

带有节点选择器和容限的 LokiStack CR 示例

apiVersion: loki.grafana.com/v1
kind: LokiStack
metadata:
  name: logging-loki
  namespace: openshift-logging
spec:
# ...
  template:
    compactor:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/infra
        value: reserved
      - effect: NoExecute
        key: node-role.kubernetes.io/infra
        value: reserved
    distributor:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/infra
        value: reserved
      - effect: NoExecute
        key: node-role.kubernetes.io/infra
        value: reserved
    indexGateway:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/infra
        value: reserved
      - effect: NoExecute
        key: node-role.kubernetes.io/infra
        value: reserved
    ingester:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/infra
        value: reserved
      - effect: NoExecute
        key: node-role.kubernetes.io/infra
        value: reserved
    querier:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/infra
        value: reserved
      - effect: NoExecute
        key: node-role.kubernetes.io/infra
        value: reserved
    queryFrontend:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/infra
        value: reserved
      - effect: NoExecute
        key: node-role.kubernetes.io/infra
        value: reserved
    ruler:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/infra
        value: reserved
      - effect: NoExecute
        key: node-role.kubernetes.io/infra
        value: reserved
    gateway:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
      tolerations:
      - effect: NoSchedule
        key: node-role.kubernetes.io/infra
        value: reserved
      - effect: NoExecute
        key: node-role.kubernetes.io/infra
        value: reserved
# ...
Copy to Clipboard Toggle word wrap

要配置 LokiStack (CR) 的 nodeSelectortolerations 字段,您可以使用 oc explain 命令查看特定资源的描述和字段:

$ oc explain lokistack.spec.template
Copy to Clipboard Toggle word wrap

输出示例

KIND:     LokiStack
VERSION:  loki.grafana.com/v1

RESOURCE: template <Object>

DESCRIPTION:
     Template defines the resource/limits/tolerations/nodeselectors per
     component

FIELDS:
   compactor	<Object>
     Compactor defines the compaction component spec.

   distributor	<Object>
     Distributor defines the distributor component spec.
...
Copy to Clipboard Toggle word wrap

如需更多信息,您可以添加一个特定字段:

$ oc explain lokistack.spec.template.compactor
Copy to Clipboard Toggle word wrap

输出示例

KIND:     LokiStack
VERSION:  loki.grafana.com/v1

RESOURCE: compactor <Object>

DESCRIPTION:
     Compactor defines the compaction component spec.

FIELDS:
   nodeSelector	<map[string]string>
     NodeSelector defines the labels required by a node to schedule the
     component onto it.
...
Copy to Clipboard Toggle word wrap

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat