設定 CloudWatch 代理程式以收集叢集指標 - Amazon CloudWatch

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

設定 CloudWatch 代理程式以收集叢集指標

重要

如果您要在 Amazon EKS 叢集上安裝 Container Insights,建議您使用 Amazon CloudWatch 可觀測性 EKS 附加元件進行安裝,而不是使用本節中的指示。如需詳細資訊和指示,請參閱Amazon CloudWatch 可觀測性 EKS 附加元件的快速入門

若要設定容器洞見收集指標,您可以遵循 Amazon EKS 和 Kubernetes 上 Container Insights 的 Quick Start 設定 中的步驟,或是遵循本節中的步驟。在下列步驟中,您會將 CloudWatch 代理程式設為能夠從叢集收集指標。

如果您要在 Amazon EKS 叢集中進行安裝,並且在 2023 年 11 月 6 日或之後使用本節中的指示,則您可在叢集中安裝 Container Insights 搭配 Amazon EKS 的增強可觀測性。

步驟 1:建立 CloudWatch 的命名空間

使用以下步驟,為 CloudWatch 建立名為 amazon-cloudwatch 的 Kubernetes 命名空間。如果您已建立此命名空間,則可以略過此步驟。

若要建立 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 代理程式,請使用下列其中一種方法來建立服務帳戶。

  • 使用 kubectl

  • 使用 kubeconfig 檔案

使用 kubectl進行身分驗證

使用 為 CloudWatch 代理程式kubectl建立服務帳戶
  • 輸入以下命令。

    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

如果您沒有遵循之前的步驟,但您已擁有可供要使用的 CloudWatch 代理程式使用的服務帳戶,您必須確認該帳戶具有下列規則。此外,在容器洞見安裝中的其他步驟,您必須使用該服務帳戶的名稱,而不是 cloudwatch-agent

rules: - apiGroups: [""] resources: ["pods", "nodes", "endpoints"] verbs: ["list", "watch"] - apiGroups: [ "" ] resources: [ "services" ] verbs: [ "list", "watch" ] - apiGroups: ["apps"] resources: ["replicasets", "daemonsets", "deployments", "statefulsets"] verbs: ["list", "watch"] - apiGroups: ["batch"] resources: ["jobs"] verbs: ["list", "watch"] - apiGroups: [""] resources: ["nodes/proxy"] verbs: ["get"] - apiGroups: [""] resources: ["nodes/stats", "configmaps", "events"] verbs: ["create", "get"] - apiGroups: [""] resources: ["configmaps"] resourceNames: ["cwagent-clusterleader"] verbs: ["get","update"] - nonResourceURLs: ["/metrics"] verbs: ["get", "list", "watch"]

使用 kubeconfig進行身分驗證

或者,您可以使用 kubeconfig 檔案進行身分驗證。此方法可讓您略過直接在 CloudWatch 代理程式組態中指定kubeconfig路徑的服務帳戶 b 需求。它還允許您移除對 Kubernetes 控制平面 API 進行身分驗證的相依性,透過您的 kubeconfig 檔案管理身分驗證,簡化您的設定並可能提高安全性。

若要使用此方法,請更新您的 CloudWatch 代理程式組態檔案,以指定kubeconfig檔案的路徑,如下列範例所示。

{ "logs": { "metrics_collected": { "kubernetes": { "cluster_name": "YOUR_CLUSTER_NAME", "enhanced_container_insights": false, "accelerated_compute_metrics": false, "tag_service": false, "kube_config_path": "/path/to/your/kubeconfig" "host_ip": "HOSTIP" } } } }

若要建立kubeconfig檔案,請使用 Kubernetes 角色為admin/{create_your_own_user}使用者建立憑證簽署請求 system:masters (CSR)。然後使用 Kubernetes 叢集的憑證授權機構 (CA) 簽署 並建立 kubeconfig 檔案。

步驟 3:為 CloudWatch 代理程式建立 ConfigMap

使用下列步驟來為 CloudWatch 代理程式建立 ConfigMap。

若要為 CloudWatch 代理程式建立 ConfigMap
  1. 透過執行下列命令,將 ConfigMap YAML 下載到 kubectl 用戶端主機:

    curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cwagent/cwagent-configmap-enhanced.yaml
  2. 編輯已下載的 YAML 檔案,如下所示:

    • cluster_name – 在 kubernetes 區段,將 {{cluster_name}} 取代為叢集的名稱。移除 {{}} 字元。或者,如果您使用的是 Amazon EKS 叢集,您可以刪除 "cluster_name" 欄位和值。如果您這麼做,CloudWatch 代理程式會透過 Amazon EC2 標籤偵測叢集名稱。

  3. (選用) 根據您的監控要求對 ConfigMap 進行進一步變更,如下所示:

    • metrics_collection_interval – 在 kubernetes 區段,您可以指定代理程式收集指標的頻率。預設值為 60 秒。kubelet 中的預設 cadvisor 收集間隔是 15 秒,所以請不要將這個值設定為少於 15 秒。

    • endpoint_override 如果您想要覆寫預設端點,您可以在 logs 區段指定 CloudWatch Logs 端點。如果您透過 VPC 中的叢集進行發佈,且您想要將資料送往 VPC 端點,建議您這麼做。

    • force_flush_interval 您可以在 logs 區段指定將日誌事件發佈至 CloudWatch Logs 前,對日誌事件進行批次處理的間隔。預設為 5 秒。

    • region – 在預設情況下,代理程式會將指標發佈至工作節點所在的區域。若要覆寫這個值,您可以在 agent 區段新增 region 欄位:例如,"region":"us-west-2"

    • statsd 區段 – 如果您希望 CloudWatch Logs 代理程式在叢集的每個工作節點中以 StatsD 接聽程式的身分執行,您可以將 statsd 區段新增至 metrics 區段,如以下範例所示。如需此區段其他 StatsD 選項的資訊,請參閱 使用 StatsD 擷取自訂指標

      "metrics": { "metrics_collected": { "statsd": { "service_address":":8125" } } }

      JSON 區段的完整範例如下。如果您使用 kubeconfig 檔案進行身分驗證,請新增 kube_config_path 參數以指定 kubeconfig 檔案的路徑。

      { "agent": { "region": "us-east-1" }, "logs": { "metrics_collected": { "kubernetes": { "cluster_name": "MyCluster", "metrics_collection_interval": 60, "kube_config_path": "/path/to/your/kubeconfig" //if using kubeconfig for authentication } }, "force_flush_interval": 5, "endpoint_override": "logs.us-east-1.amazonaws.com" }, "metrics": { "metrics_collected": { "statsd": { "service_address": ":8125" } } } }
  4. 透過執行以下命令在叢集中建立 ConfigMap。

    kubectl apply -f cwagent-configmap-enhanced.yaml

步驟 4:將 CloudWatch 代理程式部署為 DaemonSet

若要完成 CloudWatch 代理程式的安裝並開始收集容器指標,請使用下列步驟。

若要將 CloudWatch 代理程式部署為 DaemonSet
    • 如果您不希望在叢集上使用 StatsD,請輸入以下命令。

      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
    • 若您希望使用 StatsD,請遵循下列步驟:

      1. 透過執行以下命令,將 DaemonSet YAML 下載到 kubectl 用戶端主機。

        curl -O 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
      2. 取消 cwagent-daemonset.yaml 檔案中 port 區段的註解,如下所示:

        ports: - containerPort: 8125 hostPort: 8125 protocol: UDP
      3. 透過執行以下命令在叢集中部署 CloudWatch 代理程式。

        kubectl apply -f cwagent-daemonset.yaml
      4. 執行下列命令,在叢集的 Windows 節點上部署 CloudWatch 代理程式。Windows 上的 CloudWatch 代理程式不支援 StatsD 接聽程式。

        kubectl apply -f cwagent-daemonset-windows.yaml
  1. 透過執行下列命令確認已部署代理程式。

    kubectl get pods -n amazon-cloudwatch

完成後,CloudWatch 代理程式會建立名為 /aws/containerinsights/Cluster_Name/performance 的日誌群組,並將效能日誌事件傳送到這個日誌群組。如果您也將代理程式設定為 StatsD 接聽程式,此代理程式也會使用應用程式 pod 排定所在的節點 IP 地址,來接聽連接埠 8125 上的 StatsD 指標。

故障診斷

如果代理程式未正確部署,請嘗試下列項目:

  • 執行以下命令來取得 Pod 清單。

    kubectl get pods -n amazon-cloudwatch
  • 執行以下命令和檢查輸出底部的事件。

    kubectl describe pod pod-name -n amazon-cloudwatch
  • 執行以下命令來檢查日誌。

    kubectl logs pod-name -n amazon-cloudwatch