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

4 分钟阅读
0

我想配置 Amazon CloudWatch Container Insights 以查看我的 Amazon Elastic Kubernetes Service(Amazon EKS)集群指标。

简短描述

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

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

解决方法

先决条件

  • 您的 Amazon EKS 集群正在运行,节点处于就绪状态,kubectl 命令已安装并正在运行。
  • AWS Identity and Access Management(IAM)托管的 CloudWatchAgentServerPolicy 可激活您的 Amazon EKS Worker 节点,以向 CloudWatch 发送指标和日志。要激活您的 Worker 节点,请将策略附加到 Worker 节点的 IAM 角色。或者,为集群的服务账户配置一个 IAM 角色,并将该策略附加到该角色。有关详细信息,请参阅服务账户的 IAM 角色
  • 您正在运行一个支持 Kubernetes 1.18 或更高版本的集群。这是运行 EKS Fargate Container Insights 的要求。另外,请务必定义一个 Fargate 配置文件来调度 Fargate 上的容器组。
  • Amazon EKS 容器组 IAM 角色必须允许在 Fargate 基础设施上运行的组件可以代表您调用 AWS API。例如,IAM 角色必须能够从 Amazon ECR 提取容器映像。

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

CloudWatch 代理或 ADOT 首先创建一个名为 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 代理创建 ConfigMap

4.    部署 cloudwatch-agent DaemonSet:

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

(可选)要从 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"}]}}}}'

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

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

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

**注意:**将 ACCOUNT_ID 替换为您的账户 ID,将 IAM_ROLE_NAME 替换为您用于服务账户的 IAM 角色。

对 CloudWatch 代理进行故障排除

1.    要检索容器组列表,请运行以下命令:

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

**注意:**删除命名空间也会删除关联的资源。

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

1.    要将 ADOT 收集器部署为 DaemonSet,请运行以下命令:

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

有关更多信息,请参阅 Container Insights EKS 基础设施指标

2.    要确认收集器正在运行,请运行以下命令:

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

3.    (可选)默认情况下,系统以匿名用户身份从 Docker Hub 中提取 aws-otel-collector 映像。此提取可能会受到速率限制的约束。要从 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"}]}}}}'

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

4.    (可选)对于服务账户的 IAM 角色,请创建一个 OIDC 提供商和一个 IAM 角色以及策略。然后,将 IAM 角色关联到 aws-otel-sa 服务账户。

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

**注意:**将 ACCOUNT_ID 替换为您的账户 ID,将 IAM_ROLE_NAME 替换为您用于服务账户的 IAM 角色。

删除 ADOT

要删除 ADOT,请运行以下命令:

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 联网架构不允许容器组直接访问 Worker 节点上的 kubelet 来检索资源指标。ADOT 收集器首先调用 Kubernetes API 服务器,将连接代理到 Worker 节点的 kubelet。然后,它会收集 kubelet 针对该节点上工作负载的顾问指标。

对于在 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 命名空间下:

  • ClusterNameLaunchType
  • ClusterNameNamespaceLaunchType
  • ClusterNameNamespacePodNameLaunchType

有关更多信息,请参阅 Container Insights EKS Fargate

要在您的 EKS Fargate 中部署 ADOT,请完成以下步骤:

1.    将 Kubernetes 服务账户与 IAM 角色关联。创建一个名为 EKS-ADOT-ServiceAccount-Role 的 IAM 角色,该角色与名为 adot-collector 的 Kubernetes 服务账户相关联。以下帮助程序脚本需要 eksctl

#!/bin/bashCLUSTER_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

**注意:**将 CLUSTER_NAME 替换为您的集群名称,将 REGION 替换为您的 AWS 区域。

2.    要将 ADOT 收集器部署为 Kubernetes StatefulSet,请运行以下命令:

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 -

**注意:**确保您有匹配的 Fargate 配置文件,以便在 AWS Fargate 上配置 StatefulSet 容器组。将 my-cluster-name 替换为您的集群名称,将 my-cluster-region 替换为您的集群所在的 AWS 区域。

3.    要验证 ADOT 收集器容器组是否正在运行,请运行以下命令:

kubectl get pods -n fargate-container-insights

4.    (可选)默认情况下,系统以匿名用户身份从 Docker Hub 中提取 aws-otel-collector 映像。此提取可能会受到速率限制的约束。要从 Amazon ECR 中提取 aws-otel-collector Docker 映像,请为 adot-collector StatefulSet 添加补丁:

kubectl patch sts adot-collector -n fargate-container-insights -p \'{"spec":{"template":{"spec":{"containers":[{"name":"adot-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 -
AWS 官方
AWS 官方已更新 8 个月前