如何在 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 會在其中建立叢集、節點和 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/cloudwatch-agent。
解決方法
先決條件
- 您的 Amazon EKS 叢集正在執行,節點處於就緒狀態,且 kubectl 命令已安裝並執行。
- AWS Identity and Access Management (IAM) 受管的 CloudWatchAgentServerPolicy 啟用您的 Amazon EKS 工作節點,以將指標和日誌傳送到 CloudWatch。若要啟用工作節點,請將政策附加到工作節點的 IAM 角色。或者,將 IAM 角色用於叢集的服務帳戶,然後將政策附加到此角色。如需詳細資訊,請參閱服務帳戶的 IAM 角色。
- 您正在執行支援 Kubernetes 1.18 版或更新版本的叢集。這是適用於 EKS Fargate 的 Container Insights 的要求。另請確保定義 Fargate 設定檔,以便在 Fargate 上排程 Pod。
- Amazon EKS Pod 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-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 -
**注意:**將 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. 若要擷取 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 在 EC2 叢集上設定 Container Insights 指標
1. 若要將 ADOT Collector 部署為 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 網路架構不允許 Pod 直接到達工作者上的 kubelet 以擷取資源指標。ADOT Collector 先呼叫 Kubernetes API 服務器,以代理與工作節點上 kubelet 的連線。然後,它會為該節點上的工作負載收集 kubelet 的建議程式指標。
ADOT Collector 為 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/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 Collector 部署為 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 取代為叢集所在的 AWS 區域。
3. 若要確認 ADOT Collector 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...
- 已提問 1 年前lg...
- 已提問 1 年前lg...
- 已提問 1 年前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 4 個月前