1.5. 从启用了 STS 的集群将日志转发到 Amazon CloudWatch


Amazon CloudWatch 是一个服务,可帮助管理员在 Amazon Web Services (AWS)上观察和监控资源和应用程序。您可以使用 AWS 的 Identity and Access Management (IAM)角色为服务帐户(IRSA)安全地将日志转发到 CloudWatch,它使用 AWS 安全令牌服务(STS)。

使用 CloudWatch 进行身份验证可以正常工作:

  1. 日志收集器通过将服务帐户令牌提供给 AWS 中的 OpenID Connect (OIDC)供应商,从安全令牌服务(STS)请求临时 AWS 凭证。
  2. AWS 验证令牌。根据信任策略,AWS 会发出简短的临时凭证,包括访问密钥 ID、secret 访问密钥和会话令牌,供日志收集器使用。

在启用了 STS 的集群上,如 Red Hat OpenShift Service on AWS,AWS 角色被预先配置了所需的信任策略。这允许服务帐户假定角色。因此,您可以使用 IAM 角色的 STS 为 AWS 创建 secret。然后,您可以创建或更新使用 secret 将日志转发到 CloudWatch 输出的 ClusterLogForwarder 自定义资源(CR)。如果角色预先配置了,请按照以下步骤创建 secret 和 ClusterLogForwarder CR:

  • 使用现有 AWS 角色为 CloudWatch 创建 secret
  • 从启用了 STS 的集群将日志转发到 Amazon CloudWatch

如果您没有使用信任策略预先配置的 AWS IAM 角色,您必须首先使用所需的信任策略创建角色。完成以下步骤,创建一个 secret、ClusterLogForwarder CR 和角色。

1.5.1. 创建 AWS IAM 角色

创建一个 Amazon Web Services (AWS) IAM 角色,您的服务帐户可以假定该角色安全访问 AWS 资源。

以下流程演示了如何使用 AWS CLI 创建 AWS IAM 角色。您还可以使用 Cloud Credential Operator (CCO)实用程序 ccoctl。使用 ccoctl 实用程序在 IAM 角色策略中创建多个字段,ClusterLogForwarder 自定义资源(CR)不需要。CR 会忽略这些额外字段。但是,ccoctl 工具为配置 IAM 角色提供了一种便捷的方法。如需更多信息,请参阅组件 的带有简短凭证的手动模式

先决条件

  • 您可以访问为 AWS 启用并配置了安全令牌服务(STS)的 Red Hat OpenShift Logging 集群。
  • 具有 AWS 帐户的管理员访问权限。
  • 已安装 AWS CLI。

流程

  1. 创建一个 IAM 策略,向 CloudWatch 授予权限。

    1. 创建包含以下内容的文件,如 cw-iam-role-policy.json

      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "logs:PutLogEvents",
                      "logs:CreateLogGroup",
                      "logs:PutRetentionPolicy",
                      "logs:CreateLogStream",
                      "logs:DescribeLogGroups",
                      "logs:DescribeLogStreams"
                  ],
                  "Resource": "arn:aws:logs:*:*:*"
              }
          ]
      }
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,根据前面的策略定义创建 IAM 策略:

      aws iam create-policy \
          --policy-name cluster-logging-allow \
          --policy-document file://cw-iam-role-policy.json
      Copy to Clipboard Toggle word wrap

      请注意创建的策略的 Arn 值。

  2. 创建信任策略以允许日志记录服务帐户假定 IAM 角色:

    1. 创建包含以下内容的文件,如 cw-trust-policy.json

      {
      "Version": "2012-10-17",
      "Statement": [
          {
              "Effect": "Allow",
              "Principal": {
                  "Federated": "arn:aws:iam::123456789012:oidc-provider/<OPENSHIFT_OIDC_PROVIDER_URL>" 
      1
      
              },
              "Action": "sts:AssumeRoleWithWebIdentity",
              "Condition": {
                  "StringEquals": {
                      "<OPENSHIFT_OIDC_PROVIDER_URL>:sub": "system:serviceaccount:openshift-logging:logcollector" 
      2
      
                  }
              }
          }
      ]
      }
      Copy to Clipboard Toggle word wrap
      1
      <OPENSHIFT_OIDC_PROVIDER_URL > 替换为 Red Hat OpenShift Logging OIDC URL 的 URL。
      2
      namespace 和 service 帐户必须与日志转发器使用的命名空间和服务帐户匹配。
  3. 运行以下命令,根据之前定义的信任策略创建一个 IAM 角色:

    $ aws iam create-role --role-name openshift-logger --assume-role-policy-document file://cw-trust-policy.json
    Copy to Clipboard Toggle word wrap

    请注意所创建的角色的 Arn 值。

  4. 运行以下命令,将策略附加到角色:

    $ aws iam put-role-policy \
          --role-name openshift-logger --policy-name cluster-logging-allow \
          --policy-document file://cw-role-policy.json
    Copy to Clipboard Toggle word wrap

验证

  • 运行以下命令,验证角色和权限策略:

    $ aws iam get-role --role-name openshift-logger
    Copy to Clipboard Toggle word wrap

    输出示例

    ROLE	arn:aws:iam::123456789012:role/openshift-logger
    ASSUMEROLEPOLICYDOCUMENT	2012-10-17
    STATEMENT	sts:AssumeRoleWithWebIdentity	Allow
    STRINGEQUALS	system:serviceaccount:openshift-logging:openshift-logger
    PRINCIPAL	arn:aws:iam::123456789012:oidc-provider/<OPENSHIFT_OIDC_PROVIDER_URL>
    Copy to Clipboard Toggle word wrap

使用 oc create secret --from-literal 命令从配置的 AWS IAM 角色为 Amazon Web Services (AWS)安全令牌服务(STS)创建一个 secret。

先决条件

  • 您已创建了 AWS IAM 角色。
  • 具有 Red Hat OpenShift Logging 的管理员访问权限。

流程

  • 在 CLI 中,输入以下内容来为 AWS 生成 secret:

    $ oc create secret generic sts-secret -n openshift-logging --from-literal=role_arn=arn:aws:iam::123456789012:role/openshift-logger
    Copy to Clipboard Toggle word wrap

    Secret 示例

    apiVersion: v1
    kind: Secret
    metadata:
      namespace: openshift-logging
      name: sts-secret
    stringData:
      role_arn: arn:aws:iam::123456789012:role/openshift-logger
    Copy to Clipboard Toggle word wrap

您可以将在带有 Amazon Web Services (AWS)安全令牌服务(STS)的集群上部署的 Red Hat OpenShift 的日志记录转发到 Amazon CloudWatch。Amazon CloudWatch 是一个服务,可帮助管理员观察和监控 AWS 上的资源和应用程序。

先决条件

  • 已安装 Red Hat OpenShift Logging Operator。
  • 您已配置了凭证 secret。
  • 具有 Red Hat OpenShift Logging 的管理员访问权限。

流程

  • 创建或更新 ClusterLogForwarder 自定义资源(CR):

    apiVersion: observability.openshift.io/v1
    kind: ClusterLogForwarder
    metadata:
      name: <log_forwarder_name>
      namespace: openshift-logging
    spec:
      serviceAccount:
        name: <service_account_name> 
    1
    
      outputs:
       - name: cw-output 
    2
    
         type: cloudwatch 
    3
    
         cloudwatch:
           groupName: 'cw-projected{.log_type||"missing"}' 
    4
    
           region: us-east-2 
    5
    
           authentication:
             type: iamRole 
    6
    
             iamRole:
               roleARN: 
    7
    
                 key: role_arn
                 secretName: sts-secret
               token: 
    8
    
                 from: serviceAccount
      pipelines:
        - name: to-cloudwatch
          inputRefs: 
    9
    
            - infrastructure
            - audit
            - application
          outputRefs: 
    10
    
            - cw-output
    Copy to Clipboard Toggle word wrap
    1
    指定服务帐户。
    2
    指定输出的名称。
    3
    指定 cloudwatch 类型。
    4
    指定日志流的组名称。
    5
    指定 AWS 区域。
    6
    指定 iamRole 作为 STS 验证类型。
    7
    指定 secret 的名称以及存储 role_arn 资源的键。
    8
    指定要用于身份验证的服务帐户令牌。要使用投射服务帐户令牌,请使用 from: serviceAccount
    9
    使用管道指定要转发的日志类型:applicationinfrastructureaudit
    10
    指定使用此管道转发日志时使用的输出名称。

收集所有集群日志会生成大量数据,这可能会造成移动和存储的代价。要减少卷,您可以配置 drop 过滤器,以在转发前排除不需要的日志记录。日志收集器根据过滤器评估日志流,并丢弃与指定条件匹配的记录。

drop 过滤器使用 test 字段来定义一个或多个用于评估日志记录的条件。过滤器应用以下规则来检查是否丢弃记录:

  • 如果所有指定条件都评估为 true,则测试通过。
  • 如果测试通过,则过滤器会丢弃日志记录。
  • 如果您在 drop 过滤器配置中定义多个测试,如果任何测试通过,则过滤器会丢弃日志记录。
  • 如果评估条件时出错,例如,没有引用的字段,则该条件评估为 false。

先决条件

  • 已安装 Red Hat OpenShift Logging Operator。
  • 有管理员权限。
  • 您已创建了 ClusterLogForwarder 自定义资源 (CR)。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 提取现有的 ClusterLogForwarder 配置并将其保存为本地文件。

    $ oc get clusterlogforwarder <name> -n <namespace> -o yaml > <filename>.yaml
    Copy to Clipboard Toggle word wrap

    其中:

    • &lt;name> 是您要配置的 ClusterLogForwarder 实例的名称。
    • &lt;namespace> 是创建 ClusterLogForwarder 实例的命名空间,如 openshift-logging
    • <filename > 是保存配置的本地文件的名称。
  2. 添加配置,将不需要的日志记录放到 ClusterLogForwarder CR 中的 filters spec 中。

    ClusterLogForwarder CR 示例

    apiVersion: observability.openshift.io/v1
    kind: ClusterLogForwarder
    metadata:
      name: instance
      namespace: openshift-logging
    spec:
      # ...
      filters:
      - name: drop-filter
        type: drop 
    1
    
        drop: 
    2
    
        - test: 
    3
    
          - field: .kubernetes.labels."app.version-1.2/beta" 
    4
    
            matches: .+ 
    5
    
          - field: .kubernetes.pod_name
            notMatches: "my-pod" 
    6
    
      pipelines:
      - name: my-pipeline 
    7
    
        filterRefs:
        - drop-filter
      # ...
    Copy to Clipboard Toggle word wrap

    1
    指定过滤器的类型。drop 过滤器丢弃与过滤器配置匹配的日志记录。
    2
    指定 drop 过滤器的配置选项。
    3
    指定测试条件来评估过滤器是否丢弃日志记录。
    4
    指定日志记录中字段的点分隔路径。
    • 每个路径片段可以包含字母数字字符和下划线、a-zA-Z0-9_,如 .kubernetes.namespace_name
    • 如果片段包含不同的字符,则片段必须在引号里,例如 . kubernetes.labels."app.version-1.2/beta "。
    • 您可以在单个测试配置中包括多个字段路径,但它们都必须评估为 true 才能使测试通过,以及要应用的 drop 过滤器。
    5
    指定一个正则表达式。如果日志记录与此正则表达式匹配,它们将被丢弃。
    6
    指定一个正则表达式。如果日志记录与此正则表达式不匹配,它们将被丢弃。
    7
    指定使用 drop 过滤器的管道。
    注意

    您可以为单个 field 路径设置 matchesnotMatches 条件,但不能同时设置这两个条件。

    仅保留高优先级日志记录的示例配置

    # ...
    filters:
    - name: important
      type: drop
      drop:
      - test:
        - field: .message
          notMatches: "(?i)critical|error"
        - field: .level
          matches: "info|warning"
    # ...
    Copy to Clipboard Toggle word wrap

    具有多个测试的配置示例

    # ...
    filters:
    - name: important
      type: drop
      drop:
      - test: 
    1
    
        - field: .kubernetes.namespace_name
          matches: "openshift.*"
      - test: 
    2
    
        - field: .log_type
          matches: "application"
        - field: .kubernetes.pod_name
          notMatches: "my-pod"
    # ...
    Copy to Clipboard Toggle word wrap

    1
    过滤器丢弃包含以 openshift 开头的命名空间的日志。
    2
    过滤器丢弃 pod 名称中没有 my-pod 的应用日志。
  3. 运行以下命令来应用 ClusterLogForwarder CR:

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

1.5.5. API 审计过滤器概述

OpenShift API 服务器为每个 API 调用生成审计事件。这些事件包括请求、响应和请求者身份的详细信息。这可能导致大量数据。

API 审计过滤器帮助通过使用规则排除非主题事件并缩小事件大小,从而管理审计跟踪。规则按顺序检查,检查会在第一个匹配项时停止。事件中的数据量取决于 level 字段的值:

  • None: 事件被丢弃。
  • Metadata :事件包括审计元数据,并排除请求和响应正文。
  • Request: 事件包括审计元数据和请求正文,并排除响应正文。
  • Request response :事件包括所有数据:metadata、request 正文和响应正文。响应正文可能非常大。例如,oc get pods -A 生成包含集群中每个 pod 的 YAML 描述的响应正文。
注意

只有在日志记录部署中设置了 Vector 收集器时,您只能使用 API 审计过滤器功能。

ClusterLogForwarder 自定义资源(CR)使用与标准 Kubernetes 审计策略 相同的格式。ClusterLogForwarder CR 提供以下额外功能:

通配符
用户、组、命名空间和资源的名称可以在前导或尾部带有 * 星号字符。例如,openshift-\* 命名空间与 openshift-apiserveropenshift-authentication 命名空间匹配。\*/status 资源与 Pod/statusDeployment/status 资源匹配。
默认规则

与策略中任何规则不匹配的事件将被过滤,如下所示:

  • getlistwatch 等只读系统事件会被丢弃。
  • 服务帐户写入发生在与服务帐户相同的命名空间中的事件将被丢弃。
  • 所有其他事件都会被转发,受任何配置的速率限制。

要禁用这些默认值,请使用只有一个 level 字段的规则结束您的规则列表,或者添加一条空规则。

省略响应代码
要省略的整数状态代码列表。您可以使用 OmitResponseCodes 字段(没有创建事件)的 HTTP 状态代码列表根据响应中的 HTTP 状态代码丢弃事件。默认值为 [404, 409, 422, 429]。如果值为空列表 [],则不会省略任何状态代码。

ClusterLogForwarder CR Audit 策作为 OpenShift Container Platform 审计策略外的补充起作用。ClusterLogForwarder CR 审计过滤器更改日志收集器转发的内容,并提供按操作动词、用户、组、命名空间或资源过滤的功能。您可以创建多个过滤器,将同一审计流的不同摘要发送到不同的位置。例如,您可以将详细的流发送到本地集群日志存储,并将不太详细的流发送到远程站点。

重要
  • 您必须具有 collect-audit-logs 集群角色才能收集审计日志。
  • 以下示例旨在说明审计策略中可能的规则范围,不是推荐的配置。

Audit 策略示例

apiVersion: observability.openshift.io/v1
kind: ClusterLogForwarder
metadata:
  name: instance
  namespace: openshift-logging
spec:
  serviceAccount:
    name: example-service-account
  pipelines:
    - name: my-pipeline
      inputRefs:
        - audit 
1

      filterRefs:
        - my-policy 
2

      outputRefs:
        - my-output
  filters:
    - name: my-policy
      type: kubeAPIAudit
      kubeAPIAudit:
        # Don't generate audit events for all requests in RequestReceived stage.
        omitStages:
          - "RequestReceived"

        rules:
          # Log pod changes at RequestResponse level
          - level: RequestResponse
            resources:
            - group: ""
              resources: ["pods"]

          # Log "pods/log", "pods/status" at Metadata level
          - level: Metadata
            resources:
            - group: ""
              resources: ["pods/log", "pods/status"]

          # Don't log requests to a configmap called "controller-leader"
          - level: None
            resources:
            - group: ""
              resources: ["configmaps"]
              resourceNames: ["controller-leader"]

          # Don't log watch requests by the "system:kube-proxy" on endpoints or services
          - level: None
            users: ["system:kube-proxy"]
            verbs: ["watch"]
            resources:
            - group: "" # core API group
              resources: ["endpoints", "services"]

          # Don't log authenticated requests to certain non-resource URL paths.
          - level: None
            userGroups: ["system:authenticated"]
            nonResourceURLs:
            - "/api*" # Wildcard matching.
            - "/version"

          # Log the request body of configmap changes in kube-system.
          - level: Request
            resources:
            - group: "" # core API group
              resources: ["configmaps"]
            # This rule only applies to resources in the "kube-system" namespace.
            # The empty string "" can be used to select non-namespaced resources.
            namespaces: ["kube-system"]

          # Log configmap and secret changes in all other namespaces at the Metadata level.
          - level: Metadata
            resources:
            - group: "" # core API group
              resources: ["secrets", "configmaps"]

          # Log all other resources in core and extensions at the Request level.
          - level: Request
            resources:
            - group: "" # core API group
            - group: "extensions" # Version of group should NOT be included.

          # A catch-all rule to log all other requests at the Metadata level.
          - level: Metadata
Copy to Clipboard Toggle word wrap

1
收集的日志类型。此字段的值可以是 审计日志的审核应用程序日志的 应用程序、基础架构 日志或为应用程序定义的命名输入。
2
审计策略的名称。

您可以使用 input 选择器,根据标签表达式或匹配的标签键及其值包含应用程序日志。

流程

  1. 将过滤器的配置添加到 ClusterLogForwarder CR 中的 input spec 中。

    以下示例演示了如何配置 ClusterLogForwarder CR,使其包含基于标签表达式或匹配的标签键/值的日志:

    ClusterLogForwarder CR 示例

    apiVersion: observability.openshift.io/v1
    kind: ClusterLogForwarder
    # ...
    spec:
      serviceAccount:
        name: <service_account_name>
      inputs:
        - name: mylogs
          application:
            selector:
              matchExpressions:
              - key: env 
    1
    
                operator: In 
    2
    
                values: ["prod", "qa"] 
    3
    
              - key: zone
                operator: NotIn
                values: ["east", "west"]
              matchLabels: 
    4
    
                app: one
                name: app1
          type: application
    # ...
    Copy to Clipboard Toggle word wrap

    1
    指定要匹配的标签键。
    2
    指定 operator。有效值包括: In,NotIn,Exists, 和 DoesNotExist
    3
    指定字符串值的数组。如果 operator 值为 ExistsDoesNotExist,则值数组必须为空。
    4
    指定准确的键或值映射。
  2. 运行以下命令来应用 ClusterLogForwarder CR:

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

1.5.7. 配置内容过滤器以修剪日志记录

如果配置 prune 过滤器,日志收集器在转发前会根据过滤器评估日志收集器。收集器通过删除 pod 注解等低值字段来修剪日志记录。

先决条件

  • 已安装 Red Hat OpenShift Logging Operator。
  • 有管理员权限。
  • 您已创建了 ClusterLogForwarder 自定义资源 (CR)。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 提取现有的 ClusterLogForwarder 配置并将其保存为本地文件。

    $ oc get clusterlogforwarder <name> -n <namespace> -o yaml > <filename>.yaml
    Copy to Clipboard Toggle word wrap

    其中:

    • &lt;name> 是您要配置的 ClusterLogForwarder 实例的名称。
    • &lt;namespace> 是创建 ClusterLogForwarder 实例的命名空间,如 openshift-logging
    • <filename > 是保存配置的本地文件的名称。
  2. 将配置添加到 ClusterLogForwarder CR 的 filters spec 中。

    重要

    如果您同时指定了 innotIn 参数,则 notIn 数组在修剪过程中优先于。在使用 notIn 数组修剪记录后,会使用 in 数组修剪它们。

    ClusterLogForwarder CR 示例

    apiVersion: observability.openshift.io/v1
    kind: ClusterLogForwarder
    metadata:
      name: instance
      namespace: openshift-logging
    spec:
      serviceAccount:
        name: my-account
      filters:
      - name: prune-filter
        type: prune 
    1
    
        prune: 
    2
    
          in: [.kubernetes.annotations, .kubernetes.namespace_id] 
    3
    
          notIn: [.kubernetes,.log_type,.message,."@timestamp",.log_source] 
    4
    
      pipelines:
      - name: my-pipeline 
    5
    
        filterRefs: ["prune-filter"]
      # ...
    Copy to Clipboard Toggle word wrap

    1
    指定过滤器的类型。prune 过滤器根据配置的字段修剪日志记录。
    2
    指定 prune 过滤器的配置选项。
    • innotIn 字段是日志记录中字段的以点分隔的路径的数组。
    • 每个路径片段可以包含字母数字字符和下划线、a-zA-Z0-9_,如 .kubernetes.namespace_name
    • 如果片段包含不同的字符,则片段必须在引号里,例如 . kubernetes.labels."app.version-1.2/beta "。
    3
    可选:指定要从日志记录中删除的字段。日志收集器保留所有其他字段。
    4
    可选:指定要保留在日志记录中的字段。日志收集器移除所有其他字段。
    5
    指定 prune 过滤器应用到的管道。
    重要
    • 过滤器不能从日志记录中删除 .log_type.log_source.message 字段。您必须在 notIn 字段中包含它们。
    • 如果使用 googleCloudLogging 输出,则必须在 notIn 字段中包含 .hostname
  3. 运行以下命令来应用 ClusterLogForwarder CR:

    $ oc apply -f <filename>.yaml
    Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat