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.name和 admissionWebhooks.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