如何在 EKS 叢集上開啟 Container Insights 指標?
我想要設定 Amazon CloudWatch Container Insights 以查看我的 Amazon Elastic Kubernetes Service (Amazon EKS) 叢集指標。
簡短描述
與 Amazon EKS 搭配使用時,Container Insights 會使用 CloudWatch 代理程式的容器化版本來尋找叢集中執行的所有容器。Container Insights 也使用適用於 OpenTelemetry 的 AWS Distro (ADOT) 收集器來尋找叢集中的容器。然後,它會在效能堆疊的每一層收集效能資料,例如使用內嵌指標格式的效能日誌事件。之後,它會將此資料傳送至 CloudWatch Logs 中的 /aws/containerinsights/cluster-name/performance 日誌群組下,其中 CloudWatch 會在叢集、節點和 Pod 層級建立彙總指標。Container Insights 還支援從在 AWS Fargate for Amazon EKS 上部署的叢集收集指標。如需詳細資訊,請參閲使用 Container Insights。
**備註:**僅在 Linux 執行個體上支援 Container Insights。Amazon 在 Amazon Elastic Container Registry (Amazon ECR) 上提供 CloudWatch 代理程式容器映像。如需詳細資訊,請參閱 Amazon ECR 上的 cloudwatch-agent。
解決方案
先決條件
開始之前,請檢閱下列先決條件:
- 確保您的 Amazon EKS 叢集正在執行,其中的節點處於 Ready (就緒) 狀態,且 kubectl 命令已安裝並在執行中。
- 確保 AWS Identity and Access Management (IAM) 受管 CloudWatchAgentServerPolicy 啟用您的 Amazon EKS 工作節點,以將指標和日誌傳送至 CloudWatch。若要啟用工作節點,請將政策連接至工作節點的 IAM 角色。或者,將 IAM 角色用於叢集的服務帳戶,然後將政策連接至此角色。如需詳細資訊,請參閱服務帳戶的 IAM 角色。
- 確保您正在執行支援 Kubernetes 版本 1.18 或更新版本的叢集。這是 Container Insights for EKS Fargate 的要求。另外,請確保定義 Fargate 設定檔,以便在 Fargate 上排程 Pod。
- 確保 Amazon EKS Pod 執行 IAM 角色允許在 Fargate 基礎設施上執行的元件代表您呼叫 AWS API。例如,從 Amazon ECR 提取容器映像。
使用 CloudWatch 代理程式,在您的 EKS EC2 叢集上設定 Container Insights 指標
CloudWatch 代理程式或 ADOT 會建立名為 aws/containerinsights/Cluster_Name/performance 的日誌群組,並將效能日誌事件傳送至此日誌群組。
設定 Container Insights 以收集指標時,您必須從 Docker Hub 將 CloudWatch 代理程式容器映像部署為 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-agent 的 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
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 -
**備註:**用您的 EKS 叢集名稱取代 my-cluster-name。若要進一步自訂 CloudWatch 代理程式組態,請參閱針對 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. 執行下列命令以擷取 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
**備註:**刪除命名空間也會刪除關聯的資源。
使用 ADOT 在您的 EKS 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 映像標籤。
5. **選用︰**針對服務帳戶的 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 聯網架構不允許 Pod 直接連線工作者上的 kubelet 來擷取資源指標。ADOT 收集器會呼叫 Kubernetes API 伺服器,以透過代理連線至工作節點上的 kubelet。然後,它會針對該節點上的工作負載,收集 kubelet 的建議程式指標。
備註:ADOT 收集器的單一執行個體不足以從叢集中的所有節點收集資源指標。
ADOT 收集器會針對在 EKS Fargate 上執行的每個工作負載,將如下指標傳送至 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
**備註:**以您的叢集名稱取代 CLUSTER_NAME,以您的 AWS 區域取代 REGION。
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 Pod。將 my-cluster-name 取代為叢集的名稱,並將 my-cluster-region 取代為叢集所在的區域。
3. 執行下列命令以確認 ADOT 收集器 Pod 是否正在執行:
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 -
相關資訊

相關內容
- 已提問 2 個月前lg...
- 已提問 4 天前lg...
- 已提問 7 個月前lg...
- 已提問 6 個月前lg...
- AWS 官方已更新 4 個月前
- AWS 官方已更新 9 個月前
- AWS 官方已更新 4 個月前
- AWS 官方已更新 1 年前