查看舰队日志

本页面介绍了如何启用和查看舰队的日志。通过舰队日志记录,可同时汇总多个日志并限定其范围,使您能够在一个合并视图中分析应用的健康状况。本页面适用于:

  • 想要启用舰队日志记录并查看所有命名空间中的日志的平台管理员。
  • 想要查看其有权访问的特定命名空间中的日志的服务运维人员。

概览

借助舰队日志,您可以查看整个舰队级层或特定团队范围的日志。范围是一项团队管理功能,可让您按团队定义舰队日志和其他资源的子集,并且每个范围都与一个或多个舰队成员集群相关联。如需详细了解范围,请参阅管理舰队的团队

您可以查看两种类型的舰队日志:

  • 默认日志:所有不属于具有以下资源类型的任何特定舰队范围的 Kubernetes 日志(审核日志除外):

    • k8s_container
    • k8s_pod
    • k8s_node
    • k8s_cluster
    • k8s_control_plane_components
  • 舰队范围日志:团队所拥有的应用的容器和 Pod 日志,部署在具有多个舰队级命名空间的特定舰队范围中。

查看舰队范围日志是可选操作。如果您不想设置团队管理,仍可以使用舰队日志记录来查看默认日志。

日志可以路由到具有不同访问权限控制视图的舰队宿主项目中的不同日志存储桶。日志存储桶的默认保留期限为 30 天。您可以根据需要配置此期限

日志路由支持两种模式,其中舰队包含来自多个项目的集群(跨项目注册):

  • MOVE:所有日志都会移至舰队宿主项目。如果舰队中的集群属于其他项目,则其日志不会保留在原始 Google Cloud 项目中。

  • COPY:所有日志都会发送到舰队宿主项目。如果舰队中的集群属于其他项目,则其日志还会保留在原始 Google Cloud 项目中。

须知事项

  1. 如果您已手动创建 Cloud Logging 存储桶接收器并已设置排除项过滤条件,请确保您分配给这些对象的名称不会与舰队日志记录命名限制冲突。如果存在命名冲突,请与支持团队联系,然后再继续操作。

  2. 确保要查看其日志的集群已注册到您选择的舰队

  3. 如果您尚未安装 Google Cloud CLI,请按照安装说明进行安装。您需要 424.0.0 或更高版本才能查看舰队日志。

  4. 确保您的舰队宿主项目已启用所有必要的 API,包括 Anthos API:

    gcloud services enable --project=FLEET_HOST_PROJECT_ID  \
    gkehub.googleapis.com \
    container.googleapis.com \
    connectgateway.googleapis.com \
    cloudresourcemanager.googleapis.com \
    iam.googleapis.com \
    anthos.googleapis.com
    

    其中:

准备范围、命名空间和工作负载

如果您要查看舰队范围日志,则除了准备工作负载以进行日志收集之外,还需要创建舰队范围和舰队命名空间。

在继续操作之前,请运行以下命令为 Google Cloud CLI 设置默认项目:

gcloud config set project FLEET_HOST_PROJECT_ID

创建范围和命名空间

如果您要查看范围级层的日志,但尚未设置范围,请按照管理舰队的团队中的说明创建范围、将集群添加到范围并设置舰队命名空间。

准备工作负载

如需查看应用中的日志数据,您需要将集群中的工作负载部署到上一步中配置的舰队命名空间。无论您是选择查看默认日志、舰队范围日志还是同时查看两者,此步骤都适用。以下是配置工作负载的示例:

  apiVersion: v1
  kind: Pod
  metadata:
    name: fleet-example-pod
    namespace: NAMESPACE_NAME
  spec:
    containers:
    - name: count
      image: ubuntu:14.04
      args: [bash, -c,
           'for ((i = 0; ; i++)); do echo "$i: $(date)"; sleep 1; done']

部署资源后,如果舰队命名空间由于某种原因无法创建,您可能会看到错误。在这种情况下,请运行以下命令以再次创建命名空间,然后重新运行工作负载部署命令:

  kubectl create namespace NAMESPACE_NAME
  

启用舰队日志记录

本部分介绍了如何启用舰队日志记录功能并授予团队查看日志的权限。

gcloud

  • 您可以使用 Google Cloud CLI 启用舰队日志记录,只需在 JSON 或 YAML 文件中指定功能的配置字段即可。以下是 JSON 格式的舰队日志记录的配置示例:

    {
      "loggingConfig": {
          "defaultConfig": {
              "mode": "COPY"
          },
          "fleetScopeLogsConfig": {
              "mode": "MOVE"
          }
      }
    }
    

如需查看您可以为此功能配置的所有字段,请参阅 API 参考文档

使用 COPYMOVE 模式启用 defaultConfigfleetScopeLogsConfig 字段后(如上例中所示),系统会创建一个前缀为 fleet-o11y- 的日志接收器。此日志接收器在 Google Cloud 项目下创建,用于将目标日志从集群项目路由到舰队宿主项目。

启用 fleetScopeLogsConfig 后,系统还会在舰队宿主项目下的 global 区域中创建名为 fleet-o11y-scope-$SCOPE_NAME 的日志存储桶(如果尚不存在)。请注意,您无法更改存储桶的区域。

在此示例中,默认日志将发送到舰队宿主项目,并保留在原始 Google Cloud 项目中,而舰队范围日志将发送到舰队宿主项目,且不会保留在 Google Cloud 项目中。

  • 将您选择的配置添加到 JSON 文件中,并更新舰队:

    gcloud container fleet fleetobservability update \
            --logging-config=JSON_FILE
    

JSON_FILE 替换为您的文件名。

Terraform

  • 舰队可观测性功能默认处于启用状态。如果这是您第一次使用 Terraform 管理舰队可观测性功能,请通过运行以下命令将该功能导入 Terraform:
terraform import google_gke_hub_feature.feature projects/FLEET_HOST_PROJECT_ID/locations/global/features/fleetobservability

例如,您可以将以下地址块添加到 Terraform 配置:

  resource "google_gke_hub_feature" "feature" {
    name = "fleetobservability"
    location = "global"
    spec {
      fleetobservability {
        logging_config {
          default_config {
            mode = "COPY"
          }
          fleet_scope_logs_config {
            mode = "MOVE"
          }
        }
      }
    }
  }

使用 COPYMOVE 模式启用 default_configfleet_scope_logs_config 字段后(如上例中所示),系统会创建一个前缀为 fleet-o11y- 的日志接收器。此日志接收器在 Google Cloud 项目下创建,用于将目标日志从集群项目路由到舰队宿主项目。

启用 fleet_scope_logs_config 后,系统会在舰队宿主项目下创建名为 fleet-o11y-scope-$SCOPE_NAME 的日志存储桶(如果尚不存在)。

在此示例中,默认日志将发送到舰队宿主项目,并保留在原始 Google Cloud 项目中,而舰队范围日志将发送到舰队宿主项目,且不会保留在 Google Cloud 项目中。

验证此功能规范是否已更新:

   gcloud container fleet fleetobservability describe
  

输出会显示使用该配置更新的 fleetobservability 规范,如以下示例所示:

createTime: '2022-09-30T16:05:02.222568564Z'
membershipStates:
  projects/123456/locations/us-central1/memberships/cluster-1:
    state:
      code: OK
      description: Fleet monitoring enabled.
      updateTime: '2023-04-03T20:22:51.436047872Z'
name:
projects/123456/locations/global/features/fleetobservability
resourceState:
  state: ACTIVE
spec:
  fleetobservability:
    loggingConfig:
      defaultConfig:
        mode: COPY
      fleetScopeLogsConfig:
        mode: MOVE
state:
  state: {}
updateTime: '2023-04-03T20:38:17.719596966Z'

fleetobservability 规范所做的任何更改可能需要几分钟才能应用。

设置跨项目日志记录权限

仅当您要将集群注册到其他项目中的舰队(也称为跨项目注册)时,才需要按照本部分执行操作。如需将日志从集群项目路由到舰队宿主项目,您必须向每个集群项目中的日志记录服务账号授予 roles/logging.bucketWriter 角色。

  1. 如需从集群项目的接收器获取服务账号凭据,请运行以下命令:

    FLEET_HOST_PROJECT_ID=FLEET_HOST_PROJECT_ID
    FLEET_HOST_PROJECT_NUMBER=$(gcloud projects describe "${FLEET_HOST_PROJECT_ID}" --format "value(projectNumber)")
    gcloud logging sinks --project=GKE_PROJECT_ID describe fleet-o11y-${FLEET_HOST_PROJECT_NUMBER}-default
    

    如果该命令返回找不到日志接收器的错误,请尝试在一两分钟后重新运行该命令。您可以在接收器说明的 writerIdentity 字段中查看服务账号,如以下示例所示:

    createTime: '2023-04-06T02:26:54.716195307Z'
    destination:
    logging.googleapis.com/projects/123456/locations/global/buckets/_Default
    filter: xxx
    name: fleet-o11y-default
    updateTime: '2023-04-06T19:03:51.598668462Z'
    writerIdentity:
    serviceAccount:service-123456@gcp-sa-logging.iam.gserviceaccount.com
    
  2. 向检索到的服务账号授予 roles/logging.bucketWriter 角色:

    gcloud projects add-iam-policy-binding FLEET_HOST_PROJECT_ID \
        --member "SERVICE_ACCOUNT" \
        --role "roles/logging.bucketWriter"
    

    其中:

    • SERVICE_ACCOUNT 是在上一步中检索到的服务账号的名称。例如:
    gcloud projects add-iam-policy-binding FLEET_HOST_PROJECT_ID \
        --member "serviceAccount:service-123456@gcp-sa-logging.iam.gserviceaccount.com" \
        --role "roles/logging.bucketWriter"
    

授予团队访问日志的权限

该部分介绍了如何向用户授予查看容器日志和 Pod 日志的权限。

  1. 获取舰队项目的 IAM 政策,然后将其写入 JSON 格式的本地文件:

    gcloud projects get-iam-policy FLEET_HOST_PROJECT_ID --format json > output.json
    
  2. 添加一个 IAM 条件,可让用户账号查看您创建的日志存储桶中的数据。以下是查看容器日志和 Pod 日志的示例:

    {
      "bindings": [
        {
          "members": [
            "user:USER_ACCOUNT_EMAIL"
          ],
          "role": "roles/logging.viewAccessor",
          "condition": {
              "title": "Bucket reader condition example",
              "description": "Grants logging.viewAccessor role to user USER_ACCOUNT_EMAIL for the fleet-o11y-scope-SCOPE_NAME-k8s_container and fleet-o11y-scope-SCOPE_NAME-k8s_pod log view.",
              "expression":
                "resource.name == \"projects/FLEET_HOST_PROJECT_ID/locations/global/buckets/fleet-o11y-scope-SCOPE_NAME/views/fleet-o11y-scope-SCOPE_NAME-k8s_container\" || resource.name == \"projects/FLEET_HOST_PROJECT_ID/locations/global/buckets/fleet-o11y-scope-SCOPE_NAME/views/fleet-o11y-scope-SCOPE_NAME-k8s_pod\""
          }
        }
      ],
    }
    
  3. 更新 IAM 政策:

    gcloud projects set-iam-policy FLEET_HOST_PROJECT_ID output.json
    

如需查看有关如何授予访问权限的更多选项,请参阅授予对日志视图的访问权限

查看舰队日志

平台管理员有权查看所有命名空间中的所有日志。

默认日志

如需查看舰队宿主项目的 _Default 存储桶中的所有默认日志,请填写以下网址中的变量,然后将其复制并粘贴到浏览器中:

https://console.cloud.google.com/logs/query;query=;storageScope=storage,projects%2FFLEET_HOST_PROJECT_ID%2Flocations%2Fglobal%2Fbuckets%2F_Default%2Fviews%2F_Default?jsmode=O&mods=pan_ng2&project=FLEET_HOST_PROJECT_ID

舰队范围容器日志和 Pod 日志

服务运维人员可以查看他们有权访问的命名空间中的日志。 如需查看特定舰队范围内所有命名空间的日志,请完成以下步骤:

  1. 选择舰队宿主项目后,前往 Google Cloud 控制台中的团队部分。

    前往“团队”

  2. 点击您要查看其日志的团队范围,然后点击日志标签页。

  3. 选择容器日志Pod 日志以过滤日志视图。

如需查看范围内特定命名空间的日志,请执行以下操作:

  1. 团队页面中,选择团队范围后,点击命名空间标签页。
  2. 点击您要查看其日志的命名空间,然后点击日志标签页。
  3. 选择容器日志Pod 日志以过滤日志视图。

或者,如需查看容器日志,请填写以下网址中的变量,然后将其复制并粘贴到浏览器中:

https://console.cloud.google.com/logs/query;query=;storageScope=storage,projects%2FFLEET_HOST_PROJECT_ID%2Flocations%2Fglobal%2Fbuckets%2Ffleet-o11y-scope-SCOPE_NAME%2Fviews%2Ffleet-o11y-scope-SCOPE_NAME-k8s_container?jsmode=O&mods=pan_ng2&project=FLEET_HOST_PROJECT_ID

如需查看特定舰队范围中的 Pod 日志,请填写以下网址中的变量,然后将其复制并粘贴到浏览器中:

https://console.cloud.google.com/logs/query;query=;storageScope=storage,projects%2FFLEET_HOST_PROJECT_ID%2Flocations%2Fglobal%2Fbuckets%2Ffleet-o11y-scope-SCOPE_NAME%2Fviews%2Ffleet-o11y-scope-SCOPE_NAME-k8s_pod?jsmode=O&mods=pan_ng2&project=FLEET_HOST_PROJECT_ID

如需详细了解如何分析日志数据,请参阅 Logs Explorer 界面

停用舰队日志记录

如需停用舰队日志记录功能,请完成以下步骤:

gcloud

  1. 将以下配置保存到名为 disable_logging_config.json 的文件中:

    {
      "loggingConfig": {}
    }
    
  2. 更新 fleetobservability 特征规范:

    gcloud container fleet fleetobservability update \
            --logging-config=disable_logging_config.json
    

Terraform

在 Terraform 配置中,将日志路由的所有模式更新为 MODE_UNSPECIFIED。示例如下:

  resource "google_gke_hub_feature" "feature" {
    name = "fleetobservability"
    location = "global"
    spec {
      fleetobservability {
        logging_config {
          default_config {
            mode = "MODE_UNSPECIFIED"
          }
          fleet_scope_logs_config {
            mode = "MODE_UNSPECIFIED"
          }
        }
      }
    }
  }

验证此功能规范是否已更新:

   gcloud container fleet fleetobservability describe
  

输出会显示使用您的配置更新的 fleetobservability 规范:

  createTime: '2022-09-30T16:05:02.222568564Z'
  membershipStates:
    projects/123456/locations/global/memberships/cluster-1:
      state:
        code: OK
        description: Fleet monitoring enabled.
        updateTime: '2023-04-03T20:22:51.436047872Z'
  name:
  projects/123456/locations/global/features/fleetobservability
  resourceState:
    state: ACTIVE
  spec:
    fleetobservability:
      loggingConfig: {}
  state:
    state: {}
  updateTime: '2023-04-03T20:38:17.719596966Z'
  

fleetobservability 规范所做的任何更改可能需要几分钟才能应用。

停用舰队日志记录后,日志接收器和排除项过滤条件将从项目中移除。但是,为范围创建的所有日志存储桶以及在日志存储桶下创建的日志视图都将保留。如需删除舰队宿主项目中的日志存储桶,请参阅删除存储桶

更新日志存储桶的保留期限

日志存储桶的默认保留期限为 30 天。如需更新此期限,请运行以下命令:

gcloud logging buckets update fleet-o11y-scope-SCOPE_NAME --location=global --retention-days=RETENTION_DAYS

其中:

  • SCOPE_NAME 是舰队范围的名称。

  • RETENTION_DAYS 是新保留期限的天数。如需查看有关如何配置日志存储桶的更多选项,请参阅管理存储桶

如果您延长存储桶的保留期限,则保留规则会在以后应用,并且不会追溯应用。日志在适用的保留期限结束后无法恢复。

API 参考文档

本部分介绍了您可以添加到 fleetobservability 对象的可能字段。

fleetobservability

fleetobservability 定义舰队可观测性配置。

字段 说明 架构 可选
loggingConfig

如果指定此字段,则整个舰队会启用舰队日志记录功能。

如果未指定此字段,则整个舰队会停用舰队日志记录功能。

loggingConfig True

loggingConfig

loggingConfig 定义舰队可观测性中的舰队日志记录功能的配置。

字段 说明 架构 可选
defaultConfig 为舰队中的默认日志设置日志路由行为。 routingConfig True
fleetScopeLogsConfig 为舰队范围日志设置日志路由行为。 routingConfig True

routingConfig

routingConfig 定义舰队日志记录功能中的日志路由模式的配置。

字段 说明 架构 可选
模式

指定此字段可启用日志路由,未指定或为 MODE_UNSPECIFIED 可停用日志路由。

如果设置为 COPY,则日志会复制到目标项目。

如果设置为 MOVE,则日志会移至目标项目。

字符串;MOVE、COPY 和 MODE_UNSPECIFIED 之一 True

命名限制

启用舰队可观测性后,舰队可观测性控制器会为它创建的日志对象预留以下名称。为避免不希望的行为或意外行为,您应该在创建自己的日志存储桶接收器以及设置排除项过滤条件时避免使用这些名称。

已启用的功能 创建了对象 舰队可观测性使用的名称
defaultConfig 接收器 fleet-o11y-FLEET_PROJECT_NUMBER-default
排除项过滤条件。 fleet-o11y-FLEET_PROJECT_NUMBER-default-exclusion。此名称预留在集群项目的 _Default 接收器下。
fleetScopeLogsConfig 日志存储桶 fleet-o11y-scope-SCOPE_NAME
  • 存储桶中的容器日志的日志视图
  • fleet-o11y-scope-SCOPE_NAME-k8s_container
  • 存储桶中的 Pod 日志的日志视图
  • fleet-o11y-scope-SCOPE_NAME-k8s_pod
    接收器 fleet-o11y-FLEET_PROJECT_NUMBER-scope-SCOPE_NAME
    排除项过滤条件 fleet-o11y-FLEET_PROJECT_NUMBER-scope-exclusion

    问题排查

    本部分介绍了如何解决舰队日志记录相关问题。

    有关接收器配置错误的电子邮件通知

    如果您收到标题为 [ACTION REQUIRED] Cloud Logging sink configuration error in <Your GCP Project> 的电子邮件,则表示日志接收器的服务账号无权将日志写入接收器的目标位置。如需解决此问题,请按照跨项目日志记录权限中的步骤操作。

    Cloud Logging 界面返回未知错误消息

    如果您在 Cloud Logging 界面中看到以下错误,请核查网址中输入的 project_idscope 变量是否正确。

    Error: There is an unknown error while executing this operation.
    

    “找不到成员资格”错误

    您可能会看到以下错误:

    ERROR: (gcloud.alpha.container.fleet.memberships.bindings.create) NOT_FOUND: Resource 'parent resource not found for projects/...' was not found
    

    确保您已向舰队注册集群