

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

# 在 Amazon EKS 和 Kubernetes 叢集上安裝具有 Prometheus 指標集合的 CloudWatch 代理程式。
<a name="ContainerInsights-Prometheus-Setup"></a>

本節說明如何在執行 Amazon EKS 或 Kubernetes 的叢集中設定具有 Prometheus 監控的 CloudWatch 代理程式。執行這項操作之後，代理程式會自動湊集和匯入該叢集中執行的下列工作負載的指標。
+ AWS App Mesh
+ NGINX
+ Memcached
+ Java/JMX
+ HAProxy
+ Fluent Bit

您也可以設定代理程式，以湊集和匯入其他 Prometheus 工作負載和來源。

在依照下列步驟安裝 CloudWatch 代理程式進行 Prometheus 指標收集之前，您必須擁有在 Amazon EKS 上執行的叢集，或是在 Amazon EC2 執行個體上執行的 Kubernetes 叢集。

**VPC 安全群組要求**

Prometheus 工作負載安全群組的輸入規則必須開啟到 CloudWatch 代理程式的 Prometheus 連接埠，以便透過私有 IP 擷取 Prometheus 指標。

CloudWatch 代理程式安全群組的輸出規則必須允許 CloudWatch 代理程式透過私有 IP 連接至 Prometheus 工作負載的連接埠。

**Topics**
+ [在 Amazon EKS 和 Kubernetes 叢集上安裝具有 Prometheus 指標集合的 CloudWatch 代理程式。](#ContainerInsights-Prometheus-Setup-roles)
+ [湊集其他 Prometheus 來源並匯入這些指標](ContainerInsights-Prometheus-Setup-configure.md)
+ [(選用) 設定範例容器化 Amazon EKS 工作負載範例進行 Prometheus 指標測試](ContainerInsights-Prometheus-Sample-Workloads.md)

## 在 Amazon EKS 和 Kubernetes 叢集上安裝具有 Prometheus 指標集合的 CloudWatch 代理程式。
<a name="ContainerInsights-Prometheus-Setup-roles"></a>

本節說明如何在執行 Amazon EKS 或 Kubernetes 的叢集中設定具有 Prometheus 監控的 CloudWatch 代理程式。執行這項操作之後，代理程式會自動湊集和匯入該叢集中執行的下列工作負載的指標。
+ AWS App Mesh
+ NGINX
+ Memcached
+ Java/JMX
+ HAProxy
+ Fluent Bit

您也可以設定代理程式，以湊集和匯入其他 Prometheus 工作負載和來源。

在依照下列步驟安裝 CloudWatch 代理程式進行 Prometheus 指標收集之前，您必須擁有在 Amazon EKS 上執行的叢集，或是在 Amazon EC2 執行個體上執行的 Kubernetes 叢集。

**VPC 安全群組要求**

Prometheus 工作負載安全群組的輸入規則必須開啟到 CloudWatch 代理程式的 Prometheus 連接埠，以便透過私有 IP 擷取 Prometheus 指標。

CloudWatch 代理程式安全群組的輸出規則必須允許 CloudWatch 代理程式透過私有 IP 連接至 Prometheus 工作負載的連接埠。

**Topics**
+ [設定 IAM 角色](#ContainerInsights-Prometheus-Setup-roles)
+ [安裝 CloudWatch 代理程式以收集 Prometheus 指標](#ContainerInsights-Prometheus-Setup-install-agent)

### 設定 IAM 角色
<a name="ContainerInsights-Prometheus-Setup-roles"></a>

第一步是在叢集中設定必要的 IAM 角色。有兩種方法：
+ 設定服務帳戶的 IAM 角色， 亦稱為*服務角色*。此方法適用於 EC2 啟動類型和 Fargate 啟動類型。
+ 將 IAM 政策新增至用於叢集的 IAM 角色。這只適用於 EC2 啟動類型。

**設定服務角色 (EC2 啟動類型和 Fargate 啟動類型)**

若要設定服務角色，請輸入下列命令。以叢集的名稱取代 *MyCluster*。

```
eksctl create iamserviceaccount \
 --name cwagent-prometheus \
--namespace amazon-cloudwatch \
 --cluster MyCluster \
--attach-policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy \
--approve \
--override-existing-serviceaccounts
```

**將政策新增至節點群組的 IAM 角色 (僅適用於 EC2 啟動類型)**

**若要在節點群組中設定 IAM 政策以獲得 Prometheus 支援**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在導覽窗格中，選擇**執行個體**。

1. 您需要找出叢集的 IAM 角色名稱的字首。若要執行此操作，請選取叢集中執行個體名稱旁的核取方塊，然後選擇**動作**、**安全性**、**修改 IAM 角色**。然後複製 IAM 角色的字首，例如 `eksctl-dev303-workshop-nodegroup`。

1. 在以下網址開啟 IAM 主控台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在導覽窗格中，選擇**角色**。

1. 使用搜尋方塊尋找您先前在此程序中複製的前綴，然後選擇該角色。

1. 選擇**連接政策**。

1. 使用搜尋方塊尋找 **CloudWatchAgentServerPolicy**。選取 **CloudWatchAgentServerPolicy** 旁的核取方塊，然後選擇 **Attach policy (連接政策)**。

### 安裝 CloudWatch 代理程式以收集 Prometheus 指標
<a name="ContainerInsights-Prometheus-Setup-install-agent"></a>

您必須在叢集中安裝 CloudWatch 代理程式，才能收集指標。如何安裝代理程式會因 Amazon EKS 叢集和 Kubernetes 叢集而有所不同。

**刪除支援 Prometheus 的舊版 CloudWatch 代理程式**

如果您已在叢集中安裝具有 Prometheus 支援的 CloudWatch 代理程式版本，則必須輸入下列命令來刪除該版本。只有具有 Prometheus 支援的舊版代理程式才需要這麼做。您不需要刪除啟用 Container Insights 但不含 Prometheus 支援的 CloudWatch 代理程式。

```
kubectl delete deployment cwagent-prometheus -n amazon-cloudwatch
```

#### 在具有 EC2 啟動類型的 Amazon EKS 叢集上安裝 CloudWatch 代理程式
<a name="ContainerInsights-Prometheus-Setup-install-agent-EKS"></a>

若要在 Amazon EKS 叢集上安裝具有 Prometheus 支援的 CloudWatch 代理程式，請依照下列步驟執行。

**若要在 Amazon EKS 叢集上安裝具有 Prometheus 支援的 CloudWatch 代理程式**

1. 輸入下列命令以檢查是否已建立 `amazon-cloudwatch` 命名空間：

   ```
   kubectl get namespace
   ```

1. 如果結果中未顯示 `amazon-cloudwatch`，請輸入下列命令來建立它：

   ```
   kubectl create namespace amazon-cloudwatch
   ```

1. 若要部署具有預設組態的代理程式，並讓它將資料傳送到其安裝所在的 AWS 區域，請輸入下列命令：

   ```
   kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks.yaml
   ```

   如果要讓代理程式將資料傳送到不同的區域，請依照下列步驟執行：

   1. 輸入下列命令，以下載代理程式的 YAML 檔案：

      ```
      curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks.yaml
      ```

   1. 使用文字編輯器開啟檔案，然後搜尋檔案的 `cwagentconfig.json` 區塊。

   1. 新增反白的行，指定您想要的區域：

      ```
      cwagentconfig.json: |
          {
            "agent": {
              "region": "us-east-2"
            },
            "logs": { ...
      ```

   1. 儲存檔案並使用您更新的檔案來部署代理程式。

      ```
      kubectl apply -f prometheus-eks.yaml
      ```

#### 在具有 Fargate 啟動類型的 Amazon EKS 叢集上安裝 CloudWatch 代理程式
<a name="ContainerInsights-Prometheus-Setup-install-agent-EKS-fargate"></a>

若要在具有 Fargate 啟動類型的 Amazon EKS 叢集上安裝具有 Prometheus 支援的 CloudWatch 代理程式，請依照下列步驟執行。

**若要在具有 Fargate 啟動類型的 Amazon EKS 叢集上安裝具有 Prometheus 支援的 CloudWatch 代理程式**

1. 輸入以下命令，為 CloudWatch 代理程式建立 Fargate 描述檔，以便它可以在叢集內執行。以叢集的名稱取代 *MyCluster*。

   ```
   eksctl create fargateprofile --cluster MyCluster \
   --name amazon-cloudwatch \
   --namespace amazon-cloudwatch
   ```

1. 若要安裝 CloudWatch 代理程式，請輸入以下命令。以叢集的名稱取代 *MyCluster*。此名稱會用於存放代理程式所收集之日誌事件的日誌群組名稱中，也用作為代理程式所收集之指標的維度。

   將 *region* 取代為您想要傳送指標的區域名稱。例如 `us-west-1`。

   ```
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks-fargate.yaml | 
   sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" | 
   kubectl apply -f -
   ```

#### 在 Kubernetes 叢集上安裝 CloudWatch 代理程式
<a name="ContainerInsights-Prometheus-Setup-install-agent-Kubernetes"></a>

若要在執行 Kubernetes 的叢集上安裝具有 Prometheus 支援的 CloudWatch 代理程式，請輸入下列命令：

```
curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-k8s.yaml | 
sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" | 
kubectl apply -f -
```

以叢集的名稱取代 *MyCluster*。此名稱會用於存放代理程式所收集之日誌事件的日誌群組名稱中，也用作為代理程式所收集之指標的維度。

將*區域*取代為 AWS 您要傳送指標的區域名稱。例如 **us-west-1**。

#### 確認代理程式正在執行中
<a name="ContainerInsights-Prometheus-Setup-install-agent-verify"></a>

在 Amazon EKS 和 Kubernetes 叢集上，您可以輸入下列命令，以確認代理程式正在執行。

```
kubectl get pod -l "app=cwagent-prometheus" -n amazon-cloudwatch
```

如果結果包含處於 `Running` 狀態的單一 CloudWatch 代理程式 pod，則表示代理程式正在執行並且正在收集 Prometheus 指標。預設情況下，CloudWatch 代理程式每分鐘會收集 App Mesh、NGINX，Memcached、Java/JMX 和 HAProxy 的指標。如需這些指標的詳細資訊，請參閱 [CloudWatch 代理程式收集的 Prometheus 指標](ContainerInsights-Prometheus-metrics.md)。如需如何在 CloudWatch 中查看 Prometheus 指標的相關指示，請參閱 [檢視 Prometheus 指標](ContainerInsights-Prometheus-viewmetrics.md)

您也可以將 CloudWatch 代理程式設定為從其他 Prometheus 匯出工具收集指標。如需詳細資訊，請參閱[湊集其他 Prometheus 來源並匯入這些指標](ContainerInsights-Prometheus-Setup-configure.md)。

# 湊集其他 Prometheus 來源並匯入這些指標
<a name="ContainerInsights-Prometheus-Setup-configure"></a>

具有 Prometheus 監控的 CloudWatch 代理程式需要兩種組態來湊集 Prometheus 指標。其中一個是 Prometheus 文件的 [<scrape\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config) 中記錄的標準 Prometheus 湊集組態。另一個適用於 CloudWatch 代理程式組態。

對於 Amazon EKS 叢集，組態在 `prometheus-eks.yaml` (EC2 啟動類型) 或 `prometheus-eks-fargate.yaml` (Fargate 啟動類型) 中定義為兩種組態映射：
+ `name: prometheus-config` 區段包含 Prometheus 湊集的設定。
+ `name: prometheus-cwagentconfig` 區段包含 CloudWatch 代理程式的組態。您可以使用此區段來設定 CloudWatch 收集 Prometheus 指標的方式。例如，您可以將要匯入 CloudWatch 的指標列入白名單，並定義其維度。

對於在 Amazon EC2 執行個體上執行的 Kubernetes 叢集，組態在 `prometheus-k8s.yaml` YAML 檔案中定義為兩種組態映射：
+ `name: prometheus-config` 區段包含 Prometheus 湊集的設定。
+ `name: prometheus-cwagentconfig` 區段包含 CloudWatch 代理程式的組態。

若要湊集其他 Prometheus 指標來源並將這些指標匯入 CloudWatch，您可以修改 Prometheus 湊集組態和 CloudWatch 代理程式組態，然後使用更新的組態重新部署代理程式。

**VPC 安全群組要求**

Prometheus 工作負載安全群組的輸入規則必須開啟到 CloudWatch 代理程式的 Prometheus 連接埠，以便透過私有 IP 擷取 Prometheus 指標。

CloudWatch 代理程式安全群組的輸出規則必須允許 CloudWatch 代理程式透過私有 IP 連接至 Prometheus 工作負載的連接埠。

## Prometheus 湊集組態
<a name="ContainerInsights-Prometheus-Setup-config-global"></a>

CloudWatch 代理程式支援標準 Prometheus 湊集組態，如 Prometheus 文件的 [<scrape\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#scrape_config) 中所述。您可以編輯此區段來更新已存在於此檔案中的組態，並新增其他 Prometheus 湊集目標。根據預設，範例組態檔案包含下列全域組態行：

```
global:
  scrape_interval: 1m
  scrape_timeout: 10s
```
+ **scrape\$1interval**— 定義湊集目標的頻率。
+ **scrape\$1timeout**— 定義湊集請求逾時之前要等待的時間。

您也可以在任務層級為這些設定定義不同的數值，以覆寫全域設定。

### Prometheus 湊集任務
<a name="ContainerInsights-Prometheus-Setup-config-scrape"></a>

CloudWatch 代理程式 YAML 檔案已設定一些預設的湊集任務。例如，在 `prometheus-eks.yaml` 中，已在 `scrape_configs` 區段中的 `job_name` 行設定預設湊集任務。在此檔案中，下列預設 `kubernetes-pod-jmx` 區段會湊集 JMX Exporter 指標。

```
   - job_name: 'kubernetes-pod-jmx'
      sample_limit: 10000
      metrics_path: /metrics
      kubernetes_sd_configs:
      - role: pod
      relabel_configs:
      - source_labels: [__address__]
        action: keep
        regex: '.*:9404$'
      - action: labelmap
        regex: __meta_kubernetes_pod_label_(.+)
      - action: replace
        source_labels:
        - __meta_kubernetes_namespace
        target_label: Namespace
      - source_labels: [__meta_kubernetes_pod_name]
        action: replace
        target_label: pod_name
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_container_name
        target_label: container_name
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_controller_name
        target_label: pod_controller_name
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_controller_kind
        target_label: pod_controller_kind
      - action: replace
        source_labels:
        - __meta_kubernetes_pod_phase
        target_label: pod_phase
```

會湊集這些預設目標當中的各個目標，並使用內嵌的指標格式將指標傳送到日誌事件中的 CloudWatch。如需詳細資訊，請參閱[在日誌中內嵌指標](CloudWatch_Embedded_Metric_Format.md)。

來自 Amazon EKS 和 Kubernetes 叢集的日誌事件會存放在 CloudWatch Logs 中的 **/aws/containerinsights/*cluster\$1name*/prometheus** 日誌群組。來自 Amazon ECS 叢集的日誌事件會存放在 **/aws/ecs/containerinsights/*cluster\$1name*/prometheus** 日誌群組。

每個湊集任務都包含在此日誌群組的不同日誌串流中。例如，Prometheus 湊集任務 `kubernetes-pod-appmesh-envoy` 是針對 App Mesh 所定義。來自 Amazon EKS 和 Kubernetes 叢集的所有 App Mesh Prometheus 指標都會傳送至名為 **/aws/containerinsights/*cluster\$1name*>prometheus/kubernetes-pod-appmesh-envoy/** 的日誌串流。

若要新增湊集目標，請新增 `job_name` 區段到 YAML 檔案的 `scrape_configs` 區段，然後重新啟動代理程式。如需此程序的範例，請參閱[新增 Prometheus 湊集目標的教學課程：Prometheus API 伺服器指標](#ContainerInsights-Prometheus-Setup-new-exporters)。

## Prometheus 的 CloudWatch 代理程式組態
<a name="ContainerInsights-Prometheus-Setup-cw-agent-config2"></a>

CloudWatch 代理程式組態檔案在 `metrics_collected` 下有一個 `prometheus` 區段可用於 Prometheus 湊集組態。其包含下列組態選項：
+ **cluster\$1name**— 指定要在日誌事件中新增為標籤的叢集名稱。此欄位為選用欄位。如果您省略此值，代理程式可以偵測 Amazon EKS 或 Kubernetes 叢集名稱。
+ **log\$1group\$1name**— 為湊集的 Prometheus 指標指定日誌檔案群組名稱。此欄位為選用欄位。如果您省略此值，CloudWatch 會將 **/aws/containerinsights/*cluster\$1name*/prometheus** 用於來自 Amazon EKS 和 Kubernetes 叢集的日誌。
+ **prometheus\$1config\$1path**— 指定 Prometheus 湊集組態檔案路徑。如果此欄位的值以 `env:` 為開頭，則將從容器的環境變數中擷取 Prometheus 湊集組態檔案內容。請不要變更此欄位。
+ **ecs\$1service\$1discovery**— 是指定 Amazon ECS Prometheus 服務探索組態的區段。如需詳細資訊，請參閱[在 Amazon ECS 叢集上自動探索的詳細指南](ContainerInsights-Prometheus-Setup-autodiscovery-ecs.md)。

  `ecs_service_discovery` 區段可以包含下列欄位：
  + `sd_frequency` 是發現 Prometheus Exporters 的頻率。指定數字和單位尾碼。例如：每分鐘一次 `1m` 或每 30 秒`30s`一次。有效的單位尾碼為`ns`、`us`、`ms`、`s`、`m` 以及 `h`。

    此欄位為選用欄位。預設值為 60 秒 (1 分鐘)。
  + `sd_target_cluster` 是用於自動探索的目標 Amazon ECS 叢集名稱。此欄位為選用欄位。預設是安裝 CloudWatch 代理程式的 Amazon ECS 叢集名稱。
  + `sd_cluster_region` 是目標 Amazon ECS 叢集的區域。此欄位為選用欄位。預設是安裝 CloudWatch 代理程式的 Amazon ECS 叢集區域。
  + `sd_result_file` 是 Prometheus 目標結果的 YAML 檔案路徑。Prometheus 湊集組態將參與此檔案。
  + `docker_label` 是選用區段，您可以用它來指定 Docker 標籤型服務探索的組態。如果您省略此區段，則不會使用 Docker 標籤型探索。此區段可以包含下列欄位：
    + `sd_port_label` 是容器的 Docker 標籤名稱，用於指定 Prometheus 指標的容器連接埠。預設值為 `ECS_PROMETHEUS_EXPORTER_PORT`。如果容器沒有此 Docker 標籤，CloudWatch 代理程式將略過它。
    + `sd_metrics_path_label` 是容器的 Docker 標籤名稱，用於指定 Prometheus 指標路徑。預設值為 `ECS_PROMETHEUS_METRICS_PATH`。如果容器沒有此 Docker 標籤，則代理程式會假設預設路徑 `/metrics`。
    + `sd_job_name_label` 是容器的 Docker 標籤名稱，用於指定 Prometheus 湊集任務名稱。預設值為 `job`。如果容器沒有此 Docker 標籤，CloudWatch 代理程式會在 Prometheus 湊集組態中使用任務名稱。
  + `task_definition_list` 是選用區段，您可以用它來指定任務定義型服務探索的組態。如果您省略此區段，則不會使用任務定義型探索。此區段可以包含下列欄位：
    + `sd_task_definition_arn_pattern` 是用來指定要探索的 Amazon ECS 任務定義的模式。這是規則表達式。
    + `sd_metrics_ports` 列出了 Prometheus 指標的 containerPort。使用分號分隔 containerPorts。
    + `sd_container_name_pattern` 指定了 Amazon ECS 任務容器名稱。這是規則表達式。
    + `sd_metrics_path` 指定了 Prometheus 指標路徑。如果您省略此項，代理程式會假設預設路徑 `/metrics`
    + `sd_job_name` 指定了 Prometheus 湊集任務名稱。如果您省略此欄位，CloudWatch 代理程式會使用 Prometheus 湊集組態中的任務名稱。
+ **metric\$1declaration**— 是以要產生之內嵌指標格式來指定日誌陣列的區段。根據預設，CloudWatch 代理程式匯入的每個 Prometheus 來源都有 `metric_declaration` 區段。這些區段各包括下列欄位：
  + `label_matcher` 是一個規則表達式，會檢查 `source_labels` 中列出的標籤值。符合的指標已啟用，可包含在傳送至 CloudWatch 的內嵌指標格式。

    如果您在 `source_labels` 中指定了多個標籤，我們建議您不要在 `label_matcher` 的規則表達式中使用 `^` 或 `$` 字元。
  + `source_labels` 指定由 `label_matcher` 行檢查的標籤值。
  + `label_separator` 指定要在 ` label_matcher` 行中使用的分隔符號 (如果指定多個 `source_labels`)。預設值為 `;`。您可以在下面的範例中看到 `label_matcher` 行中使用此預設值。
  + `metric_selectors` 是一個規則表達式，可指定要收集和傳送至 CloudWatch 的指標。
  + `dimensions` 是要用作為每個所選指標之 CloudWatch 維度的標籤清單。

請參閱以下 `metric_declaration` 範例。

```
"metric_declaration": [
  {
     "source_labels":[ "Service", "Namespace"],
     "label_matcher":"(.*node-exporter.*|.*kube-dns.*);kube-system",
     "dimensions":[
        ["Service", "Namespace"]
     ],
     "metric_selectors":[
        "^coredns_dns_request_type_count_total$"
     ]
  }
]
```

此範例會在符合下列條件時，設定內嵌指標格式區段，以作為日誌事件傳送：
+ `Service` 的數值包含 `node-exporter` 或 `kube-dns`。
+ `Namespace` 的值為 `kube-system`。
+ Prometheus 指標 `coredns_dns_request_type_count_total` 包含 `Service` 和 `Namespace` 標籤。

傳送的日誌事件包含下列反白顯示的區段：

```
{
   "CloudWatchMetrics":[
      {
         "Metrics":[
            {
               "Name":"coredns_dns_request_type_count_total"
            }
         ],
         "Dimensions":[
            [
               "Namespace",
               "Service"
            ]
         ],
         "Namespace":"ContainerInsights/Prometheus"
      }
   ],
   "Namespace":"kube-system",
   "Service":"kube-dns",
   "coredns_dns_request_type_count_total":2562,
   "eks_amazonaws_com_component":"kube-dns",
   "instance":"192.168.61.254:9153",
   "job":"kubernetes-service-endpoints",
   ...
}
```

## 新增 Prometheus 湊集目標的教學課程：Prometheus API 伺服器指標
<a name="ContainerInsights-Prometheus-Setup-new-exporters"></a>

Kubernetes API 伺服器預設會在端點上公開 Prometheus 指標。Kubernetes API 伺服器湊集組態的官方範例可以在 [Github](https://github.com/prometheus/prometheus/blob/main/documentation/examples/prometheus-kubernetes.yml) 上取得。

下列教學說明如何執行下列步驟，開始將 Kubernetes API 伺服器指標匯入 CloudWatch：
+ 將 Kubernetes API 伺服器的 Prometheus 湊集組態新增至 CloudWatch 代理程式 YAML 檔案。
+ 在 CloudWatch 代理程式 YAML 檔案中設定內嵌指標格式指標定義。
+ (選用) 為 Kubernetes API 伺服器指標建立 CloudWatch 儀表板。

**注意**  
Kubernetes API 伺服器會公開量測、計數器、長條圖和摘要指標。在此版本的 Prometheus 指標支援中，CloudWatch 僅會匯入具有量測計、計數器和摘要類型的指標。

**若要開始在 CloudWatch 中收集 Kubernetes API 伺服器 Prometheus 指標**

1. 輸入下列其中一個命令，以下載最新版本的 `prometheus-eks.yaml`、`prometheus-eks-fargate.yaml` 或 `prometheus-k8s.yaml` 檔案。

   對於具有 EC2 啟動類型的 Amazon EKS 叢集，請輸入下列命令：

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks.yaml
   ```

   對於具有 Fargate 啟動類型的 Amazon EKS 叢集，請輸入下列命令：

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks-fargate.yaml
   ```

   對於在 Amazon EC2 執行個體上執行的 Kubernetes 叢集，請輸入下列命令：

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-k8s.yaml
   ```

1. 使用文字編輯器開啟檔案，找出 `prometheus-config` 區段，並在該區段內新增以下區段。儲存變更：

   ```
       # Scrape config for API servers
       - job_name: 'kubernetes-apiservers'
         kubernetes_sd_configs:
           - role: endpoints
             namespaces:
               names:
                 - default
         scheme: https
         tls_config:
           ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
           insecure_skip_verify: true
         bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
         relabel_configs:
         - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
           action: keep
           regex: kubernetes;https
         - action: replace
           source_labels:
           - __meta_kubernetes_namespace
           target_label: Namespace
         - action: replace
           source_labels:
           - __meta_kubernetes_service_name
           target_label: Service
   ```

1. 趁文字編輯器中開啟 YAML 檔案時，找出 `cwagentconfig.json` 區段。新增下列子區段並儲存變更。此區段會將 API 伺服器指標放到 CloudWatch 代理程式允許清單上。允許清單中會新增三種類型的 API 伺服器指標：
   + etcd 物件計數
   + API 伺服器註冊控制器指標
   + API 伺服器請求指標

   ```
   {"source_labels": ["job", "resource"],
     "label_matcher": "^kubernetes-apiservers;(services|daemonsets.apps|deployments.apps|configmaps|endpoints|secrets|serviceaccounts|replicasets.apps)",
     "dimensions": [["ClusterName","Service","resource"]],
     "metric_selectors": [
     "^etcd_object_counts$"
     ]
   },
   {"source_labels": ["job", "name"],
      "label_matcher": "^kubernetes-apiservers;APIServiceRegistrationController$",
      "dimensions": [["ClusterName","Service","name"]],
      "metric_selectors": [
      "^workqueue_depth$",
      "^workqueue_adds_total$",
      "^workqueue_retries_total$"
     ]
   },
   {"source_labels": ["job","code"],
     "label_matcher": "^kubernetes-apiservers;2[0-9]{2}$",
     "dimensions": [["ClusterName","Service","code"]],
     "metric_selectors": [
      "^apiserver_request_total$"
     ]
   },
   {"source_labels": ["job"],
     "label_matcher": "^kubernetes-apiservers",
     "dimensions": [["ClusterName","Service"]],
     "metric_selectors": [
     "^apiserver_request_total$"
     ]
   },
   ```

1. 如果您已在叢集中部署具有 Prometheus 支援的 CloudWatch 代理程式，則必須輸入下列命令來刪除它：

   ```
   kubectl delete deployment cwagent-prometheus -n amazon-cloudwatch
   ```

1. 輸入下列其中一個命令，以更新的組態來部署 CloudWatch 代理程式：對於具有 EC2 啟動類型的 Amazon EKS 叢集，請輸入：

   ```
   kubectl apply -f prometheus-eks.yaml
   ```

   對於具有 Fargate 啟動類型的 Amazon EKS 叢集，請輸入下列命令。將 *MyCluster* 和 *region* 取代為可比對部署的數值。

   ```
   cat prometheus-eks-fargate.yaml \
   | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \
   | kubectl apply -f -
   ```

   對於 Kubernetes 叢集，請輸入下列命令。將 *MyCluster* 和 *region* 取代為可比對部署的數值。

   ```
   cat prometheus-k8s.yaml \
   | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \
   | kubectl apply -f -
   ```

完成此操作後，您應該在 **/aws/containerinsights/*cluster\$1name*/prometheus** 日誌群組中查看名為** kubernetes-apiservers **的新日誌串流。此日誌串流應該包含具有內嵌指標格式定義的日誌事件，如下所示：

```
{
   "CloudWatchMetrics":[
      {
         "Metrics":[
            {
               "Name":"apiserver_request_total"
            }
         ],
         "Dimensions":[
            [
               "ClusterName",
               "Service"
            ]
         ],
         "Namespace":"ContainerInsights/Prometheus"
      }
   ],
   "ClusterName":"my-cluster-name",
   "Namespace":"default",
   "Service":"kubernetes",
   "Timestamp":"1592267020339",
   "Version":"0",
   "apiserver_request_count":0,
   "apiserver_request_total":0,
   "code":"0",
   "component":"apiserver",
   "contentType":"application/json",
   "instance":"192.0.2.0:443",
   "job":"kubernetes-apiservers",
   "prom_metric_type":"counter",
   "resource":"pods",
   "scope":"namespace",
   "verb":"WATCH",
   "version":"v1"
}
```

您可以在 **ContainerInsights/Prometheus** 命名空間中的 CloudWatch 主控台中，檢視您的指標。您也可以選擇為您的 Prometheus Kubernetes API 伺服器指標建立 CloudWatch 儀表板。

### (選用) 為 Kubernetes API 伺服器指標建立儀表板。
<a name="ContainerInsights-Prometheus-Setup-KPI-dashboard"></a>

若要在儀表板中查看 Kubernetes API 伺服器指標，您必須先完成先前章節中的步驟，才能開始在 CloudWatch 中收集這些指標。

**若要建立 Kubernetes API 伺服器指標的儀表板**

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 請確定您已選取正確的 AWS 區域。

1. 在導覽窗格中，選擇 **Dashboards** (儀表板)。

1. 選擇 **Create Dashboard (建立儀表板)**。輸入新儀表板的名稱，然後選擇 **Create dashboard (建立儀表板)**。

1. 在 **Add to this dashboard (新增至此儀表板)** 中，選擇 **Cancel (取消)**。

1. 選擇 **Actions (動作)**、**View/edit sources (檢視/編輯來源)**。

1. 下載下列 JSON 檔案：[Kubernetes API 儀表板來源](https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/kubernetes_api_server/cw_dashboard_kubernetes_api_server.json)。

1. 使用文字編輯器開啟您下載的 JSON 檔案，然後進行下列變更：
   + 將所有 `{{YOUR_CLUSTER_NAME}}` 字串取代為您叢集的確切名稱。確定不要在文字前後加空格。
   + 將所有 `{{YOUR_AWS_REGION}}` 字串取代為收集指標的區域的名稱。例如 `us-west-2`。確定不要在文字前後加空格。

1. 複製整個 JSON blob 並將其貼入 CloudWatch 主控台的文字方塊中，取代方塊中已經存在的內容。

1. 選擇 **Update (更新)**、**Save dashboard (儲存儀表板)**。

# (選用) 設定範例容器化 Amazon EKS 工作負載範例進行 Prometheus 指標測試
<a name="ContainerInsights-Prometheus-Sample-Workloads"></a>

若要測試 CloudWatch Container Insights 中的 Prometheus 指標支援，您可以設定下列一或多個容器化工作負載。具有 Prometheus 支援的 CloudWatch 代理程式會自動從這些工作負載收集指標。若要查看預設收集的指標，請參閱 [CloudWatch 代理程式收集的 Prometheus 指標](ContainerInsights-Prometheus-metrics.md)。

在安裝這些工作負載之前，您必須先輸入下列命令來安裝 Helm 3.x：

```
brew install helm
```

如需詳細資訊，請參閱 [Helm](https://helm.sh)。

**Topics**
+ [設定 Amazon EKS 和 Kubernetes AWS App Mesh 的範例工作負載](ContainerInsights-Prometheus-Sample-Workloads-appmesh.md)
+ [在 Amazon EKS 和 Kubernetes 上使用範例流量設定 NGINX](ContainerInsights-Prometheus-Sample-Workloads-nginx.md)
+ [在 Amazon EKS 和 Kubernetes 上使用指標匯出工具設定 memcached](ContainerInsights-Prometheus-Sample-Workloads-memcached.md)
+ [設定適用於 Amazon EKS 和 Kubernetes 的 Java/JMX 範例工作負載](ContainerInsights-Prometheus-Sample-Workloads-javajmx.md)
+ [在 Amazon EKS 和 Kubernetes 上使用指標匯出工具設定 HAProxy](ContainerInsights-Prometheus-Sample-Workloads-haproxy.md)
+ [新增 Prometheus 湊集目標的教學課程：Amazon EKS 和 Kubernetes 叢集上的 Redis OSS](ContainerInsights-Prometheus-Setup-redis-eks.md)

# 設定 Amazon EKS 和 Kubernetes AWS App Mesh 的範例工作負載
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh"></a>

CloudWatch Container Insights 中的 Prometheus 支援可支援 AWS App Mesh。以下各節說明如何設定 App Mesh。

**Topics**
+ [在具有 EC2 啟動類型或 Kubernetes 叢集的 Amazon EKS 叢集上設定 AWS App Mesh 範例工作負載](ContainerInsights-Prometheus-Sample-Workloads-appmesh-EKS.md)
+ [在具有 Fargate 啟動類型的 Amazon EKS 叢集上設定 AWS App Mesh 範例工作負載](ContainerInsights-Prometheus-Sample-Workloads-appmesh-Fargate.md)

# 在具有 EC2 啟動類型或 Kubernetes 叢集的 Amazon EKS 叢集上設定 AWS App Mesh 範例工作負載
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-EKS"></a>

如果您要在執行 Amazon EKS 且具有 EC2 啟動類型的叢集或 Kubernetes 叢集上設定 App Mesh，請使用這些指示。

## 設定 IAM 許可
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-iam"></a>

您必須將 **AWSAppMeshFullAccess** 政策新增至您的 Amazon EKS 或 Kubernetes 節點群組的 IAM 角色。在 Amazon EKS 上，此節點群組名稱看起來類似於 `eksctl-integ-test-eks-prometheus-NodeInstanceRole-ABCDEFHIJKL`。在 Kubernetes 上，它可能看起來類似於 `nodes.integ-test-kops-prometheus.k8s.local`.

## 安裝 App Mesh
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-install"></a>

若要安裝 App Mesh Kubernetes 控制器，請遵循 [App Mesh 控制器](https://github.com/aws/eks-charts/tree/master/stable/appmesh-controller#app-mesh-controller)中的說明進行。

## 安裝範例應用程式
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-application"></a>

[aws-app-mesh-examples](https://github.com/aws/aws-app-mesh-examples) 包含數個 Kubernetes App Mesh 演練。在本教學課程中，您將安裝一個範例色彩應用程式，該應用程式顯示 http 路由如何使用標頭來比對傳入的請求。

**若要使用範例 App Mesh 應用程式來測試 Container Insights**

1. 使用這些指示安裝應用程式：[https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/howto-k8s-http-headers](https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/howto-k8s-http-headers)。

1. 啟動 curler pod 以產生流量：

   ```
   kubectl -n default run -it curler --image=tutum/curl /bin/bash
   ```

1. 透過變更 HTTP 標頭來 Curl 不同的端點。多次執行 curl 命令，如此處所示：

   ```
   curl -H "color_header: blue" front.howto-k8s-http-headers.svc.cluster.local:8080/; echo;
   
   curl -H "color_header: red" front.howto-k8s-http-headers.svc.cluster.local:8080/; echo;
   
   curl -H "color_header: yellow" front.howto-k8s-http-headers.svc.cluster.local:8080/; echo;
   ```

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在叢集執行的 AWS 區域中，選擇導覽窗格中**的指標**。指標位於 **ContainerInsights/Prometheus** 命名空間中。

1. 若要查看 CloudWatch Logs 事件，請在導覽窗格中選擇 **Log groups** (日誌群組)。事件位於日誌串流 `kubernetes-pod-appmesh-envoy` 中的 日誌群組 ` /aws/containerinsights/your_cluster_name/prometheus ` 中。

## 刪除 App Mesh 測試環境
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-delete"></a>

當您使用完 App Mesh 和範例應用程式時，請使用以下命令刪除不必要的資源。輸入下列命令以刪除範例應用程式：

```
cd aws-app-mesh-examples/walkthroughs/howto-k8s-http-headers/
kubectl delete -f _output/manifest.yaml
```

輸入以下命令以刪除 App Mesh 控制器：

```
helm delete appmesh-controller -n appmesh-system
```

# 在具有 Fargate 啟動類型的 Amazon EKS 叢集上設定 AWS App Mesh 範例工作負載
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-Fargate"></a>

如果您要在執行 Amazon EKS 且具有 Fargate 啟動類型的叢集上設定 App Mesh，請使用這些指示。

## 設定 IAM 許可
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh--fargate-iam"></a>

若要設定 IAM 許可，請輸入以下命令。將 *MyCluster* 取代為您的叢集名稱。

```
eksctl create iamserviceaccount --cluster MyCluster \
 --namespace howto-k8s-fargate \
 --name appmesh-pod \
 --attach-policy-arn arn:aws:iam::aws:policy/AWSAppMeshEnvoyAccess \
 --attach-policy-arn arn:aws:iam::aws:policy/AWSCloudMapDiscoverInstanceAccess \
 --attach-policy-arn arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess \
 --attach-policy-arn arn:aws:iam::aws:policy/CloudWatchLogsFullAccess \
 --attach-policy-arn arn:aws:iam::aws:policy/AWSAppMeshFullAccess \
 --attach-policy-arn arn:aws:iam::aws:policy/AWSCloudMapFullAccess \
 --override-existing-serviceaccounts \
 --approve
```

## 安裝 App Mesh
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-fargate-install"></a>

若要安裝 App Mesh Kubernetes 控制器，請遵循 [App Mesh 控制器](https://github.com/aws/eks-charts/tree/master/stable/appmesh-controller#app-mesh-controller)中的說明進行。對於具有 Fargate 啟動類型的 Amazon EKS，請務必遵循指示。

## 安裝範例應用程式
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-fargate-application"></a>

[aws-app-mesh-examples](https://github.com/aws/aws-app-mesh-examples) 包含數個 Kubernetes App Mesh 演練。在本教學課程中，您將安裝適用於具有 Fargate 啟動類型的 Amazon EKS 叢集的範例色彩應用程式。

**若要使用範例 App Mesh 應用程式來測試 Container Insights**

1. 使用這些指示安裝應用程式：[https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/howto-k8s-fargate](https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/howto-k8s-fargate)。

   這些指示假設您正在建立一個具有正確 Fargate 設定檔的新叢集。對於此示範，如果您想要使用已經設定的 Amazon EKS 叢集，可以使用下列命令來設定該叢集。將 *MyCluster* 取代為您的叢集名稱。

   ```
   eksctl create iamserviceaccount --cluster MyCluster \
    --namespace howto-k8s-fargate \
    --name appmesh-pod \
    --attach-policy-arn arn:aws:iam::aws:policy/AWSAppMeshEnvoyAccess \
    --attach-policy-arn arn:aws:iam::aws:policy/AWSCloudMapDiscoverInstanceAccess \
    --attach-policy-arn arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess \
    --attach-policy-arn arn:aws:iam::aws:policy/CloudWatchLogsFullAccess \
    --attach-policy-arn arn:aws:iam::aws:policy/AWSAppMeshFullAccess \
    --attach-policy-arn arn:aws:iam::aws:policy/AWSCloudMapFullAccess \
    --override-existing-serviceaccounts \
    --approve
   ```

   ```
   eksctl create fargateprofile --cluster MyCluster \
   --namespace howto-k8s-fargate --name howto-k8s-fargate
   ```

1. 前端應用程式部署的連接埠：

   ```
   kubectl -n howto-k8s-fargate port-forward deployment/front 8080:8080
   ```

1. Curl 前端應用程式：

   ```
   while true; do  curl -s http://localhost:8080/color; sleep 0.1; echo ; done
   ```

1. 透過 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

1. 在叢集執行的 AWS 區域中，選擇導覽窗格中**的指標**。指標位於 **ContainerInsights/Prometheus** 命名空間中。

1. 若要查看 CloudWatch Logs 事件，請在導覽窗格中選擇 **Log groups** (日誌群組)。事件位於日誌串流 `kubernetes-pod-appmesh-envoy` 中的 日誌群組 ` /aws/containerinsights/your_cluster_name/prometheus ` 中。

## 刪除 App Mesh 測試環境
<a name="ContainerInsights-Prometheus-Sample-Workloads-appmesh-fargate-delete"></a>

當您使用完 App Mesh 和範例應用程式時，請使用以下命令刪除不必要的資源。輸入下列命令以刪除範例應用程式：

```
cd aws-app-mesh-examples/walkthroughs/howto-k8s-fargate/
kubectl delete -f _output/manifest.yaml
```

輸入以下命令以刪除 App Mesh 控制器：

```
helm delete appmesh-controller -n appmesh-system
```

# 在 Amazon EKS 和 Kubernetes 上使用範例流量設定 NGINX
<a name="ContainerInsights-Prometheus-Sample-Workloads-nginx"></a>

NGINX 是一部 Web 伺服器，可同時用作為負載平衡器和反向代理。如需如何使用 NGINX 進行擷取的詳細資訊，請參閱 [kubernetes/ingress-nginx](https://github.com/kubernetes/ingress-nginx)。

**使用範例流量服務安裝 Ingress-NGINX 以測試 Container Insights Prometheus 支援**

1. 輸入以下命令來新增 Helm ingress-nginx 儲存庫：

   ```
   helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
   ```

1. 輸入下列命令：

   ```
   kubectl create namespace nginx-ingress-sample
   
   helm install my-nginx ingress-nginx/ingress-nginx \
   --namespace nginx-ingress-sample \
   --set controller.metrics.enabled=true \
   --set-string controller.metrics.service.annotations."prometheus\.io/port"="10254" \
   --set-string controller.metrics.service.annotations."prometheus\.io/scrape"="true"
   ```

1. 請輸入下列命令，檢查服務是否已正確啟動：

   ```
   kubectl get service -n nginx-ingress-sample
   ```

   這個命令的輸出應該會顯示數欄，包括一個 `EXTERNAL-IP` 欄。

1. 將 `EXTERNAL-IP` 變數設定為 NGINX 傳入控制器一行中 `EXTERNAL-IP` 欄的數值。

   ```
   EXTERNAL_IP=your-nginx-controller-external-ip
   ```

1. 輸入以下命令啟動一些範例 NGINX 流量。

   ```
   SAMPLE_TRAFFIC_NAMESPACE=nginx-sample-traffic
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_traffic/nginx-traffic/nginx-traffic-sample.yaml | 
   sed "s/{{external_ip}}/$EXTERNAL_IP/g" | 
   sed "s/{{namespace}}/$SAMPLE_TRAFFIC_NAMESPACE/g" | 
   kubectl apply -f -
   ```

1. 輸入下列命令以確認三個 pod 全都處於 `Running` 狀態。

   ```
   kubectl get pod -n $SAMPLE_TRAFFIC_NAMESPACE
   ```

   如果它們正在執行，您應該很快就會在 **ContainerInsights/Prometheus** 命名空間中看到指標。

**解除安裝 NGINX 和範例流量應用程式**

1. 輸入下列命令以刪除範例流量服務：

   ```
   kubectl delete namespace $SAMPLE_TRAFFIC_NAMESPACE
   ```

1. 刪除 Helm 發行版本名稱的 NGINX egress。

   ```
   helm uninstall my-nginx --namespace nginx-ingress-sample
   kubectl delete namespace nginx-ingress-sample
   ```

# 在 Amazon EKS 和 Kubernetes 上使用指標匯出工具設定 memcached
<a name="ContainerInsights-Prometheus-Sample-Workloads-memcached"></a>

memcached 是一個開放原始碼記憶體物件快取系統。如需詳細資訊，請參閱[什麼是 Memcached？](https://www.memcached.org)。

如果您在具有 Fargate 啟動類型的叢集上執行 memcached，則需要在執行此程序中的步驟之前設定 Fargate 描述檔。若要設定描述檔，請輸入下列命令。將 *MyCluster* 取代為您的叢集名稱。

```
eksctl create fargateprofile --cluster MyCluster \
--namespace memcached-sample --name memcached-sample
```

**使用指標匯出工具安裝 memcached，以測試 Container Insights Prometheus 支援**

1. 輸入以下命令來新增儲存庫：

   ```
   helm repo add bitnami https://charts.bitnami.com/bitnami
   ```

1. 輸入以下命令來建立新的命名空間：

   ```
   kubectl create namespace memcached-sample
   ```

1. 輸入下列命令以安裝 Memcached

   ```
   helm install my-memcached bitnami/memcached --namespace memcached-sample \
   --set metrics.enabled=true \
   --set-string serviceAnnotations.prometheus\\.io/port="9150" \
   --set-string serviceAnnotations.prometheus\\.io/scrape="true"
   ```

1. 輸入下列命令以確認執行中服務的註釋：

   ```
   kubectl describe service my-memcached-metrics -n memcached-sample
   ```

   您應該會看到下列兩個註釋：

   ```
   Annotations:   prometheus.io/port: 9150
                  prometheus.io/scrape: true
   ```

**解除安裝 memcached**
+ 輸入下列命令：

  ```
  helm uninstall my-memcached --namespace memcached-sample
  kubectl delete namespace memcached-sample
  ```

# 設定適用於 Amazon EKS 和 Kubernetes 的 Java/JMX 範例工作負載
<a name="ContainerInsights-Prometheus-Sample-Workloads-javajmx"></a>

JMX Exporter 是官方的 Prometheus 匯出工具，可以湊集 JMX mBeans 並將其公開為 Prometheus 指標。如需詳細資訊，請參閱 [prometheus/jmx\$1exporter](https://github.com/prometheus/jmx_exporter)。

Container Insights 可以使用 JMX Exporter，從 Java 虛擬機器 (JVM)、Java 和 Tomcat (Catalina) 收集預先定義的 Prometheus 指標。

## 預設 Prometheus 湊集組態
<a name="ContainerInsights-Prometheus-Sample-Workloads-javajmx-default"></a>

根據預設，具有 Prometheus 支援的 CloudWatch 代理程式會從 Amazon EKS 或 Kubernetes 叢集中的每個 pod 上的 `http://CLUSTER_IP:9404/metrics` 湊集 Java/JMX Prometheus 指標。這是透過會由 Prometheus `kubernetes_sd_config` 的 `role: pod` 探索的。9404 是 Prometheus 為 JMX Exporter 配置的預設連接埠。如需 `role: pod` 探索的詳細資訊，請參閱 [pod](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#pod)。您可以設定 JMX Exporter 在不同的連接埠或 metrics\$1path 上公開指標。如果您確實變更連接埠或路徑，請更新 CloudWatch 代理程式組態映射中的預設 jmx scrape\$1config。請執行下列命令以取得目前的 CloudWatch 代理程式 Prometheus 組態：

```
kubectl describe cm prometheus-config -n amazon-cloudwatch
```

要變更的欄位為 `/metrics` 和 `regex: '.*:9404$'` 欄位，如下列範例中反白所示。

```
job_name: 'kubernetes-jmx-pod'
sample_limit: 10000
metrics_path: /metrics
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__address__]
  action: keep
  regex: '.*:9404$'
- action: replace
  regex: (.+)
  source_labels:
```

## 其他 Prometheus 湊集組態
<a name="ContainerInsights-Prometheus-Sample-Workloads-javajmx-other"></a>

如果您透過 Kubernetes Service 使用 Java/JMX Prometheus 匯出工具公開在一組 Pod 上執行的應用程式，則還可以切換到使用 `role: service` 探索或 Prometheus `kubernetes_sd_config` 的 `role: endpoint` 探索。如需這些探索方法的詳細資訊，請參閱[服務](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#service)、[端點](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#endpoints)和 [<kubernetes\$1sd\$1config>](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config)。

這兩種服務探索模式提供了多個中繼標籤，而這可能對您建置 CloudWatch 指標維度非常有用。例如，您可以重新標記 `__meta_kubernetes_service_name` 至 `Service`，並將其包含在您的指標維度中。如需自訂 CloudWatch 指標及其維度的詳細資訊，請參閱 [Prometheus 的 CloudWatch 代理程式組態](ContainerInsights-Prometheus-Setup-configure-ECS.md#ContainerInsights-Prometheus-Setup-cw-agent-config)。

## Docker 影像與 JMX Exporter
<a name="ContainerInsights-Prometheus-Sample-Workloads-javajmx-docker"></a>

下一步：建置 Docker 影像 下列各節提供兩個範例 Dockerfile。

當您建置映像後，請將它載入 Amazon EKS 或 Kubernetes，然後執行下列命令，以確認 `JMX_EXPORTER` 是在連接埠 9404 上公開 Prometheus 指標。將 *\$1JAR\$1SAMPLE\$1TRAFFIC\$1POD* 取代為執行中的 pod 名稱，並將 *\$1JAR\$1SAMPLE\$1TRAFFIC\$1NAMESPACE* 取代為您的應用程式命名空間。

如果您在具有 Fargate 啟動類型的叢集上執行 JMX Exporter，則還需要在執行此程序中的步驟之前設定 Fargate 描述檔。若要設定描述檔，請輸入下列命令。將 *MyCluster* 取代為您的叢集名稱。

```
eksctl create fargateprofile --cluster MyCluster \
--namespace $JAR_SAMPLE_TRAFFIC_NAMESPACE\
 --name $JAR_SAMPLE_TRAFFIC_NAMESPACE
```

```
kubectl exec $JAR_SAMPLE_TRAFFIC_POD -n $JARCAT_SAMPLE_TRAFFIC_NAMESPACE -- curl http://localhost:9404
```

## 範例：具有 Prometheus 指標的 Apache Tomcat Docker 影像
<a name="ContainerInsights-Prometheus-Sample-Workloads-javajmx-tomcat"></a>

Apache Tomcat 伺服器預設會公開 JMX mBeans。您可以將 JMX Exporter 與 Tomcat 整合，以將 JMX mBeans 公開為 Prometheus 指標。下列範例 Dockerfile 顯示建置測試映像的步驟：

```
# From Tomcat 9.0 JDK8 OpenJDK 
FROM tomcat:9.0-jdk8-openjdk 

RUN mkdir -p /opt/jmx_exporter

COPY ./jmx_prometheus_javaagent-0.12.0.jar /opt/jmx_exporter
COPY ./config.yaml /opt/jmx_exporter
COPY ./setenv.sh /usr/local/tomcat/bin 
COPY your web application.war /usr/local/tomcat/webapps/

RUN chmod  o+x /usr/local/tomcat/bin/setenv.sh

ENTRYPOINT ["catalina.sh", "run"]
```

下列清單解釋了這個 Dockerfile 的四個 `COPY` 行。
+ 從 [https://github.com/prometheus/jmx\$1exporter](https://github.com/prometheus/jmx_exporter) 下載最新的 JMX Exporter jar 檔案。
+ `config.yaml` 是 JMX Exporter 組態檔。如需詳細資訊，請參閱 [https://github.com/prometheus/jmx\$1exporter\$1Configuration](https://github.com/prometheus/jmx_exporter#Configuration )。

  以下是 Java 和 Tomcat 的範例組態檔：

  ```
  lowercaseOutputName: true
  lowercaseOutputLabelNames: true
  
  rules:
  - pattern: 'java.lang<type=OperatingSystem><>(FreePhysicalMemorySize|TotalPhysicalMemorySize|FreeSwapSpaceSize|TotalSwapSpaceSize|SystemCpuLoad|ProcessCpuLoad|OpenFileDescriptorCount|AvailableProcessors)'
    name: java_lang_OperatingSystem_$1
    type: GAUGE
  
  - pattern: 'java.lang<type=Threading><>(TotalStartedThreadCount|ThreadCount)'
    name: java_lang_threading_$1
    type: GAUGE
  
  - pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+)'
    name: catalina_globalrequestprocessor_$3_total
    labels:
      port: "$2"
      protocol: "$1"
    help: Catalina global $3
    type: COUNTER
  
  - pattern: 'Catalina<j2eeType=Servlet, WebModule=//([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), name=([-a-zA-Z0-9+/$%~_-|!.]*), J2EEApplication=none, J2EEServer=none><>(requestCount|maxTime|processingTime|errorCount)'
    name: catalina_servlet_$3_total
    labels:
      module: "$1"
      servlet: "$2"
    help: Catalina servlet $3 total
    type: COUNTER
  
  - pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|pollerThreadCount|connectionCount)'
    name: catalina_threadpool_$3
    labels:
      port: "$2"
      protocol: "$1"
    help: Catalina threadpool $3
    type: GAUGE
  
  - pattern: 'Catalina<type=Manager, host=([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), context=([-a-zA-Z0-9+/$%~_-|!.]*)><>(processingTime|sessionCounter|rejectedSessions|expiredSessions)'
    name: catalina_session_$3_total
    labels:
      context: "$2"
      host: "$1"
    help: Catalina session $3 total
    type: COUNTER
  
  - pattern: ".*"
  ```
+ `setenv.sh` 是一個 Tomcat 啟動指令碼，用於啟動 JMX Exporter 和 Tomcat，並在 localhost 的連接埠 9404 上公開 Prometheus 指標。它還為 JMX Exporter 提供了 `config.yaml` 檔案路徑。

  ```
  $ cat setenv.sh 
  export JAVA_OPTS="-javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent-0.12.0.jar=9404:/opt/jmx_exporter/config.yaml $JAVA_OPTS"
  ```
+ 您的 Web 應用程式 .war 是您要由 Tomcat 載入的 Web 應用程式 `war` 檔案。

使用此組態建置一個 Docker 影像並將其上傳到映像儲存庫。

## 範例：具有 Prometheus 指標的 Java Jar 應用程式 Docker 影像
<a name="ContainerInsights-Prometheus-Sample-Workloads-javajmx-jar"></a>

下列範例 Dockerfile 顯示建置測試映像的步驟：

```
# Alpine Linux with OpenJDK JRE
FROM openjdk:8-jre-alpine

RUN mkdir -p /opt/jmx_exporter

COPY ./jmx_prometheus_javaagent-0.12.0.jar /opt/jmx_exporter
COPY ./SampleJavaApplication-1.0-SNAPSHOT.jar /opt/jmx_exporter
COPY ./start_exporter_example.sh /opt/jmx_exporter
COPY ./config.yaml /opt/jmx_exporter

RUN chmod -R o+x /opt/jmx_exporter
RUN apk add curl

ENTRYPOINT exec /opt/jmx_exporter/start_exporter_example.sh
```

下列清單解釋了這個 Dockerfile 的四個 `COPY` 行。
+ 從 [https://github.com/prometheus/jmx\$1exporter](https://github.com/prometheus/jmx_exporter) 下載最新的 JMX Exporter jar 檔案。
+ `config.yaml` 是 JMX Exporter 組態檔。如需詳細資訊，請參閱 [https://github.com/prometheus/jmx\$1exporter\$1Configuration](https://github.com/prometheus/jmx_exporter#Configuration )。

  以下是 Java 和 Tomcat 的範例組態檔：

  ```
  lowercaseOutputName: true
  lowercaseOutputLabelNames: true
  
  rules:
  - pattern: 'java.lang<type=OperatingSystem><>(FreePhysicalMemorySize|TotalPhysicalMemorySize|FreeSwapSpaceSize|TotalSwapSpaceSize|SystemCpuLoad|ProcessCpuLoad|OpenFileDescriptorCount|AvailableProcessors)'
    name: java_lang_OperatingSystem_$1
    type: GAUGE
  
  - pattern: 'java.lang<type=Threading><>(TotalStartedThreadCount|ThreadCount)'
    name: java_lang_threading_$1
    type: GAUGE
  
  - pattern: 'Catalina<type=GlobalRequestProcessor, name=\"(\w+-\w+)-(\d+)\"><>(\w+)'
    name: catalina_globalrequestprocessor_$3_total
    labels:
      port: "$2"
      protocol: "$1"
    help: Catalina global $3
    type: COUNTER
  
  - pattern: 'Catalina<j2eeType=Servlet, WebModule=//([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), name=([-a-zA-Z0-9+/$%~_-|!.]*), J2EEApplication=none, J2EEServer=none><>(requestCount|maxTime|processingTime|errorCount)'
    name: catalina_servlet_$3_total
    labels:
      module: "$1"
      servlet: "$2"
    help: Catalina servlet $3 total
    type: COUNTER
  
  - pattern: 'Catalina<type=ThreadPool, name="(\w+-\w+)-(\d+)"><>(currentThreadCount|currentThreadsBusy|keepAliveCount|pollerThreadCount|connectionCount)'
    name: catalina_threadpool_$3
    labels:
      port: "$2"
      protocol: "$1"
    help: Catalina threadpool $3
    type: GAUGE
  
  - pattern: 'Catalina<type=Manager, host=([-a-zA-Z0-9+&@#/%?=~_|!:.,;]*[-a-zA-Z0-9+&@#/%=~_|]), context=([-a-zA-Z0-9+/$%~_-|!.]*)><>(processingTime|sessionCounter|rejectedSessions|expiredSessions)'
    name: catalina_session_$3_total
    labels:
      context: "$2"
      host: "$1"
    help: Catalina session $3 total
    type: COUNTER
  
  - pattern: ".*"
  ```
+ `start_exporter_example.sh` 是使用匯出的 Prometheus 指標來啟動 JAR 應用程式的指令碼。它還為 JMX Exporter 提供了 `config.yaml` 檔案路徑。

  ```
  $ cat start_exporter_example.sh 
  java -javaagent:/opt/jmx_exporter/jmx_prometheus_javaagent-0.12.0.jar=9404:/opt/jmx_exporter/config.yaml -cp  /opt/jmx_exporter/SampleJavaApplication-1.0-SNAPSHOT.jar com.gubupt.sample.app.App
  ```
+ SampleJavaApplication-1.0-SNAPSHOT.jar 是範例 Java 應用程式 jar 檔案。將其取代為您要監控的 Java 應用程式。

使用此組態建置一個 Docker 影像並將其上傳到映像儲存庫。

# 在 Amazon EKS 和 Kubernetes 上使用指標匯出工具設定 HAProxy
<a name="ContainerInsights-Prometheus-Sample-Workloads-haproxy"></a>

HAProxy 是一個開放程式碼代理應用程式。如需詳細資訊，請參閱 [HAProxy](https://www.haproxy.org)。

如果您在具有 Fargate 啟動類型的叢集上執行 HAProxy，則需要在執行此程序中的步驟之前設定 Fargate 描述檔。若要設定描述檔，請輸入下列命令。將 *MyCluster* 取代為您的叢集名稱。

```
eksctl create fargateprofile --cluster MyCluster \
--namespace haproxy-ingress-sample --name haproxy-ingress-sample
```

**使用指標匯出工具安裝 HAProxy，以測試 Container Insights Prometheus 支援**

1. 輸入下列命令以新增 Helm incubator 儲存庫：

   ```
   helm repo add haproxy-ingress https://haproxy-ingress.github.io/charts
   ```

1. 輸入以下命令來建立新的命名空間：

   ```
   kubectl create namespace haproxy-ingress-sample
   ```

1. 輸入下列命令來安裝 HAProxy：

   ```
   helm install haproxy haproxy-ingress/haproxy-ingress \
   --namespace haproxy-ingress-sample \
   --set defaultBackend.enabled=true \
   --set controller.stats.enabled=true \
   --set controller.metrics.enabled=true \
   --set-string controller.metrics.service.annotations."prometheus\.io/port"="9101" \
   --set-string controller.metrics.service.annotations."prometheus\.io/scrape"="true"
   ```

1. 輸入下列命令以確認服務的註釋：

   ```
   kubectl describe service haproxy-haproxy-ingress-metrics -n haproxy-ingress-sample
   ```

   您應該會看到下列註釋。

   ```
   Annotations:   prometheus.io/port: 9101
                  prometheus.io/scrape: true
   ```

**解除安裝 HAProxy**
+ 輸入下列命令：

  ```
  helm uninstall haproxy --namespace haproxy-ingress-sample
  kubectl delete namespace haproxy-ingress-sample
  ```

# 新增 Prometheus 湊集目標的教學課程：Amazon EKS 和 Kubernetes 叢集上的 Redis OSS
<a name="ContainerInsights-Prometheus-Setup-redis-eks"></a>

本教學課程提供實作介紹，讓您在 Amazon EKS 和 Kubernetes 上湊集範例 Redis OSS 應用程式的 Prometheus 指標。Redis OSS (https://redis.io/) 是一個開放原始碼 (BSD 授權)、記憶體內資料結構存儲，可用作資料庫、快取和訊息代理程式。如需詳細資訊，請參閱 [redis](https://redis.io/)。

redis\$1exporter (授權的 MIT 授權) 可用於在指定的連接埠上公開 Redis OSS Prometheus 指標 (預設：0.0.0.0:9121)。如需詳細資訊，請參閱 [redis\$1exporter](https://github.com/oliver006/redis_exporter)。

本教學課程會使用下列兩個 Docker Hub 儲存庫中的 Docker 影像：
+ [redis](https://hub.docker.com/_/redis?tab=description)
+ [redis\$1exporter](https://hub.docker.com/r/oliver006/redis_exporter)

**若要安裝公開 Prometheus 指標的範例 Redis OSS 工作負載**

1. 設定範例 Redis OSS 工作負載的命名空間。

   ```
   REDIS_NAMESPACE=redis-sample
   ```

1. 如果您在具有 Fargate 啟動類型的叢集上執行 Redis OSS，則需要設定 Fargate 描述檔。若要設定描述檔，請輸入下列命令。將 *MyCluster* 取代為您的叢集名稱。

   ```
   eksctl create fargateprofile --cluster MyCluster \
   --namespace $REDIS_NAMESPACE --name $REDIS_NAMESPACE
   ```

1. 輸入下列命令以安裝範例 Redis OSS 工作負載。

   ```
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_traffic/redis/redis-traffic-sample.yaml \
   | sed "s/{{namespace}}/$REDIS_NAMESPACE/g" \
   | kubectl apply -f -
   ```

1. 此安裝包含名為 `my-redis-metrics` 的服務，而該服務會在連接埠 9121 上公開 Redis OSS Prometheus 指標。請輸入下列命令，以取得服務的詳細資訊：

   ```
   kubectl describe service/my-redis-metrics  -n $REDIS_NAMESPACE
   ```

   在結果的 `Annotations` 區段中，您會看到兩個符合 CloudWatch 代理程式 Prometheus 刮取組態的註釋，以便它可以自動探索工作負載：

   ```
   prometheus.io/port: 9121
   prometheus.io/scrape: true
   ```

   相關的 Prometheus 湊集組態可以在 `kubernetes-eks.yaml` 或 `kubernetes-k8s.yaml` 的 `- job_name: kubernetes-service-endpoints` 區段找到。

**若要開始在 CloudWatch 中收集 Redis OSS Prometheus 指標**

1. 輸入下列其中一個命令，以下載最新版本的 `kubernetes-eks.yaml` 或 `kubernetes-k8s.yaml` 檔案。對於具有 EC2 啟動類型的 Amazon EKS 叢集，請輸入此命令。

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks.yaml
   ```

   對於具有 Fargate 啟動類型的 Amazon EKS 叢集，請輸入此命令。

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks-fargate.yaml
   ```

   對於在 Amazon EC2 執行個體上執行的 Kubernetes 叢集，請輸入下列命令。

   ```
   curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-k8s.yaml
   ```

1. 使用文字編輯器開啟檔案，然後找出 `cwagentconfig.json` 區段。新增下列子區段並儲存變更。請務必遵循現有的縮排模式。

   ```
   {
     "source_labels": ["pod_name"],
     "label_matcher": "^redis-instance$",
     "dimensions": [["Namespace","ClusterName"]],
     "metric_selectors": [
       "^redis_net_(in|out)put_bytes_total$",
       "^redis_(expired|evicted)_keys_total$",
       "^redis_keyspace_(hits|misses)_total$",
       "^redis_memory_used_bytes$",
       "^redis_connected_clients$"
     ]
   },
   {
     "source_labels": ["pod_name"],
     "label_matcher": "^redis-instance$",
     "dimensions": [["Namespace","ClusterName","cmd"]],
     "metric_selectors": [
       "^redis_commands_total$"
     ]
   },
   {
     "source_labels": ["pod_name"],
     "label_matcher": "^redis-instance$",
     "dimensions": [["Namespace","ClusterName","db"]],
     "metric_selectors": [
       "^redis_db_keys$"
     ]
   },
   ```

   您新增的區段會將 Redis OSS 指標放到 CloudWatch 代理程式允許清單中。如需了解這些指標的清單，請參閱下列章節。

1. 如果您已在此叢集中部署具有 Prometheus 支援的 CloudWatch 代理程式，則必須輸入下列命令來刪除它。

   ```
   kubectl delete deployment cwagent-prometheus -n amazon-cloudwatch
   ```

1. 輸入下列其中一個命令，以更新的組態來部署 CloudWatch 代理程式：將 *MyCluster* 和 *region* 取代為可比對設定的數值。

   對於具有 EC2 啟動類型的 Amazon EKS 叢集，請輸入此命令。

   ```
   kubectl apply -f prometheus-eks.yaml
   ```

   對於具有 Fargate 啟動類型的 Amazon EKS 叢集，請輸入此命令。

   ```
   cat prometheus-eks-fargate.yaml \
   | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \
   | kubectl apply -f -
   ```

   對於 Kubernetes 叢集，請輸入此命令。

   ```
   cat prometheus-k8s.yaml \
   | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \
   | kubectl apply -f -
   ```

## 檢視 Redis OSS Prometheus 指標
<a name="ContainerInsights-Prometheus-Setup-redis-eks-view"></a>

此教學課程會將下列指標傳送至 CloudWatch 中的 **ContainerInsights/Prometheus** 命名空間。您可以使用 CloudWatch 主控台查看該命名空間中的指標。


| 指標名稱 | 維度 | 
| --- | --- | 
|  `redis_net_input_bytes_total` |  ClusterName、`Namespace`  | 
|  `redis_net_output_bytes_total` |  ClusterName、`Namespace`  | 
|  `redis_expired_keys_total` |  ClusterName、`Namespace`  | 
|  `redis_evicted_keys_total` |  ClusterName、`Namespace`  | 
|  `redis_keyspace_hits_total` |  ClusterName、`Namespace`  | 
|  `redis_keyspace_misses_total` |  ClusterName、`Namespace`  | 
|  `redis_memory_used_bytes` |  ClusterName、`Namespace`  | 
|  `redis_connected_clients` |  ClusterName、`Namespace`  | 
|  `redis_commands_total` |  ClusterName、`Namespace`、cmd  | 
|  `redis_db_keys` |  ClusterName、`Namespace`、db  | 

**注意**  
**cmd** 維度的數值可以是：`append`、`client`、`command`、`config`、`dbsize`、`flushall`、`get`、`incr`、`info` `latency` 或 `slowlog`。  
**db** 維度的數值可以是 `db0` 至 `db15`。

您也可以為 Redis OSS Prometheus 指標建立 CloudWatch 儀表板。

**若要建立 Redis OSS Prometheus 指標的儀表板**

1. 建立環境變數，取代下面的數值，以符合您的部署。

   ```
   DASHBOARD_NAME=your_cw_dashboard_name
   REGION_NAME=your_metric_region_such_as_us-east-1
   CLUSTER_NAME=your_k8s_cluster_name_here
   NAMESPACE=your_redis_service_namespace_here
   ```

1. 輸入下列命令建立儀表板。

   ```
   curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/redis/cw_dashboard_redis.json \
   | sed "s/{{YOUR_AWS_REGION}}/${REGION_NAME}/g" \
   | sed "s/{{YOUR_CLUSTER_NAME}}/${CLUSTER_NAME}/g" \
   | sed "s/{{YOUR_NAMESPACE}}/${NAMESPACE}/g" \
   ```