如何在 EKS 叢集上開啟 Container Insights 指標?

4 分的閱讀內容
0

我想要設定 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 命名空間下收集:

  • ClusterNameLaunchType
  • ClusterNameNamespaceLaunchType
  • ClusterNameNamespacePodNameLaunchType

如需詳細資訊,請參閱 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 -

相關資訊

使用 Container Insights

AWS 官方
AWS 官方已更新 4 個月前