View a markdown version of this page

使用 Helm 部署 OTel 容器洞見 - Amazon CloudWatch

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Helm 部署 OTel 容器洞見

Amazon CloudWatch 可觀測性 Helm Chart 為 OTel Container Insights 提供彈性的部署選項。它會使用 OpenTelemetry 檔案日誌接收器安裝 CloudWatch 代理程式 (OTel 型) 以進行日誌收集。Helm Chart 維護於 https://https://github.com/aws-observability/helm-charts

當您需要下列一或多個功能時,請使用 Helm Chart:

  • 精細控制代理程式組態

  • 使用 filelog 接收器的 OTel 原生日誌集合 (無 Fluent Bit 相依性)

  • 透過 cert-manager 進行自訂 TLS 憑證管理

  • 非 EKS Kubernetes 叢集 (ROSA、自我管理 Kubernetes)

  • 使用 ArgoCD 或 Flux 的 GitOps 工作流程

先決條件

使用 Helm 部署 OTel Container Insights 之前,請確認您符合下列要求。

  • 執行 Kubernetes 1.28 版或更新版本的現有 Amazon EKS 叢集

  • Helm 3.9 版或更新版本

  • kubectl 設定為與您的目標叢集通訊

  • IAM 許可:連接至客服人員角色的 CloudWatchAgentServerPolicy受管政策

  • 針對服務帳戶 (IRSA) 的 IAM 角色設定的 OpenID Connect (OIDC) 提供者

  • 從叢集到 CloudWatch 端點的傳出網際網路存取

安裝 Helm Chart

使用 Helm Chart 完成下列步驟以部署 OTel Container Insights。

步驟 1:新增 Helm 儲存庫

將 AWS 可觀測性 Helm Chart 儲存庫新增至本機 Helm 組態。

新增 Helm 儲存庫
  1. 執行下列命令來新增儲存庫。

    helm repo add aws-observability \ https://aws-observability.github.io/helm-charts
  2. 更新儲存庫以取得最新的圖表版本。

    helm repo update

步驟 2:建立 IAM 角色

建立允許 CloudWatch 代理程式將資料傳送至 CloudWatch 的 IAM 角色。此角色使用 IRSA 將 IAM 許可與 Kubernetes 服務帳戶建立關聯。

建立 CloudWatch 代理程式的 IAM 角色
  1. 擷取叢集的 OIDC 發行者 URL。使用 Amazon EKS 叢集的名稱取代 cluster-name

    aws eks describe-cluster \ --name cluster-name \ --query "cluster.identity.oidc.issuer" \ --output text
  2. 使用 IRSA 的信任政策建立 IAM 角色。將 account-id 取代為 AWS 您的帳戶 ID,並將 oidc-id 取代為上一個步驟的 OIDC 提供者 ID (之後的部分https://oidc.eks.region.amazonaws.com/id/)。

    aws iam create-role \ --role-name EKS-CW-Observability-Role \ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::account-id:oidc-provider/oidc.eks.region.amazonaws.com/id/oidc-id" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region.amazonaws.com/id/oidc-id:sub": "system:serviceaccount:amazon-cloudwatch:cloudwatch-agent" } } }] }'
  3. CloudWatchAgentServerPolicy 受管政策連接至角色。

    aws iam attach-role-policy \ --role-name EKS-CW-Observability-Role \ --policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy

步驟 3:安裝圖表

在啟用 OTel Container Insights 的情況下安裝 Amazon CloudWatch 可觀測性 Helm Chart。

安裝 Helm Chart
  • 執行下列命令。將 cluster-name 取代為您的 Amazon EKS 叢集名稱、將 region 取代為您的 AWS 區域,並將 account-id 取代為您的 AWS 帳戶 ID。

    helm install amazon-cloudwatch-observability \ aws-observability/amazon-cloudwatch-observability \ --namespace amazon-cloudwatch \ --create-namespace \ --set clusterName=cluster-name \ --set region=region \ --set agent.serviceAccount.name=cloudwatch-agent \ --set "agent.serviceAccount.annotations.eks\\.amazonaws\\.com/role-arn=arn:aws:iam::account-id:role/EKS-CW-Observability-Role" \ --set otelContainerInsights.enabled=true
    重要

    otelContainerInsights.enabled 參數是必要參數。預設不會啟用 OTel Container Insights。

步驟 4:驗證安裝

確認 Helm Release 和代理程式 Pod 已成功部署。

驗證 Helm 安裝
  1. 確認 Helm 發行狀態顯示 deployed

    helm list -n amazon-cloudwatch
  2. 確認運算子 Pod 正在執行。

    kubectl get pods -n amazon-cloudwatch -l app.kubernetes.io/name=amazon-cloudwatch-observability
  3. 確認 CloudWatch 代理程式 Pod 在所有節點上執行。

    kubectl get pods -n amazon-cloudwatch -l app.kubernetes.io/name=cloudwatch-agent

    所有代理程式 Pod 必須顯示Running狀態。

金鑰組態選項

下表說明您可以設定的金鑰 Helm Chart 值。使用 --set旗標或自訂values.yaml檔案傳遞這些值。

叢集設定

參數 預設 說明
clusterName Amazon EKS 叢集的名稱。必要.
region 叢集執行所在的 AWS 區域。必要.
otelContainerInsights.enabled false 使用 filelog 接收器啟用 OTel Container Insights。

容器日誌 (OTel 檔案日誌接收器)

參數 預設 說明
containerLogs.enabled true 使用 OTel 檔案日誌接收器啟用容器日誌收集。
containerLogs.logGroupName /aws/containerinsights/cluster-name/application 容器日誌的 CloudWatch Logs 日誌群組名稱。
containerLogs.logRetentionDays 7 在 CloudWatch Logs 中保留容器日誌的天數。

代理程式 (指標)

參數 預設 說明
agent.enabled true 啟用 CloudWatch 代理程式 DaemonSet 進行指標收集。
agent.serviceAccount.name cloudwatch-agent 代理程式的 Kubernetes 服務帳戶名稱。
agent.resources.requests.cpu 100m 代理程式容器的 CPU 請求。
agent.resources.requests.memory 128Mi 代理程式容器的記憶體請求。
agent.resources.limits.cpu 200m 代理程式容器的 CPU 限制。
agent.resources.limits.memory 256Mi 代理程式容器的記憶體限制。

GPU 監控

參數 預設 說明
agent.config.logs.metrics_collected.kubernetes.enhanced_container_insights true 啟用增強型容器洞見指標,包括 GPU 指標。
dcgmExporter.enabled false 啟用適用於 NVIDIA GPU 指標的 DCGM 匯出工具。需要 NVIDIA GPU 節點。
neuronMonitor.enabled false 為 AWS Inferentia 和 Trainium 指標啟用 Neuron 監控。

TLS 憑證管理

CloudWatch 可觀測性運算子需要 TLS 憑證才能進行 Webhook 通訊。根據預設,圖表會產生自我簽署的憑證。您可以使用 cert-manager 自動管理憑證。

自我簽署憑證 (預設)

根據預設,Helm Chart 會產生自我簽署的 CA,並從該 CA 發出憑證。不需任何其他設定。圖表會在升級期間自動輪換這些憑證。

cert-manager 整合

您可以使用 cert-manager 來自動化憑證發行和續約。當您的組織需要外部簽署的憑證或集中式憑證管理時,此方法非常有用。

設定 cert-manager 整合
  1. 確認叢集中已安裝 cert-manager。

    kubectl get pods -n cert-manager
  2. 在啟用 cert-manager 的情況下安裝 Helm Chart。將 cluster-name 取代為您的 Amazon EKS 叢集名稱、將 region 取代為您的 AWS 區域,並將 account-id 取代為您的 AWS 帳戶 ID。

    helm install amazon-cloudwatch-observability \ aws-observability/amazon-cloudwatch-observability \ --namespace amazon-cloudwatch \ --create-namespace \ --set clusterName=cluster-name \ --set region=region \ --set agent.serviceAccount.name=cloudwatch-agent \ --set "agent.serviceAccount.annotations.eks\\.amazonaws\\.com/role-arn=arn:aws:iam::account-id:role/EKS-CW-Observability-Role" \ --set otelContainerInsights.enabled=true \ --set admissionWebhooks.certManager.enabled=true

啟用 cert-manager 時,圖表會建立 cert-manager 用來自動發行和管理 Webhook TLS 憑證Certificate的資源。

注意

您也可以將 cert-manager 與外部發行者搭配使用,例如 HashiCorp Vault。若要設定外部發行者,請設定 admissionWebhooks.certManager.issuerRef.nameadmissionWebhooks.certManager.issuerRef.kind 以符合您的 cert-manager 發行者。

升級圖表

升級 Helm Chart 以套用新的組態值或更新至較新的圖表版本。

升級 Helm Chart
  1. 更新 Helm 儲存庫以取得最新的圖表版本。

    helm repo update
  2. 使用所需的值執行升級命令。將 cluster-name 取代為您的 Amazon EKS 叢集名稱、將 region 取代為您的 AWS 區域,並將 account-id 取代為您的 AWS 帳戶 ID。

    helm upgrade amazon-cloudwatch-observability \ aws-observability/amazon-cloudwatch-observability \ --namespace amazon-cloudwatch \ --set clusterName=cluster-name \ --set region=region \ --set agent.serviceAccount.name=cloudwatch-agent \ --set "agent.serviceAccount.annotations.eks\\.amazonaws\\.com/role-arn=arn:aws:iam::account-id:role/EKS-CW-Observability-Role" \ --set otelContainerInsights.enabled=true
  3. 確認升級已成功完成。

    helm list -n amazon-cloudwatch

    修訂編號必須遞增,且狀態必須顯示 deployed

提示

為了避免在升級期間遺失組態值,請將您的自訂值存放在values.yaml檔案中,並與 -f values.yaml旗標一起傳遞。

解除安裝圖表

若要從叢集中移除 OTel Container Insights,請解除安裝 Helm 版本。

解除安裝 Helm Chart
  1. 執行下列命令來解除安裝 版本。

    helm uninstall amazon-cloudwatch-observability \ --namespace amazon-cloudwatch
  2. 或者,如果不再需要命名空間,請將其刪除。

    kubectl delete namespace amazon-cloudwatch

解除安裝 Helm Chart 之後,IAM 角色和 OIDC 提供者組態會保留在您的 AWS 帳戶中。如果不再需要這些資源,請分別刪除這些資源。

aws iam detach-role-policy \ --role-name EKS-CW-Observability-Role \ --policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy aws iam delete-role \ --role-name EKS-CW-Observability-Role

驗證 CloudWatch 中的資料

安裝 Helm Chart 之後,Container Insights 資料會在 3 到 5 分鐘內顯示在 CloudWatch 中。

檢查指標

在 CloudWatch 中檢查指標
  1. 透過 https://console.aws.amazon.com/cloudwatch/ 開啟 CloudWatch 主控台。

  2. 在導覽窗格中,選擇容器洞見

  3. 確認您的叢集出現在叢集清單中,且基礎設施指標正在填入。

檢查 日誌

若要驗證叢集是否存在日誌群組,請執行下列命令。使用 Amazon EKS 叢集的名稱取代 cluster-name

aws logs describe-log-groups \ --log-group-name-prefix "/aws/containerinsights/cluster-name" \ --query "logGroups[].logGroupName" \ --output table

疑難排解

使用下列指引來解決使用 Helm 部署 OTel Container Insights 時的常見問題。

CrashLoopBackOff 中的運算子 Pod

徵狀:執行 時kubectl get pods -n amazon-cloudwatch,運算子 Pod 會顯示CrashLoopBackOff狀態。

原因:由於 TLS 憑證問題或許可不足,運算子 Pod 無法啟動。

解決方案:完成下列步驟以解決此問題。

  1. 檢查運算子 Pod 日誌是否有憑證相關的錯誤。

    kubectl logs -n amazon-cloudwatch -l app.kubernetes.io/name=amazon-cloudwatch-observability --tail=50
  2. 確認命名空間中存在 Webhook TLS 秘密。

    kubectl get secrets -n amazon-cloudwatch | grep webhook
  3. 如果您使用 cert-manager,請確認Certificate資源狀態顯示 Ready

    kubectl get certificate -n amazon-cloudwatch
  4. 如果憑證遺失或無效,請解除安裝並重新安裝圖表以重新產生憑證。

    helm uninstall amazon-cloudwatch-observability -n amazon-cloudwatch

代理程式 Pod 未排程在所有節點上

徵狀:代理程式 DaemonSet 顯示的 Pod 少於叢集中的節點數量。

原因:節點污點、資源限制或節點選擇器可防止代理程式 Pod 在特定節點上排程。

解決方案:完成下列步驟以解決此問題。

  1. 檢查 DaemonSet 狀態是否有排程問題。

    kubectl get daemonset -n amazon-cloudwatch cloudwatch-agent
  2. 檢查是否有無法排程的 Pod,並檢視其事件。

    kubectl get pods -n amazon-cloudwatch -l app.kubernetes.io/name=cloudwatch-agent --field-selector=status.phase!=Running
  3. 如果節點有污點,請將容錯新增至 Helm Chart 值。例如,若要容忍所有污點,請使用下列旗標升級圖表。

    helm upgrade amazon-cloudwatch-observability \ aws-observability/amazon-cloudwatch-observability \ --namespace amazon-cloudwatch \ --reuse-values \ --set "agent.tolerations[0].operator=Exists"
  4. 確認代理程式 Pod 現在在所有節點上執行。

    kubectl get pods -n amazon-cloudwatch -l app.kubernetes.io/name=cloudwatch-agent -o wide