本页面介绍如何将关联集群中的日志和指标导出到 Cloud Logging 和 Cloud Monitoring。
工作原理
Google Cloud Observability 是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 导出边车容器的 Prometheus StatefulSet,用于将 Prometheus 指标发送到 Cloud Monitoring(原 Stackdriver Monitoring)API。Sidecar 是同一 pod 内的另一个容器,该容器读取 prometheus 服务器存储在磁盘上的指标,并将其转发到 Cloud Monitoring API。
前提条件
- 启用了结算功能的 Google Cloud 项目。请参阅我们的价格指南了解 Cloud Operations 费用。 
- 一个关联集群,已使用此指南注册。运行以下命令来验证集群是否已注册。 - gcloud container fleet memberships list - 输出示例: - NAME EXTERNAL_ID eks ae7b76b8-7922-42e9-89cd-e46bb8c4ffe4 
- 您可以在其中访问集群并运行 - kubectl命令的本地环境。如需了解如何通过 gcloud 安装- kubectl,请参阅 GKE 快速入门。运行以下命令,验证您可以使用- kubectl访问连接集群。- kubectl cluster-info - 输出示例: - Kubernetes master is running at https://[redacted].gr7.us-east-2.eks.amazonaws.com 
设置
- 克隆示例代码库并导航到本指南的目录。 - git clone https://github.com/GoogleCloudPlatform/anthos-samples cd anthos-samples/attached-logging-monitoring 
- 将项目 ID 变量设置为您在其中注册集群的项目。 - PROJECT_ID="your-project-id" 
- 创建一个 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
- 为您刚刚创建的服务账号创建并下载 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 代理
- 切换到 - logging/目录。- cd logging/ 
- 打开 - 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 
- 在 - aggregator.yaml中的- volumeClaimTemplates/spec下,为集群指定 PersistentVolumeClaim- storageClassName:我们已为 EKS 和 AKS 提供默认值,您可以视情况取消备注。如果您使用的是 EKS,则此值为- gp2。对于 AKS,该值为- default。- 如果您在 AWS 或 Azure 中配置了自定义 Kubernetes 存储类别,并希望使用非默认存储类别或者使用其他符合的集群类型,则可以添加自己的 - storageClassName。相应的- storageClassName基于使用- StorageClass为集群管理员预配的 PersistentVolume (PV) 类型。如需详细了解存储类别以及其他主要 Kubernetes 提供商的默认存储类别,请参阅 Kubernetes 文档。- # storageClassName: standard #Google Cloud # storageClassName: gp2 #AWS EKS # storageClassName: default #Azure AKS 
- 将日志聚合器和转发器部署到集群。 - kubectl apply -f aggregator.yaml kubectl apply -f forwarder.yaml 
- 验证 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 
- 获取聚合器日志,并验证日志是否正发送到 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. 
- 将测试应用部署到您的集群。这是一个具有 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 
- 验证您是否可以在 Cloud Logging 信息中心内查看来自连接集群的日志。在 Google Cloud 控制台中前往 Logs Explorer: 
- 在 Logs Explorer 中,将以下示例查询复制到查询构建器字段中,将 - ${your-cluster-name}替换为您的集群名称。点击 Run Query。您应该会在 Query results 下方看到最近的集群日志。- resource.type="k8s_container" resource.labels.cluster_name="${your-cluster-name}"

安装 Monitoring 代理
- 从 - logging/目录转到- monitoring/目录。- cd ../monitoring 
- 打开 - 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]" 
- 在 prometheus.yaml 的 - volumeClaimTemplates/spec下,按照“安装 Logging 代理”中的说明,取消对匹配您的云服务商的- storageClassName的备注。- # storageClassName: standard #Google Cloud # storageClassName: gp2 #AWS EKS # storageClassName: default #Azure AKS 
- 将配置了导出器 Sidecar 的 stackdriver-prometheus StatefulSet 部署到您的集群。 - kubectl apply -f server-configmap.yaml kubectl apply -f sidecar-configmap.yaml kubectl apply -f prometheus.yaml 
- 验证 - stackdriver-prometheuspod 是否正在运行。- watch kubectl get pods -n kube-system | grep stackdriver-prometheus - stackdriver-prometheus-k8s-0 2/2 Running 0 5h24m 
- 获取 Stackdriver Prometheus 边车容器日志以验证 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" 
- 验证集群指标是否已成功导出到 Cloud Monitoring。在 Google Cloud 控制台中前往 Metrics Explorer。 
- 点击查询编辑器,然后复制以下命令,将 - ${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

清理
- 要移除在本指南中创建的所有资源,请运行以下命令: - 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