设置 CloudWatch 代理以收集集群指标
重要
如果您要在 Amazon EKS 集群上安装 Container Insights,我们建议您使用 Amazon CloudWatch Observability EKS 附加组件进行安装,而不是按照本部分中的说明进行安装。有关更多信息和说明,请参阅 安装 Amazon CloudWatch Observability EKS 附加组件。
要设置 Container Insights 以收集指标,您可以按照Amazon EKS 和 Kubernetes 上的 Container Insights 的快速入门设置中的步骤操作,也可以按照本节中的步骤操作。在以下步骤中,您设置 CloudWatch 代理以便能够从集群中收集指标。
如果您要在 Amazon EKS 集群中进行安装,并且在 2023 年 11 月 6 日当天或之后按照本部分中的说明进行操作,则可以在集群中安装针对 Amazon EKS 增强了可观测性的 Container Insights。
步骤 1:为 CloudWatch 创建命名空间
使用以下步骤为 CloudWatch 创建名为 amazon-cloudwatch
的 Kubernetes 命名空间。如果已创建该命名空间,您可以跳过此步骤。
为 CloudWatch 创建命名空间
-
输入以下 命令。
kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml
步骤 2:在集群中创建服务账户
如果您还没有服务账户,请使用以下方法之一为 CloudWatch 代理创建一个服务账户。
使用
kubectl
使用
kubeconfig
文件。
使用 kubectl
进行身份验证
要使用 kubectl
为 CloudWatch 代理创建服务账户
-
输入以下 命令。
kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-serviceaccount.yaml
如果您没有按照前面的步骤进行操作,而是已具有要使用的 CloudWatch 代理的服务账户,则必须确保该账户具有以下规则。此外,在 Container Insights 安装的其余步骤中,您必须使用该服务账户的名称,而不是 cloudwatch-agent
。
rules: - apiGroups: [""] resources: ["pods", "nodes", "endpoints"] verbs: ["list", "watch"] - apiGroups: [ "" ] resources: [ "services" ] verbs: [ "list", "watch" ] - apiGroups: ["apps"] resources: ["replicasets", "daemonsets", "deployments", "statefulsets"] verbs: ["list", "watch"] - apiGroups: ["batch"] resources: ["jobs"] verbs: ["list", "watch"] - apiGroups: [""] resources: ["nodes/proxy"] verbs: ["get"] - apiGroups: [""] resources: ["nodes/stats", "configmaps", "events"] verbs: ["create", "get"] - apiGroups: [""] resources: ["configmaps"] resourceNames: ["cwagent-clusterleader"] verbs: ["get","update"] - nonResourceURLs: ["/metrics"] verbs: ["get", "list", "watch"]
使用 kubeconfig
进行身份验证
或者,您也可以使用 kubeconfig
文件进行身份验证。此方法允许您通过直接在 CloudWatch 代理配置中指定 kubeconfig
路径来避开使用对服务账户。它还允许您消除对 Kubernetes 控制面板 API 进行身份验证的依赖,从而简化设置,并通过以 kubeconfig 文件管理身份验证来潜在提高安全性。
要使用此方法,请更新您的 CloudWatch 代理配置文件以指定 kubeconfig
文件路径,如以下示例所示。
{ "logs": { "metrics_collected": { "kubernetes": { "cluster_name": "
YOUR_CLUSTER_NAME
", "enhanced_container_insights": false, "accelerated_compute_metrics": false, "tag_service": false, "kube_config_path": "/path/to/your/kubeconfig" "host_ip": "
HOSTIP
" } } } }
要创建 kubeconfig
文件,请为具有 system:masters
Kubernetes 角色的 admin/{create_your_own_user}
用户创建证书签名请求(CSR)。然后,使用 Kubernetes 集群的证书颁发机构(CA)签名并创建 kubeconfig
文件。
步骤 3:为 CloudWatch 代理创建 ConfigMap
可以使用以下步骤为 CloudWatch 代理创建 ConfigMap。
为 CloudWatch 代理创建 ConfigMap
-
运行以下命令以将 ConfigMap YAML 下载到
kubectl
客户端主机中:curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-configmap-enhanced.yaml
-
编辑下载的 YAML 文件,如下所示:
-
cluster_name – 在
kubernetes
部分中,将{{cluster_name}}
替换为您的集群的名称。删除{{}}
字符。或者,如果使用的是 Amazon EKS 集群,您可以删除"cluster_name"
字段和值。如果这样做,CloudWatch 代理将从 Amazon EC2 标签中检测集群名称。
-
-
(可选)根据您的监控要求,对 ConfigMap 进行进一步的更改,如下所示:
-
metrics_collection_interval – 在
kubernetes
部分中,您可以指定代理收集指标的频率。默认值为 60 秒。kubelet 中的默认 cadvisor 收集间隔为 15 秒,因此,请不要将该值设置为小于 15 秒。 -
endpoint_override – 在
logs
部分中,如果要覆盖默认端点,您可以指定 CloudWatch Logs 端点。如果您从 VPC 的集群中发布并希望将数据传输到 VPC 终端节点,则可能需要执行该操作。 -
force_flush_interval – 在
logs
部分中,您可以指定在将日志事件发布到 CloudWatch Logs 之前批量处理这些事件的间隔。默认值为 5 秒。 -
region – 默认情况下,代理将指标发布到 Worker 节点所在的区域。要覆盖该区域,您可以在
agent
部分中添加region
字段:例如,"region":"us-west-2"
。 -
statsd 部分 – 如果希望 CloudWatch Logs 代理还在集群的每个 Worker 节点中作为 StatsD 侦听器运行,您可以将
statsd
部分添加到metrics
部分中,如以下示例中所示。有关该部分的其他 StatsD 选项的信息,请参阅 使用 StatsD 检索自定义指标 。"metrics": { "metrics_collected": { "statsd": { "service_address":":8125" } } }
JSON 部分的完整示例如下所示。如果您使用
kubeconfig
文件进行身份验证,请添加kube_config_path
参数以指定 kubeconfig 文件的路径。{ "agent": { "region": "us-east-1" }, "logs": { "metrics_collected": { "kubernetes": { "cluster_name": "MyCluster", "metrics_collection_interval": 60, "kube_config_path": "
/path/to/your/kubeconfig
" //if using kubeconfig for authentication } }, "force_flush_interval": 5, "endpoint_override": "logs.us-east-1.amazonaws.com" }, "metrics": { "metrics_collected": { "statsd": { "service_address": ":8125" } } } }
-
-
运行以下命令以在集群中创建 ConfigMap。
kubectl apply -f cwagent-configmap.yaml
步骤 4:将 CloudWatch 代理部署为 DaemonSet
要完成 CloudWatch 代理安装并开始收集容器指标,请使用以下步骤。
将 CloudWatch 代理部署为 DaemonSet
-
-
如果您不想在集群上使用 StatsD,请输入以下命令。
kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-daemonset.yaml
-
如果您想要使用 StatsD,请执行以下步骤:
-
运行以下命令以将 DaemonSet YAML 下载到
kubectl
客户端主机中。curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-daemonset.yaml
-
取消注释
port
文件中的cwagent-daemonset.yaml
部分,如下所示:ports: - containerPort: 8125 hostPort: 8125 protocol: UDP
-
运行以下命令以在集群中部署 CloudWatch 代理。
kubectl apply -f cwagent-daemonset.yaml
运行以下命令以在集群中的 Windows 节点上部署 CloudWatch 代理。Windows 上的 CloudWatch 代理不支持 StatSD 侦听器。
kubectl apply -f cwagent-daemonset-windows.yaml
-
-
-
运行以下命令以验证是否部署了该代理。
kubectl get pods -n amazon-cloudwatch
在完成后,CloudWatch 代理创建一个名为 /aws/containerinsights/
的日志组,并将性能日志事件发送到该日志组。如果还将该代理设置为 StatsD 侦听器,该代理还会在端口 8125(具有计划运行应用程序 pod 的节点的 IP 地址)上侦听 StatsD 指标。Cluster_Name
/performance
故障排除
如果未正确部署该代理,请尝试执行以下操作:
-
运行以下命令以获取 pod 列表。
kubectl get pods -n amazon-cloudwatch
-
运行以下命令并在输出底部检查事件。
kubectl describe pod
pod-name
-n amazon-cloudwatch -
运行以下命令以检查日志。
kubectl logs
pod-name
-n amazon-cloudwatch