本页面介绍如何将关联集群中的日志和指标导出到 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 导出 Sidecar 容器的 Prometheus StatefulSet,用于将 Prometheus 指标发送到 Cloud Monitoring(原 Stackdriver Monitoring)API。Sidecar 是同一 pod 内的另一个容器,该容器读取 prometheus 服务器存储在磁盘上的指标,并将其转发到 Cloud Monitoring API。
前提条件
启用了结算功能的 Google Cloud 项目。请参阅我们的价格指南了解 Cloud 运维套件费用。
一个关联集群,已使用此指南注册。运行以下命令来验证集群是否已注册。
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
下,为集群指定 PersistentVolumeClaimstorageClassName
:我们已为 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 Console 中的“日志浏览器”。
在日志浏览器中,将以下示例查询复制到查询构建器字段中,将
${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-prometheus
pod 是否正在运行。watch kubectl get pods -n kube-system | grep stackdriver-prometheus
输出:stackdriver-prometheus-k8s-0 2/2 Running 0 5h24m
获取 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"
验证集群指标是否已成功导出到 Cloud Monitoring。转到 Google Cloud Console 中的 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