Anthos 连接集群的日志记录和监控

本页面介绍如何将日志和指标从 Anthos 连接集群导出到 Cloud Logging 和 Cloud Monitoring。

工作原理

Google Cloud 的运维套件是 Google Cloud 的内置可观测性解决方案。要将集群级遥测数据从连接集群导出到 Google Cloud,您需要将以下开源导出代理部署到集群中:

  • Stackdriver Log Aggregator (stackdriver-log-aggregator-*)。将日志发送到 Cloud Logging(原 Stackdriver Logging)API 的 Fluentd StatefulSet。
  • Stackdriver Log Forwarder (stackdriver-log-forwarder-*)。将每个 Kubernetes 节点的日志转发到 Stackdriver Log Aggregator 的 Fluentbit daemonset。
  • Stackdriver Metrics Collector (stackdriver-prometheus-k8s-*)。配置了 Stackdriver 导出 Sidecar 容器的 Prometheus StatefulSet,用于将 Prometheus 指标发送到 Cloud Monitoring(原 Stackdriver Monitoring)API。Sidecar 是同一 pod 内的另一个容器,该容器读取 prometheus 服务器存储在磁盘上的指标,并将其转发到 Cloud Monitoring API。

前提条件

  1. 启用了结算功能的 Google Cloud 项目。请参阅我们的价格指南了解 Cloud 运维套件费用。

  2. 一个 Anthos 连接集群,已使用此指南注册。运行以下命令来验证集群是否已注册。

    gcloud container fleet memberships list
    

    输出示例:

    NAME  EXTERNAL_ID
    eks   ae7b76b8-7922-42e9-89cd-e46bb8c4ffe4
    

  3. 您可以在其中访问集群并运行 kubectl 命令的本地环境。如需了解如何通过 gcloud 安装 kubectl,请参阅 GKE 快速入门。运行以下命令,验证您可以使用 kubectl 访问连接集群。

    kubectl cluster-info
    

    输出示例:

    Kubernetes master is running at https://[redacted].gr7.us-east-2.eks.amazonaws.com
    

设置

  1. 克隆示例代码库并导航到本指南的目录。

    git clone https://github.com/GoogleCloudPlatform/anthos-samples
    cd anthos-samples/attached-logging-monitoring
    
  2. 将项目 ID 变量设置为您在其中注册集群的项目。

    PROJECT_ID="your-project-id"
    
  3. 创建一个 Google Cloud 服务帐号,该服务帐号具有将指标和日志写入 Cloud Monitoring 和 Cloud Logging API 的权限。您将把此服务帐号的密钥添加到下一部分中部署的工作负载。

    gcloud iam service-accounts create anthos-lm-forwarder
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:anthos-lm-forwarder@${PROJECT_ID}.iam.gserviceaccount.com" \
      --role=roles/logging.logWriter
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:anthos-lm-forwarder@${PROJECT_ID}.iam.gserviceaccount.com" \
      --role=roles/monitoring.metricWriter
    
  4. 为您刚刚创建的服务帐号创建并下载 JSON 密钥,然后使用该密钥在集群中创建一个 Kubernetes Secret。

    gcloud iam service-accounts keys create credentials.json \
    --iam-account anthos-lm-forwarder@${PROJECT_ID}.iam.gserviceaccount.com
    
    kubectl create secret generic google-cloud-credentials -n kube-system --from-file credentials.json
    

安装 Logging 代理

  1. 切换到 logging/ 目录。

    cd logging/
    
  2. 打开 aggregator.yaml。 在文件的底部,将以下变量设置为与您的项目和集群相对应的值:

    project_id [PROJECT_ID]
    k8s_cluster_name [CLUSTER_NAME]
    k8s_cluster_location [CLUSTER_LOCATION]
    

    如需查找集群位置,请使用连接集群的成员资格名称运行以下命令,然后获取 /locations/<location> 中显示的位置。

    gcloud container fleet memberships describe eks | grep name
    

    输出:

    name: projects/my-project/locations/global/memberships/eks
    

  3. aggregator.yaml 中的 volumeClaimTemplates/spec 下,为集群指定 PersistentVolumeClaim storageClassName:我们已为 EKS 和 AKS 提供默认值,您可以视情况取消备注。如果您使用的是 EKS,则此值为 gp2。对于 AKS,该值为 default

    如果您在 AWSAzure 中配置了自定义 Kubernetes 存储类别,并希望使用非默认存储类别或者使用其他符合的集群类型,则可以添加自己的 storageClassName。相应的 storageClassName 基于使用 StorageClass 为集群管理员预配的 PersistentVolume (PV) 类型。如需详细了解存储类别以及其他主要 Kubernetes 提供商的默认存储类别,请参阅 Kubernetes 文档

    # storageClassName: standard #Google Cloud
    # storageClassName: gp2 #AWS EKS
    # storageClassName: default #Azure AKS
    
  4. 将日志聚合器和转发器部署到集群。

    kubectl apply -f aggregator.yaml
    kubectl apply -f forwarder.yaml
    
  5. 验证 pod 是否已启动。您应该会看到两个聚合器 pod,以及每个 Kubernetes 工作器节点一个转发器 pod。例如,在 4 节点集群中,您应该会看到 4 个转发器 pod。

    kubectl get pods -n kube-system | grep stackdriver-log
    

    输出:

    stackdriver-log-aggregator-0                 1/1     Running   0          139m
    stackdriver-log-aggregator-1                 1/1     Running   0          139m
    stackdriver-log-forwarder-2vlxb              1/1     Running   0          139m
    stackdriver-log-forwarder-dwgb7              1/1     Running   0          139m
    stackdriver-log-forwarder-rfrdk              1/1     Running   0          139m
    stackdriver-log-forwarder-sqz7b              1/1     Running   0          139m
    

  6. 获取聚合器日志,并验证日志是否正发送到 Google Cloud。

    kubectl logs stackdriver-log-aggregator-0 -n kube-system
    

    输出:

    2020-10-12 14:35:40 +0000 [info]: #3 [google_cloud] Successfully sent gRPC to Stackdriver Logging API.
    

  7. 将测试应用部署到您的集群。这是一个具有 loadgenerator 的基本 HTTP 网络服务器。

    kubectl apply -f  https://raw.githubusercontent.com/GoogleCloudPlatform/istio-samples/master/sample-apps/helloserver/server/server.yaml
    
    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/istio-samples/master/sample-apps/helloserver/loadgen/loadgen.yaml
    
  8. 验证您是否可以在 Cloud Logging 信息中心内查看来自连接集群的日志。转到 Google Cloud Console 中的“日志浏览器”。

    转到日志浏览器

  9. 在日志浏览器中,将以下示例查询复制到查询构建器字段中,将 ${your-cluster-name} 替换为您的集群名称。点击 Run Query。您应该会在 Query results 下方看到最近的集群日志。

    resource.type="k8s_container" resource.labels.cluster_name="${your-cluster-name}"
    

连接集群的日志

安装 Monitoring 代理

  1. logging/ 目录转到 monitoring/ 目录。

    cd ../monitoring
    
  2. 打开 prometheus.yaml。 在 stackdriver-prometheus-sidecar/args 下,将以下变量设置为与您的环境匹配的值。

    "--stackdriver.project-id=[PROJECT_ID]"
    "--stackdriver.kubernetes.location=[CLUSTER_LOCATION]"
    "--stackdriver.generic.location=[CLUSTER_LOCATION]"
    "--stackdriver.kubernetes.cluster-name=[CLUSTER_NAME]"
    
  3. 在 prometheus.yaml 的 volumeClaimTemplates/spec 下,按照“安装 Logging 代理”中的说明,取消对匹配您的云服务商的 storageClassName 的备注。

    # storageClassName: standard #Google Cloud
    # storageClassName: gp2 #AWS EKS
    # storageClassName: default #Azure AKS
    
  4. 将配置了导出器 Sidecar 的 stackdriver-prometheus StatefulSet 部署到您的集群。

    kubectl apply -f server-configmap.yaml
    kubectl apply -f sidecar-configmap.yaml
    kubectl apply -f prometheus.yaml
    
  5. 验证 stackdriver-prometheus pod 是否正在运行。

    watch kubectl get pods -n kube-system | grep stackdriver-prometheus
    
    输出:
    stackdriver-prometheus-k8s-0         2/2     Running   0          5h24m
    
  6. 获取 Stackdriver Prometheus Sidecar 容器日志以验证 pod 是否已启动。

    kubectl logs stackdriver-prometheus-k8s-0 -n kube-system stackdriver-prometheus-sidecar
    
    输出:
    level=info ts=2020-11-18T21:37:24.819Z caller=main.go:598 msg="Web server started"
    level=info ts=2020-11-18T21:37:24.819Z caller=main.go:579 msg="Stackdriver client started"
    
  7. 验证集群指标是否已成功导出到 Cloud Monitoring。转到 Google Cloud Console 中的 Metrics Explorer:

    转到 Metrics Explorer

  8. 点击查询编辑器,然后复制以下命令,将 ${your-project-id}${your-cluster-name} 替换为您自己的项目和集群信息。然后点击 Run Query。您应该会看到 1.0.

    fetch k8s_container
    | metric 'kubernetes.io/anthos/up'
    | filter
        resource.project_id == '${your-project-id}'
        && (resource.cluster_name =='${your-cluster-name}')
    | group_by 1m, [value_up_mean: mean(value.up)]
    | every 1m
    

连接集群的 Monitoring

清理

  1. 要移除在本指南中创建的所有资源,请运行以下命令:

    kubectl delete -f logging
    kubectl delete -f monitoring
    kubectl delete secret google-cloud-credentials -n kube-system
    kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/istio-samples/master/sample-apps/helloserver/loadgen/loadgen.yaml
    kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/istio-samples/master/sample-apps/helloserver/server/server.yaml
    rm -r credentials.json
    gcloud compute service-accounts delete anthos-lm-forwarder
    

后续步骤

了解 Cloud Logging:

了解 Cloud Monitoring: