如何在 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 會在其中建立叢集、節點和 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 命名空間下收集:

  • 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 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 -
AWS 官方
AWS 官方已更新 1 年前