如何在 Amazon EKS 集群上启用 Container Insights 指标?
我想配置 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 命名空间下:
- 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/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 -

相关内容
- 已提问 5 个月前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 1 年前