

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

# 設定 CloudWatch 代理程式以收集叢集指標
<a name="Container-Insights-setup-metrics"></a>

**重要**  
如果您要在 Amazon EKS 叢集上安裝 Container Insights，建議您使用 Amazon CloudWatch 可觀測性 EKS 附加元件進行安裝，而不是使用本節中的指示。如需詳細資訊和指示，請參閱[Amazon CloudWatch Observability EKS 附加元件快速入門](Container-Insights-setup-EKS-addon.md)。

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

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

## 步驟 1：建立 CloudWatch 的命名空間
<a name="create-namespace-metrics"></a>

使用以下步驟，為 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：在叢集中建立服務帳戶
<a name="create-service-account"></a>

如果還沒有服務帳戶，請使用以下其中一種方法，為 CloudWatch 代理程式建立一個。
+ 使用 `kubectl`
+ 使用 `kubeconfig` 檔案

### 使用 `kubectl` 進行身分驗證
<a name="use-kubectl"></a>

**若要使用 `kubectl` 為 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
  ```

如果您沒有遵循之前的步驟，但您已擁有可供要使用的 CloudWatch 代理程式使用的服務帳戶，您必須確認該帳戶具有下列規則。此外，在容器洞見安裝中的其他步驟，您必須使用該服務帳戶的名稱，而不是 `cloudwatch-agent`。CloudWatch 代理程式需要 ClusterRole 進行整個叢集的存取，以及命名空間中 ConfigMap 操作的`amazon-cloudwatch`命名空間範圍角色。

**ClusterRole （叢集範圍許可）：**

```
rules:
  - apiGroups: [""]
    resources: ["pods", "nodes", "endpoints"]
    verbs: ["list", "watch"]
  - apiGroups: [""]
    resources: ["services"]
    verbs: ["list", "watch", "get"]
  - 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", "events"]
    verbs: ["create", "get"]
  - apiGroups: [""]
    resources: ["configmaps"]
    verbs: ["get"]
  - nonResourceURLs: ["/metrics"]
    verbs: ["get", "list", "watch"]
  - apiGroups: ["discovery.k8s.io"]
    resources: ["endpointslices"]
    verbs: ["list", "watch", "get"]
```

**角色 (amazon-cloudwatch 命名空間的命名空間範圍許可）：**

```
rules:
  - apiGroups: [""]
    resources: ["configmaps"]
    verbs: ["create", "update"]
```

### 使用 `kubeconfig` 進行身分驗證
<a name="use-kubeconfig"></a>

或者，可以使用 `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` 檔案，請使用 `system:masters` Kubernetes 角色為 `admin/{create_your_own_user}` 使用者建立憑證簽署請求 (CSR)。然後使用 Kubernetes 叢集的憑證授權機構 (CA) 進行簽署並建立 `kubeconfig` 檔案。

## 步驟 3：為 CloudWatch 代理程式建立 ConfigMap
<a name="create-configmap"></a>

使用下列步驟來為 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
   ```

1. 編輯已下載的 YAML 檔案，如下所示：
   + **cluster\_name** – 在 `kubernetes` 區段，將 `{{cluster_name}}` 取代為叢集的名稱。移除 `{{}}` 字元。或者，如果您使用的是 Amazon EKS 叢集，您可以刪除 `"cluster_name"` 欄位和值。如果您這麼做，CloudWatch 代理程式會透過 Amazon EC2 標籤偵測叢集名稱。

1. (選用) 根據您的監控要求對 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 擷取自訂指標](CloudWatch-Agent-custom-metrics-statsd.md)。

     ```
     "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"
                 }
             }
         }
     }
     ```

1. 透過執行以下命令在叢集中建立 ConfigMap。

   ```
   kubectl apply -f cwagent-configmap-enhanced.yaml
   ```

## 步驟 4：將 CloudWatch 代理程式部署為 DaemonSet
<a name="deploy-agent-yaml"></a>

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

**若要將 CloudWatch 代理程式部署為 DaemonSet**

1. 
   + 如果您不希望在叢集上使用 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
        ```

     1. 取消 `cwagent-daemonset.yaml` 檔案中 `port` 區段的註解，如下所示：

        ```
        ports:
          - containerPort: 8125
            hostPort: 8125
            protocol: UDP
        ```

     1. 透過執行以下命令在叢集中部署 CloudWatch 代理程式。

        ```
        kubectl apply -f cwagent-daemonset.yaml
        ```

     1. 透過執行以下命令在叢集中的 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 指標。

### 疑難排解
<a name="ContainerInsights-deploy-troubleshooting"></a>

如果代理程式未正確部署，請嘗試下列項目：
+ 執行以下命令來取得 Pod 清單。

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

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

  ```
  kubectl logs {{pod-name}}  -n amazon-cloudwatch
  ```