如何在 EKS 集群上启用 Container Insights 指标?

上次更新日期:2022 年 5 月 13 日

我想配置 Amazon CloudWatch Container Insights,并查看我的 Amazon Elastic Kubernetes Service (Amazon EKS)集群指标。我该如何操作?

简短描述

与 Amazon EKS 配合使用时,Container Insights 使用容器化版本的 CloudWatch 代理或适用于 OpenTelemetry 的 AWS Distro(ADOT)收集器来查找在集群中运行的所有容器。然后,它会在性能堆栈的每一层收集性能数据。Container Insights 使用嵌入式指标格式收集性能录入事件等数据。然后,它会将这些数据发送到 /aws/containerinsights/cluster-name/performance 日志组下的 CloudWatch Logs。根据这些数据,CloudWatch 在集群、节点和 pod 级别创建聚合指标。容器见解还支持从部署在 AWS Fargate for Amazon EKS 上的集群中收集指标。有关 Container Insights 的更多信息,请参阅使用 Container Insights

注意:Container Insights 仅在 Linux 实例上受支持。Amazon 在 Amazon Elastic Container Registry(Amazon ECR)上提供了 CloudWatch 代理容器映像。有关更多信息,请参阅 Amazon ECR 上的 cloudwatch-agent

解决方案

先决条件

在执行这些步骤之前,请查看先决条件:

  • 您的 EKS 集群正在运行,节点处于“就绪”状态,kubectl 命令已安装且正在运行。
  • AWS Identity and Access Management(IAM)的 CloudWatchAgentServerPolicy 已经到位,允许您的 Amazon EKS Worker 节点将指标和日志发送到 CloudWatch。您可以通过将策略附加到 Worker 节点的 IAM 角色来实现此目的。或者,为集群的服务账户使用 IAM 角色,并将策略附加到此角色。有关更多信息,请参阅服务账户的 IAM 角色
  • 您正在运行支持 Kubernetes 1.18 或更高版本的集群。这是 Container Insights for EKS Fargate 的要求。您还定义了一个 Fargate 配置文件以在 Fargate 上调度 pod。
  • EKS pod 执行角色已经到位,允许在 Fargate 基础设施上运行的组件代表您调用 AWS API。例如,从 Amazon ECR 中提取容器映像。

使用 CloudWatch 代理在 EKS EC2 集群上设置 Container Insights 指标

CloudWatch 代理或适用于 OpenTelemetry 的 AWS Distro 会创建一个名为 aws/containerinsights/Cluster_Name/performance 的日志组。然后,他们将性能录入事件发送到此日志组。

要设置 Container Insights 以收集指标,请按照以下步骤操作:默认情况下,将 CloudWatch 代理容器映像部署为来自 Docker Hub 的 Daemonset 作为匿名用户。此拉取可能会受到速率限制的约束。

1.    如果您还没有命名空间,请创建一个名为 amazon-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 代理创建一个名为 cloudwatch-agent 的服务账户:

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

3.    创建一个 configmap 以作为 CloudWatch 代理的配置文件:

ClusterName=<my-cluster-name>
curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-configmap.yaml | sed 's/cluster_name/'${ClusterName}'/' | kubectl apply -f -

重要提示:将 my-cluster-name 替换为您的 EKS 集群的名称。要进一步自定义 CloudWatch 代理配置,请参阅为 CloudWatch 代理创建 ConfigMap

4.    可选:要从 Amazon Elastic Container Registry 中提取 CloudWatch 代理,请修补 cloudwatch-agent DaemonSet:

kubectl patch ds cloudwatch-agent -n amazon-cloudwatch -p \
 '{"spec":{"template":{"spec":{"containers":[{"name":"cloudwatch-agent","image":"public.ecr.aws/cloudwatch-agent/cloudwatch-agent:latest"}]}}}}'

注意:ECR 上的 Cloudwatch-Agent Docker 镜像支持 ARM 和 AMD64 架构。根据镜像版本和架构替换最新的镜像标签。有关更多信息,请参阅 Amazon ECR 上的图像标签 cloudwatch-agent

5.    对于服务账户的 IAM 角色,请创建 OIDC 提供商以及一个 IAM 角色和策略。然后,将 IAM 角色关联到 cloudwatch-agent 服务账户。ACCOUNT_IDIAM_ROLE_NAME 替换为 AWS 账户 ID 和用于服务账户的 IAM 角色。

kubectl annotate serviceaccounts cloudwatch-agent -n amazon-cloudwatch "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"

排查 CloudWatch 代理的问题

1.    运行以下命令获取 pod 的列表:

kubectl get pods -n amazon-cloudwatch

2.    运行此命令并检查输出底部的事件:

kubectl describe pod pod-name -n amazon-cloudwatch

3.    运行以下命令以检查日志:

kubectl logs pod-name -n amazon-cloudwatch

4.    如果您看到 CloudWatch 代理的 CrashLoopBackOff 错误,请确保您的 IAM 权限已正确设置。

有关更多信息,请参阅验证先决条件

删除 CloudWatch 代理

使用以下命令删除 CloudWatch 代理:

kubectl delete -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
kubectl delete -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
ClusterName=<my-cluster-name>
curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-configmap.yaml | sed 's/cluster_name/'${ClusterName}'/' | kubectl delete -f -

使用 ADOT 在 EKS EC2 集群上设置 Container Insights 指标

1.    运行此命令将 ADOT 收集器部署为 Cloudwatch。有关更多自定义项,请参阅 Container Insights EKS 基础设施指标

curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-container-insights-infra.yaml | kubectl apply -f -

2.    确认收集器正在运行:

kubectl get pods -l name=aws-otel-eks-ci -n aws-otel-eks

3.    可选:默认情况下,aws-otel-collector 映像是以匿名用户身份从 Docker Hub 中拉取的。此拉取可能会受到速率限制的约束。要在 Amazon ECR 上提取 aws-otel-collector Docker 镜像,请修补 aws-otel-eks-ci DaemonSet:

kubectl patch ds aws-otel-eks-ci -n aws-otel-eks -p \
'{"spec":{"template":{"spec":{"containers":[{"name":"aws-otel-collector","image":"public.ecr.aws/aws-observability/aws-otel-collector:latest"}]}}}}'

注意:ECR 上的 Cloudwatch-Agent Docker 镜像支持 ARM 和 AMD64 架构。根据镜像版本和架构替换最新的镜像标签。有关更多信息,请参阅 Amazon ECR 上的图像标签 cloudwatch-agent

5.    可选:对于服务账户的 IAM 角色,请创建 OIDC 提供商以及 IAM 角色和策略。然后,将 IAM 角色关联到 aws-otel-sa 服务账户。将 ACCOUNT_IDIAM_ROLE_NAME 替换为 AWS 账户 ID 和用于服务账户的 IAM 角色。

kubectl annotate serviceaccounts aws-otel-sa -n aws-otel-eks "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"

删除 ADOT

要删除适用于 OpenTelemetry 的 AWS Distro,请运行以下命令:

curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-container-insights-infra.yaml |
kubectl delete -f -

使用 ADOT 在 EKS Fargate 集群上设置 Container Insights 指标

对于在 Amazon EKS 和 AWS Fargate 上运行的应用程序,您可以使用 ADOT 设置 Container Insights。EKS Fargate 联网架构不允许 Pod 直接访问工件上的 kubelet 来检索资源指标。ADOT 收集器调用 Kubernetes API 服务器来代理与 Worker 节点上的 kubelet 的连接。然后,它会收集 kubelet 关于该节点上工作负载的顾问指标。

注意:单个 ADOT 收集器实例不足以从集群中的所有节点收集资源指标。

对于在 EKS Fargate 上运行的每个工作负载,ADOT 收集器都会将这些指标发送到 CloudWatch:

  • pod_cpu_utilization_over_pod_limit
  • pod_cpu_usage_total
  • pod_cpu_limit
  • pod_memory_utilization_over_pod_limit
  • pod_memory_working_set
  • pod_memory_limit
  • pod_network_rx_bytes
  • pod_network_tx_bytes

每个指标都与以下维度集相关联,并在名为 ContainerInsights 的 CloudWatch 命名空间下收集。

  • ClusterName、LaunchType
  • ClusterName、Namespace、LaunchType
  • ClusterName、Namespace、PodName、LaunchType

有关更多详细信息,请访问 Container Insights EKS Fargate 页面。

请按照以下步骤在您的 EKS Fargate 中部署 ADOT:

1.    将 Kubernetes 服务账户与 IAM 角色关联。创建一个名为 EKS-ADOT-ServiceAccount-Role 的 IAM 角色,该角色与名为 adot-collector 的 Kubernetes 服务账户关联。请务必更改集群名称和区域变量。该辅助脚本需要 eksctl

#!/bin/bash
CLUSTER_NAME=YOUR-EKS-CLUSTER-NAME
REGION=YOUR-EKS-CLUSTER-REGION
SERVICE_ACCOUNT_NAMESPACE=fargate-container-insights
SERVICE_ACCOUNT_NAME=adot-collector
SERVICE_ACCOUNT_IAM_ROLE=EKS-Fargate-ADOT-ServiceAccount-Role
SERVICE_ACCOUNT_IAM_POLICY=arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy

eksctl utils associate-iam-oidc-provider \
--cluster=$CLUSTER_NAME \
--approve

eksctl create iamserviceaccount \
--cluster=$CLUSTER_NAME \
--region=$REGION \
--name=$SERVICE_ACCOUNT_NAME \
--namespace=$SERVICE_ACCOUNT_NAMESPACE \
--role-name=$SERVICE_ACCOUNT_IAM_ROLE \
--attach-policy-arn=$SERVICE_ACCOUNT_IAM_POLICY \
--approve

2.    使用此命令将 ADOT 收集器部署为 Kubernetes StatefulSet 副本集。将 my-cluster-name 替换为您的 EKS 集群的名称,将 my-cluster-region 替换为区域名称。

ClusterName=<my-cluster-name>
Region=<my-cluster-region>
curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-fargate-container-insights.yaml | sed 's/YOUR-EKS-CLUSTER-NAME/'${ClusterName}'/;s/us-east-1/'${Region}'/' | kubectl apply -f -

3.    验证 ADOT 收集器 pod 是否正在运行:

kubectl get pods -n fargate-container-insights

4.    可选:默认情况下,aws-otel-collector 映像是以匿名用户身份从 Docker Hub 中提取的。此拉取可能会受到速率限制的约束。要在 Amazon ECR 上提取 aws-otel-collector Docker 镜像,请修补 aws-otel-eks-ci DaemonSet:

kubectl patch sts adot-collector -n fargate-container-insights -p \
'{"spec":{"template":{"spec":{"containers":[{"name":"aws-otel-collector","image":"public.ecr.aws/aws-observability/aws-otel-collector:latest"}]}}}}'

删除 ADOT

运行这些命令以删除 ADOT。

eksctl delete iamserviceaccount —cluster CLUSTER_NAME —name adot-collector
ClusterName=<my-cluster-name>
Region=<my-cluster-region>
curl https://raw.githubusercontent.com/aws-observability/aws-otel-collector/main/deployment-template/eks/otel-fargate-container-insights.yaml | sed 's/YOUR-EKS-CLUSTER-NAME/'${ClusterName}'/;s/us-east-1/'${Region}'/' | kubectl delete -f -

这篇文章对您有帮助吗?


您是否需要账单或技术支持?