

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

# 可觀測性解決方案
<a name="AMG_solutions"></a>

您可以使用 Amazon Managed Grafana 來監控系統或應用程式。 AWS 提供解決方案，協助您為不同類型的運算系統建立基本監控設定。這些解決方案使用 Amazon Managed Service for Prometheus 和 Amazon Managed Grafana 來監控 Amazon EKS 解決方案，讓您深入了解應用程式或服務。

有些解決方案可用來監控 **Amazon EKS 基礎設施**、在 Amazon EKS 中執行的 **Java 虛擬機器 (JVM) 應用程式**，以及在 Amazon EKS 中在 JVM 上執行的 **Apache Kafka 應用程式**。

**Topics**
+ [監控 Amazon EKS](solution-eks.md)
+ [監控 JVM 應用程式](solution-jvm.md)
+ [監控 Kafka 應用程式](solution-kafka.md)

# 使用 Amazon Managed Grafana 監控 Amazon EKS 基礎設施的解決方案
<a name="solution-eks"></a>

監控 Amazon Elastic Kubernetes Service 基礎設施是使用 Amazon Managed Grafana 的最常見案例之一。此頁面說明一個範本，為您提供此案例的解決方案。您可以使用 [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)或搭配 [Terraform](https://www.terraform.io/) 安裝解決方案。

此解決方案會設定：
+ 您的 Amazon Managed Service for Prometheus 工作區可存放來自 Amazon EKS 叢集的指標，並建立受管收集器來抓取指標並將其推送至該工作區。如需詳細資訊，請參閱[使用 AWS 受管收集器擷取指標](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-collector.html)。
+ 使用 CloudWatch 代理程式從 Amazon EKS 叢集收集日誌。日誌存放在 CloudWatch 中，並由 Amazon Managed Grafana 查詢。如需詳細資訊，請參閱[記錄 Amazon EKS](https://docs.aws.amazon.com/prescriptive-guidance/latest/implementing-logging-monitoring-cloudwatch/kubernetes-eks-logging.html)
+ 您的 Amazon Managed Grafana 工作區可提取這些日誌和指標，並建立儀表板和提醒，以協助您監控叢集。

套用此解決方案將建立儀表板和提醒：
+ 評估整體 Amazon EKS 叢集運作狀態。
+ 顯示 Amazon EKS 控制平面的運作狀態和效能。
+ 顯示 Amazon EKS 資料平面的運作狀態和效能。
+ 顯示跨 Kubernetes 命名空間的 Amazon EKS 工作負載洞察。
+ 顯示跨命名空間的資源用量，包括 CPU、記憶體、磁碟和網路用量。

## 關於此解決方案
<a name="solution-eks-about"></a>

此解決方案會設定 Amazon Managed Grafana 工作區，為您的 Amazon EKS 叢集提供指標。這些指標用於產生儀表板和提醒。

這些指標可讓您深入了解 Kubernetes 控制和資料平面的運作狀態和效能，進而更有效地操作 Amazon EKS 叢集。您可以從節點層級、Pod 到 Kubernetes 層級了解 Amazon EKS 叢集，包括詳細監控資源用量。

解決方案同時提供預期和修正功能：
+ **預期**功能包括：
  + 透過推動排程決策來管理資源效率。例如，若要提供效能和可靠性 SLAs 給 Amazon EKS 叢集的內部使用者，您可以根據追蹤歷史用量，將足夠的 CPU 和記憶體資源分配給其工作負載。
  + 用量預測：根據您 Amazon EKS 叢集資源的目前使用率，例如節點、[Amazon EBS 支援的持久性磁碟區](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html)，或 [Application Load Balancer](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html)，您可以提前規劃，例如，針對具有類似需求的新產品或專案。
  + 及早偵測潛在問題：例如，透過分析 Kubernetes 命名空間層級的資源耗用趨勢，您可以了解工作負載用量的季節性。
+ **更正**功能包括：
  + 減少基礎設施和 Kubernetes 工作負載層級問題的平均偵測時間 (MTTD)。例如，透過查看故障診斷儀表板，您可以快速測試有關發生錯誤的假設並消除它們。
  + 判斷問題在堆疊中發生的位置。例如，Amazon EKS 控制平面完全由 管理，如果 API 伺服器超載或連線受到影響，更新 Kubernetes 部署等 AWS 特定操作可能會失敗。

下圖顯示解決方案的儀表板資料夾範例。

![\[此影像顯示使用此解決方案建置的 Grafana 儀表板資料夾範例。\]](http://docs.aws.amazon.com/zh_tw/grafana/latest/userguide/images/eks-solution-dashboard-folder.png)


您可以選擇儀表板以查看更多詳細資訊，例如，選擇檢視工作負載的運算資源將顯示儀表板，如下圖所示。

![\[顯示 Grafana 儀表板範例的影像，顯示使用此解決方案建置的 CPU 用量。\]](http://docs.aws.amazon.com/zh_tw/grafana/latest/userguide/images/eks-solution-dashboard-resource-usage.png)


指標會以 1 分鐘的抓取間隔進行抓取。儀表板會根據特定指標，顯示彙總至 1 分鐘、5 分鐘或更多的指標。

日誌也會顯示在儀表板中，以便您可以查詢和分析日誌，以尋找問題的根本原因。下圖顯示日誌儀表板。

![\[顯示 Grafana 儀表板範例的影像，其中包含使用此解決方案建置的日誌。\]](http://docs.aws.amazon.com/zh_tw/grafana/latest/userguide/images/eks-solution-dashboard-logs.png)


如需此解決方案追蹤的指標清單，請參閱 [追蹤的指標清單](#solution-eks-metrics)。

如需解決方案建立的提醒清單，請參閱 [建立的提醒清單](#solution-eks-alerts)。

## 成本
<a name="solution-eks-costs"></a>

此解決方案會在您的工作區中建立和使用 資源。您將需要支付所建立資源的標準用量費用，包括：
+ 使用者存取 Amazon Managed Grafana 工作區。如需定價的詳細資訊，請參閱 [Amazon Managed Grafana 定價](https://aws.amazon.com/grafana/pricing/)。
+ Amazon Managed Service for Prometheus 指標擷取和儲存，包括使用 Amazon Managed Service for Prometheus 無代理程式收集器，以及指標分析 （查詢範例處理）。此解決方案使用的指標數量取決於 Amazon EKS 叢集組態和用量。

  您可以使用 CloudWatch 在 Amazon Managed Service for Prometheus 中檢視擷取和儲存指標。如需詳細資訊，請參閱《*Amazon Managed Service for Prometheus 使用者指南*》中的 [CloudWatch 指標](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-CW-usage-metrics.html)。

  您可以使用 [Amazon Managed Service for Prometheus 定價](https://aws.amazon.com/prometheus/pricing/)頁面上的定價計算器估計成本。指標數量取決於叢集中的節點數量，以及應用程式產生的指標。
+ CloudWatch Logs 擷取、儲存和分析。根據預設，日誌保留會設定為永不過期。您可以在 CloudWatch 中調整此選項。如需定價的詳細資訊，請參閱 [Amazon CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing/)。
+ 網路成本。您可能會針對跨可用區域、區域或其他流量產生標準 AWS 網路費用。

每個產品的定價頁面提供定價計算器，可協助您了解解決方案的潛在成本。下列資訊有助於取得在與 Amazon EKS 叢集相同可用區域中執行之解決方案的基本成本。


| 產品 | 計算器指標 | Value | 
| --- | --- | --- | 
| Amazon Managed Service for Prometheus | 作用中系列 | 8000 （基本） 15，000 （每個節點） | 
|  | 平均收集間隔 | 60 （秒） | 
| Amazon Managed Service for Prometheus （受管收集器） | 收集器數量 | 1 | 
|  | 範例數量 | 15 （基本） 150 （每個節點） | 
|  | 規則數目 | 161 | 
|  | 平均規則擷取間隔 | 60 （秒） | 
| Amazon Managed Grafana | 作用中編輯器/管理員的數量 | 1 （或更多，取決於您的使用者） | 
| CloudWatch （日誌） | 標準日誌：擷取的資料 | 24.5 GB （基本） 0.5 GB （每個節點） | 
|  | 日誌儲存/存檔 （標準和已取代的日誌） | 是 來存放日誌：假設保留 1 個月 | 
|  | 掃描的預期日誌資料 | 來自 Grafana 的每個日誌洞察查詢都會在指定的期間內掃描群組中的所有日誌內容。 | 

這些數字是執行 EKS 且沒有其他軟體之解決方案的基本號碼。這將為您提供基本成本的預估。它也會免除網路使用成本，這取決於 Amazon Managed Grafana 工作區、Amazon Managed Service for Prometheus 工作區和 Amazon EKS 叢集是否位於相同的可用區域 AWS 區域和 VPN。

**注意**  
當此表格中的項目包含每個資源`(base)`的值和值 （例如，`(per node)`) 時，您應該將基本值新增至每個資源值乘以您擁有該資源的數量。例如，針對**平均作用中時間序列**，輸入 的數字`8000 + the number of nodes in your cluster * 15,000`。如果您有 2 個節點，請輸入 `38,000`，也就是 `8000 + ( 2 * 15,000 )`。

## 先決條件
<a name="solution-eks-prerequisites"></a>

此解決方案需要您在使用解決方案之前完成以下操作。

1. 您必須擁有或**建立您要監控的 Amazon Elastic Kubernetes Service 叢集**，且叢集必須至少有一個節點。叢集必須設定 API 伺服器端點存取，以包含私有存取 （也可以允許公開存取）。

   [身分驗證模式](https://docs.aws.amazon.com/eks/latest/userguide/grant-k8s-access.html#set-cam)必須包含 API 存取 （可以設定為 `API`或 `API_AND_CONFIG_MAP`)。這可讓解決方案部署使用存取項目。

   應該在叢集中安裝下列項目 （透過主控台建立叢集時預設為true，但如果您使用 AWS API 或 建立叢集，則必須新增） AWS CLI： AWS CNI、CoreDNS 和 Kube-proxy AddOns。

   *儲存叢集名稱以稍後指定*。這可在 Amazon EKS 主控台的叢集詳細資訊中找到。
**注意**  
如需如何建立 Amazon EKS 叢集的詳細資訊，請參閱 [Amazon EKS 入門](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)。

1. 您必須在 AWS 帳戶 與 **Amazon EKS 叢集相同的 中建立 Amazon Managed Service for Prometheus 工作區**。如需詳細資訊，請參閱《*Amazon Managed Service for Prometheus 使用者指南*》中的[建立工作區](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-create-workspace.html)。

   *儲存 Amazon Managed Service for Prometheus 工作區 ARN 以供稍後指定。*

1. 您必須在**與 Amazon EKS 叢集相同的 中，使用 Grafana 第 9 版或更新版本建立 Amazon Managed Grafana 工作區**。 AWS 區域 如需建立新工作區的詳細資訊，請參閱 [建立 Amazon Managed Grafana 工作區](AMG-create-workspace.md)。

   工作區角色必須具有存取 Amazon Managed Service for Prometheus 和 Amazon CloudWatch APIs許可。最簡單的方法是使用[服務受管許可](AMG-manage-permissions.md)，然後選取 Amazon Managed Service for Prometheus 和 CloudWatch。您也可以手動將 [AmazonPrometheusQueryAccess](https://docs.aws.amazon.com/prometheus/latest/userguide/security-iam-awsmanpol.html#AmazonPrometheusQueryAccess) 和 [AmazonGrafanaCloudWatchAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonGrafanaCloudWatchAccess) 政策新增至工作區 IAM 角色。

   *儲存 Amazon Managed Grafana 工作區 ID 和端點以供稍後指定。*ID 的格式為 `g-123example`。您可以在 Amazon Managed Grafana 主控台中找到 ID 和端點。端點是工作區的 URL，並包含 ID。例如 `https://g-123example.grafana-workspace.<region>.amazonaws.com/`。

1. 如果您使用 Terraform 部署解決方案，則必須建立可從您的帳戶存取的 **Amazon S3 儲存貯**體。這將用於存放部署的 Terraform 狀態檔案。

   *儲存 Amazon S3 儲存貯體 ID 以供稍後指定。*

1. 若要檢視 Amazon Managed Service for Prometheus 警示規則，您必須啟用 Amazon Managed [Grafana 工作區的 Grafana 警示](v10-alerting-use-grafana-alerts.md)。

   此外，Amazon Managed Grafana 必須具有 Prometheus 資源的下列許可。您必須將這些政策新增至中 [AWS 資料來源的 Amazon Managed Grafana 許可和政策](AMG-manage-permissions.md) 所述的服務管理或客戶管理政策。
   + `aps:ListRules`
   + `aps:ListAlertManagerSilences`
   + `aps:ListAlertManagerAlerts`
   + `aps:GetAlertManagerStatus`
   + `aps:ListAlertManagerAlertGroups`
   + `aps:PutAlertManagerSilences`
   + `aps:DeleteAlertManagerSilence`

**注意**  
雖然不需要嚴格設定解決方案，但您必須在 Amazon Managed Grafana 工作區中設定使用者身分驗證，使用者才能存取建立的儀表板。如需詳細資訊，請參閱[驗證 Amazon Managed Grafana 工作區中的使用者](authentication-in-AMG.md)。

## 使用此解決方案
<a name="solution-eks-use"></a>

此解決方案會設定 AWS 基礎設施，以支援來自 Amazon EKS 叢集的報告和監控指標。您可以使用 [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)或 搭配 [Terraform](https://www.terraform.io/) 安裝它。

------
#### [ Using AWS CDK ]

為您提供此解決方案的一種方式是做為 AWS CDK 應用程式。您將提供有關您要使用的資源的資訊，而解決方案將為您建立抓取器、日誌和儀表板。

**注意**  
此處的步驟假設您有一個已安裝 AWS CLI、 和 AWS CDK以及 [Node.js ](https://nodeja.org/)和 [NPM](https://docs.npmjs.com/) 的環境。您將使用 `make`和 `brew`來簡化建置和其他常見動作。

**使用此解決方案透過 監控 Amazon EKS 叢集 AWS CDK**

1. 請確定您已完成所有[先決條件](#solution-eks-prerequisites)步驟。

1. 從 Amazon S3 下載解決方案的所有檔案。檔案位於 `s3://aws-observability-solutions/EKS/OSS/CDK/v3.0.0/iac`，您可以使用下列 Amazon S3 命令下載檔案。從命令列環境中的資料夾執行此命令。

   ```
   aws s3 sync s3://aws-observability-solutions/EKS/OSS/CDK/v3.0.0/iac/ .
   ```

   您不需要修改這些檔案。

1. 在命令列環境中 （從您下載解決方案檔案的資料夾），執行下列命令。

   設定所需的環境變數。將 *REGION*、*AMG\$1ENDPOINT*、*EKS\$1CLUSTER* 和 *AMP\$1ARN* 取代為您的 AWS 區域、Amazon Managed Grafana 工作區端點 （格式為 `http://g-123example.grafana-workspace.us-east-1.amazonaws.com`)、Amazon EKS 叢集名稱和 Amazon Managed Service for Prometheus 工作區 ARN。

   ```
   export AWS_REGION=REGION
   export AMG_ENDPOINT=AMG_ENDPOINT
   export EKS_CLUSTER_NAME=EKS_CLUSTER
   export AMP_WS_ARN=AMP_ARN
   ```

1. 您必須建立具有 ADMIN 存取權的服務帳戶字符，才能呼叫 Grafana HTTP APIs。如需詳細資訊，請參閱[使用服務帳戶向 Grafana HTTP APIs進行身分驗證](service-accounts.md)。您可以使用 AWS CLI 搭配下列命令來建立字符。您需要以 Grafana 工作區的 ID 取代 *GRAFANA\$1ID* （格式為 `g-123example`)。此金鑰會在 7，200 秒或 2 小時後過期。如果需要，您可以變更時間 (`seconds-to-live`)。部署時間不到一小時。

   ```
   GRAFANA_SA_ID=$(aws grafana create-workspace-service-account \
     --workspace-id GRAFANA_ID \
     --grafana-role ADMIN \
     --name grafana-operator-key \
     --query 'id' \
     --output text)
     
   # creates a new token for calling APIs
   export AMG_API_KEY=$(aws grafana create-workspace-service-account-token \
     --workspace-id $managed_grafana_workspace_id \
     --name "grafana-operator-key-$(date +%s)" \
     --seconds-to-live 7200 \
     --service-account-id $GRAFANA_SA_ID \
     --query 'serviceAccountToken.key' \
     --output text)
   ```

    AWS Systems Manager 使用下列命令將 API 金鑰 AWS CDK 新增至 ，使其可供 使用。將 *AWS\$1REGION* 取代為您的解決方案將在其中執行的區域 （格式為 `us-east-1`)。

   ```
   aws ssm put-parameter --name "/observability-aws-solution-eks-infra/grafana-api-key" \
       --type "SecureString" \
       --value $AMG_API_KEY \
       --region AWS_REGION \
       --overwrite
   ```

1. 執行下列`make`命令，這會安裝專案的任何其他相依性。

   ```
   make deps
   ```

1. 最後，執行 AWS CDK 專案：

   ```
   make build && make pattern aws-observability-solution-eks-infra-$EKS_CLUSTER_NAME deploy
   ```

1. 【選用】 堆疊建立完成後，只要您完成每個叢集的其他先決條件 （包括單獨的 Amazon Managed Grafana 和 Amazon Managed Service for Prometheus 工作區），您就可以使用相同的環境為相同區域中的其他 Amazon EKS 叢集建立更多堆疊執行個體。您需要使用新參數重新定義`export`命令。

堆疊建立完成後，您的 Amazon Managed Grafana 工作區將填入顯示 Amazon EKS 叢集指標的儀表板。隨著抓取器開始收集指標，顯示指標需要幾分鐘的時間。

------
#### [ Using Terraform ]

為您提供此解決方案的一種方式是作為 Terraform 解決方案。您將提供有關您要使用的資源的資訊，而解決方案將為您建立抓取器、日誌和儀表板。

**使用此解決方案來監控具有 Terraform 的 Amazon EKS 叢集**

1. 請確定您已完成所有[先決條件](#solution-eks-prerequisites)步驟。

1. 從 Amazon S3 下載解決方案的所有檔案。檔案位於 `s3://aws-observability-solutions/EKS/OSS/Terraform/v3.0.0/`，您可以使用下列 Amazon S3 命令下載。從命令列環境中的資料夾執行此命令，然後將目錄變更為您要部署的資料夾。

   ```
   aws s3 sync s3://aws-observability-solutions/EKS/OSS/Terraform/v3.0.0/ .
   cd eks-monitoring
   ```

   您不需要修改這些檔案。

1. 在命令列環境中 （從您下載解決方案檔案的資料夾），執行下列命令。

   設定所需的環境變數。將 *REGION*、*AMG\$1ENDPOINT*、*EKS\$1CLUSTER*、*AMP\$1ARN* 和 *S3\$1ID* 取代為您想要部署新資源 AWS 區域 的 （例如 `us-east-1`)、Amazon Managed Grafana 工作區端點 （格式為 `http://g-123example.grafana-workspace.us-east-1.amazonaws.com`)、Amazon EKS 叢集名稱、Amazon Managed Service for Prometheus 工作區 ARN 和 Amazon S3 儲存貯體 ID。

   ```
   export TF_VAR_aws_region=REGION
   export TF_VAR_amg_endpoint=AMG_ENDPOINT
   export TF_VAR_eks_cluster_name=EKS_CLUSTER
   export TF_VAR_amp_ws_arn=AMP_ARN
   export TF_VAR_s3_bucket_id=S3_ID
   ```

1. 您必須建立具有 ADMIN 存取權的服務帳戶字符，才能呼叫 Grafana HTTP APIs。如需詳細資訊，請參閱[使用服務帳戶向 Grafana HTTP APIs進行身分驗證](service-accounts.md)。您可以使用 AWS CLI 搭配下列命令來建立字符。您需要以 Grafana 工作區的 ID 取代 *GRAFANA\$1ID* （格式為 `g-123example`)。此金鑰會在 7，200 秒或 2 小時後過期。如果需要，您可以變更時間 (`seconds-to-live`)。部署時間不到一小時。

   ```
   GRAFANA_SA_ID=$(aws grafana create-workspace-service-account \
     --workspace-id GRAFANA_ID \
     --grafana-role ADMIN \
     --name grafana-operator-key \
     --query 'id' \
     --output text)
     
   # creates a new token for running Terraform
   export TF_VAR_grafana_api_key=$(aws grafana create-workspace-service-account-token \
     --workspace-id $managed_grafana_workspace_id \
     --name "grafana-operator-key-$(date +%s)" \
     --seconds-to-live 7200 \
     --service-account-id $GRAFANA_SA_ID \
     --query 'serviceAccountToken.key' \
     --output text)
   ```
**注意**  
如果您已有服務帳戶，則不需要為工作區建立服務帳戶。在此情況下，請將 *\$1GRAFANA\$1SA\$1ID* 取代為您服務帳戶的 ID。

1. 執行下列`terraform`命令以使用 解決方案初始化 Terraform。

   ```
   terraform init -reconfigure \
   -backend-config="bucket=${TF_VAR_s3_bucket_id}" \
   -backend-config="region=${TF_VAR_aws_region}" \
   -backend-config="key=state/${TF_VAR_eks_cluster_name}/terraform.tfstate"
   ```

1. 最後，部署 Terraform 專案：

   ```
   terraform apply
   ```

建立解決方案時，Amazon Managed Grafana 工作區會填入顯示 Amazon EKS 叢集指標的儀表板。隨著抓取器開始收集指標，顯示指標需要幾分鐘的時間。

------

## 追蹤的指標清單
<a name="solution-eks-metrics"></a>

此解決方案會建立從 Amazon EKS 叢集收集指標的湊集器。這些指標會儲存在 Amazon Managed Service for Prometheus 中，然後顯示在 Amazon Managed Grafana 儀表板中。根據預設，湊集器會收集叢集公開的所有 [Prometheus 相容指標](https://docs.aws.amazon.com/prometheus/latest/userguide/prom-compatible-metrics.html)。在叢集中安裝產生更多指標的軟體將增加收集的指標。如果需要，您可以使用[篩選指標的組態來更新湊集器，以減少指標](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-collector-how-to.html#AMP-collector-configuration)數量。

在基本 Amazon EKS 叢集組態中，此解決方案會追蹤下列指標，而未安裝其他軟體。


| 指標 | 描述/目的 | 
| --- | --- | 
|  `aggregator_unavailable_apiservice`  |  標示為無法使用的 APIServices 計量，依 APIService 名稱細分。  | 
|  `apiserver_admission_webhook_admission_duration_seconds_bucket`  |  以秒為單位的許可 Webhook 延遲長條圖，以名稱識別，並針對每個操作和 API 資源和類型 （驗證或許可） 進行細分。  | 
|  `apiserver_current_inflight_requests`  |  目前使用的傳輸中請求限制數量上限，此 apiserver 在最後一秒的每個請求類型。  | 
|  `apiserver_envelope_encryption_dek_cache_fill_percent`  |  快取 DEKs 目前佔用的快取插槽百分比。  | 
|  `apiserver_flowcontrol_current_executing_requests`  |  API Priority and Fairness 子系統中初始 （適用於 WATCH) 或任何 （適用於非 WATCH) 執行階段的請求數量。  | 
|  `apiserver_flowcontrol_rejected_requests_total`  |  API Priority and Fairness 子系統中初始 （適用於 WATCH) 或任何 （適用於非 WATCH) 執行階段中被拒絕的請求數量。  | 
|  `apiserver_flowcontrol_request_concurrency_limit`  |  為每個優先順序層級設定的正式執行座位數。  | 
|  `apiserver_flowcontrol_request_execution_seconds_bucket`  |  API Priority and Fairness 子系統中初始階段 （適用於 WATCH) 或任何 （適用於非 WATCH) 請求執行階段的儲存貯體長條圖。  | 
|  `apiserver_flowcontrol_request_queue_length_after_enqueue_count`  |  API Priority and Fairness 子系統中請求執行的初始階段 （適用於 WATCH) 或任何階段 （適用於非 WATCH) 計數。  | 
|  `apiserver_request`  |  指出 API 伺服器請求。  | 
|  `apiserver_requested_deprecated_apis`  |  已請求、依 APIs的已棄用 API 計量。  | 
|  `apiserver_request_duration_seconds`  |  每個動詞、試轉值、群組、版本、資源、子資源、範圍和元件的回應延遲分佈，以秒為單位。  | 
|  `apiserver_request_duration_seconds_bucket`  |  每個動詞、試轉值、群組、版本、資源、子資源、範圍和元件的回應延遲分佈的儲存貯體長條圖，以秒為單位。  | 
|  `apiserver_request_slo_duration_seconds`  |  每個動詞、試轉值、群組、版本、資源、子資源、範圍和元件的服務水準目標 (SLO) 回應延遲分佈，以秒為單位。  | 
|  `apiserver_request_terminations_total`  |  apiserver 在自我防禦中終止的請求數量。  | 
|  `apiserver_request_total`  |  每個動詞、試轉值、群組、版本、資源、範圍、元件和 HTTP 回應碼的中斷請求計數器。  | 
|  `container_cpu_usage_seconds_total`  |  消耗的累積 cpu 時間。  | 
|  `container_fs_reads_bytes_total`  |  讀取位元組的累積計數。  | 
|  `container_fs_reads_total`  |  已完成讀取的累積計數。  | 
|  `container_fs_writes_bytes_total`  |  寫入位元組的累積計數。  | 
|  `container_fs_writes_total`  |  已完成寫入的累積計數。  | 
|  `container_memory_cache`  |  頁面快取記憶體總計。  | 
|  `container_memory_rss`  |  RSS 的大小。  | 
|  `container_memory_swap`  |  容器交換用量。  | 
|  `container_memory_working_set_bytes`  |  目前的工作集。  | 
|  `container_network_receive_bytes_total`  |  收到的位元組累積計數。  | 
|  `container_network_receive_packets_dropped_total`  |  接收時捨棄的封包累積計數。  | 
|  `container_network_receive_packets_total`  |  收到的封包累積計數。  | 
|  `container_network_transmit_bytes_total`  |  傳輸的位元組累積計數。  | 
|  `container_network_transmit_packets_dropped_total`  |  傳輸時捨棄的封包累積計數。  | 
|  `container_network_transmit_packets_total`  |  傳輸的封包累積計數。  | 
|  `etcd_request_duration_seconds_bucket`  |  每個操作和物件類型的已壓縮請求延遲的儲存貯體長條圖，以秒為單位。  | 
|  `go_goroutines`  |  目前存在的 goroutine 數目。  | 
|  `go_threads`  |  建立的作業系統執行緒數目。  | 
|  `kubelet_cgroup_manager_duration_seconds_bucket`  |  cgroup Manager 操作的儲存貯體持續時間長條圖，以秒為單位。依方法分解。  | 
|  `kubelet_cgroup_manager_duration_seconds_count`  |  cgroup Manager 操作的持續時間，以秒為單位。依方法分解。  | 
|  `kubelet_node_config_error`  |  如果節點發生組態相關錯誤，此指標為 true (1)，否則為 false (0)。  | 
|  `kubelet_node_name`  |  節點的名稱。計數一律為 1。  | 
|  `kubelet_pleg_relist_duration_seconds_bucket`  |  在 PLEG 中重新列出 Pod 的儲存貯體持續時間長條圖，以秒為單位。  | 
|  `kubelet_pleg_relist_duration_seconds_count`  |  在 PLEG 中重新列出 Pod 的持續時間計數，以秒為單位。  | 
|  `kubelet_pleg_relist_interval_seconds_bucket`  |  在 PLEG 中重新列出間隔的儲存貯體長條圖，以秒為單位。  | 
|  `kubelet_pod_start_duration_seconds_count`  |  從 kubelet 第一次看到 Pod 到 Pod 開始執行的持續時間計數，以秒為單位。  | 
|  `kubelet_pod_worker_duration_seconds_bucket`  |  用於同步單一 Pod 的儲存貯體持續時間長條圖，以秒為單位。依操作類型中斷：建立、更新或同步。  | 
|  `kubelet_pod_worker_duration_seconds_count`  |  同步單一 Pod 的持續時間計數，以秒為單位。依操作類型中斷：建立、更新或同步。  | 
|  `kubelet_running_containers`  |  目前正在執行的容器數量。  | 
|  `kubelet_running_pods`  |  具有執行中 Pod 沙盒的 Pod 數量。  | 
|  `kubelet_runtime_operations_duration_seconds_bucket`  |  以執行時間操作秒為單位的儲存貯體持續時間長條圖。依操作類型分解。  | 
|  `kubelet_runtime_operations_errors_total`  |  依操作類型列出的累計執行時間操作錯誤數目。  | 
|  `kubelet_runtime_operations_total`  |  依操作類型計算的執行時間操作數量。  | 
|  `kube_node_status_allocatable`  |  Pod 可配置的資源量 （在為系統協助程式保留部分 之後）。  | 
|  `kube_node_status_capacity`  |  節點可用的資源總量。  | 
|  `kube_pod_container_resource_limits (CPU)`  |  容器請求的限制資源數量。  | 
|  `kube_pod_container_resource_limits (Memory)`  |  容器請求的限制資源數量。  | 
|  `kube_pod_container_resource_requests (CPU)`  |  容器所請求的請求資源數量。  | 
|  `kube_pod_container_resource_requests (Memory)`  |  容器所請求的請求資源數量。  | 
|  `kube_pod_owner`  |  Pod 擁有者的相關資訊。  | 
|  `kube_resourcequota`  |  Kubernetes 中的資源配額會對命名空間內的 CPU、記憶體和儲存體等資源強制執行用量限制。  | 
|  `node_cpu`  |  節點的 CPU 用量指標，包括每個核心的用量和總用量。  | 
|  `node_cpu_seconds_total`  |  每個模式中花費CPUs 秒數。  | 
|  `node_disk_io_time_seconds`  |  節點在磁碟上執行 I/O 操作所花費的累積時間。  | 
|  `node_disk_io_time_seconds_total`  |  節點在磁碟上執行 I/O 操作所花費的總時間。  | 
|  `node_disk_read_bytes_total`  |  節點從磁碟讀取的位元組總數。  | 
|  `node_disk_written_bytes_total`  |  節點寫入磁碟的位元組總數。  | 
|  `node_filesystem_avail_bytes`  |  Kubernetes 叢集中節點之檔案系統上可用空間的位元組數。  | 
|  `node_filesystem_size_bytes`  |  節點上檔案系統的總大小。  | 
|  `node_load1`  |  節點 CPU 用量的 1 分鐘負載平均值。  | 
|  `node_load15`  |  節點 CPU 用量的 15 分鐘負載平均值。  | 
|  `node_load5`  |  節點 CPU 用量的 5 分鐘負載平均值。  | 
|  `node_memory_Buffers_bytes`  |  節點作業系統用於緩衝區快取的記憶體量。  | 
|  `node_memory_Cached_bytes,`  |  節點作業系統用於磁碟快取的記憶體數量。  | 
|  `node_memory_MemAvailable_bytes`  |  可供應用程式和快取使用的記憶體數量。  | 
|  `node_memory_MemFree_bytes`  |  節點上可用的可用記憶體數量。  | 
|  `node_memory_MemTotal_bytes`  |  節點上可用的實體記憶體總量。  | 
|  `node_network_receive_bytes_total`  |  節點透過網路接收的位元組總數。  | 
|  `node_network_transmit_bytes_total`  |  節點透過網路傳輸的位元組總數。  | 
|  `process_cpu_seconds_total`  |  花費的使用者和系統 CPU 時間總計，以秒為單位。  | 
|  `process_resident_memory_bytes`  |  常駐記憶體大小，以位元組為單位。  | 
|  `rest_client_requests_total`  |  HTTP 請求數量，依狀態碼、方法和主機分割。  | 
|  `rest_client_request_duration_seconds_bucket`  |  請求延遲的儲存貯體長條圖，以秒為單位。被動詞和主機分解。  | 
|  `storage_operation_duration_seconds_bucket`  |  儲存操作持續時間的儲存貯體長條圖。  | 
|  `storage_operation_duration_seconds_count`  |  儲存操作持續時間的計數。  | 
|  `storage_operation_errors_total`  |  儲存操作期間的累積錯誤數。  | 
|  `up`  |  指出受監控目標 （例如節點） 是否已啟動並執行的指標。  | 
|  `volume_manager_total_volumes`  |  磁碟區管理員管理的磁碟區總數。  | 
|  `workqueue_adds_total`  |  工作佇列處理的新增總數。  | 
|  `workqueue_depth`  |  工作佇列的目前深度。  | 
|  `workqueue_queue_duration_seconds_bucket`  |  儲存貯體長條圖，顯示項目在請求之前在工作佇列中停留的秒數。  | 
|  `workqueue_work_duration_seconds_bucket`  |  從工作佇列處理項目所需的儲存貯體長條圖，以秒為單位。  | 

## 建立的提醒清單
<a name="solution-eks-alerts"></a>

下表列出此解決方案建立的提醒。提醒會在 Amazon Managed Service for Prometheus 中建立為規則，並顯示在 Amazon Managed Grafana 工作區中。

您可以修改規則，包括[透過編輯 Amazon Managed Service for Prometheus 工作區中的規則組態檔案](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-rules-edit.html)來新增或刪除規則。

這兩個提醒是特殊提醒，處理方式與一般提醒略有不同。它們不會提醒您問題，而是為您提供用於監控系統的資訊。描述包含如何使用這些提醒的詳細資訊。


| 警示 | 描述和用量 | 
| --- | --- | 
| `Watchdog` | 這是提醒，旨在確保整個提醒管道都正常運作。此提醒一律會觸發，因此應一律在 Alertmanager 中觸發，並一律對接收者觸發。您可以將此與通知機制整合，在*未*觸發此提醒時傳送通知。例如，您可以在 PagerDuty 中使用 **DeadMansSnitch** 整合。 | 
| `InfoInhibitor` | 這是用來禁止資訊提醒的提醒。資訊層級警示本身可能非常吵雜，但在與其他警示結合時是相關的。每當有`severity=info`提醒時，此提醒就會觸發，並在嚴重性為 `warning`或 `critical` 的另一個提醒開始在相同的命名空間上觸發時，停止觸發。此提醒應路由至 null 接收者，並設定為使用 禁止提醒`severity=info`。 | 

下列提醒會為您提供有關系統的資訊或警告。


| 警示 | 嚴重性 | Description | 
| --- | --- | --- | 
|  `NodeNetworkInterfaceFlapping`  | warning |  網路界面通常會變更其狀態  | 
|  `NodeFilesystemSpaceFillingUp`  | warning |  檔案系統預計在接下來的 24 小時內會用盡空間。  | 
|  `NodeFilesystemSpaceFillingUp`  | critical |  檔案系統預計在接下來的 4 小時內會用盡空間。  | 
|  `NodeFilesystemAlmostOutOfSpace`  | warning |  檔案系統的剩餘空間少於 5%。  | 
|  `NodeFilesystemAlmostOutOfSpace`  | critical |  檔案系統的剩餘空間少於 3%。  | 
|  `NodeFilesystemFilesFillingUp`  | warning |  檔案系統預計會在接下來的 24 小時內耗盡索引。  | 
|  `NodeFilesystemFilesFillingUp`  | critical |  檔案系統預計會在接下來的 4 小時內耗盡索引。  | 
|  `NodeFilesystemAlmostOutOfFiles`  | warning |  檔案系統剩餘少於 5% 的索引。  | 
|  `NodeFilesystemAlmostOutOfFiles`  | critical |  檔案系統剩餘少於 3% 的索引。  | 
|  `NodeNetworkReceiveErrs`  | warning |  網路界面報告許多接收錯誤。  | 
|  `NodeNetworkTransmitErrs`  | warning |  網路界面正在報告許多傳輸錯誤。  | 
|  `NodeHighNumberConntrackEntriesUsed`  | warning |  連線項目數量接近限制。  | 
|  `NodeTextFileCollectorScrapeError`  | warning |  Node Exporter 文字檔案收集器無法抓取。  | 
|  `NodeClockSkewDetected`  | warning |  偵測到時鐘扭曲。  | 
|  `NodeClockNotSynchronizzing`  | warning |  時鐘未同步。  | 
|  `NodeRAIDDegraded`  | critical |  RAID 陣列已降級  | 
|  `NodeRAIDDiskFailure`  | warning |  RAID 陣列中的失敗裝置  | 
|  `NodeFileDescriptorLimit`  | warning |  預計核心很快就會耗盡檔案描述項限制。  | 
|  `NodeFileDescriptorLimit`  | critical |  預計核心很快就會耗盡檔案描述項限制。  | 
|  `KubeNodeNotReady`  | warning |  節點尚未就緒。  | 
|  `KubeNodeUnreachable`  | warning |  無法連線節點。  | 
|  `KubeletTooManyPods`  | info |  Kubelet 正在以容量執行。  | 
|  `KubeNodeReadinessFlapping`  | warning |  節點整備狀態為翻轉。  | 
|  `KubeletPlegDurationHigh`  | warning |  Kubelet Pod 生命週期事件產生器重新列出的時間太長。  | 
|  `KubeletPodStartUpLatencyHigh`  | warning |  Kubelet Pod 啟動延遲太高。  | 
|  `KubeletClientCertificateExpiration`  | warning |  Kubelet 用戶端憑證即將過期。  | 
|  `KubeletClientCertificateExpiration`  | critical |  Kubelet 用戶端憑證即將過期。  | 
|  `KubeletServerCertificateExpiration`  | warning |  Kubelet 伺服器憑證即將過期。  | 
|  `KubeletServerCertificateExpiration`  | critical |  Kubelet 伺服器憑證即將過期。  | 
|  `KubeletClientCertificateRenewalErrors`  | warning |  Kubelet 無法續約其用戶端憑證。  | 
|  `KubeletServerCertificateRenewalErrors`  | warning |  Kubelet 無法續約其伺服器憑證。  | 
|  `KubeletDown`  | critical |  目標已從 Prometheus 目標探索中消失。  | 
|  `KubeVersionMismatch`  | warning |  執行中 Kubernetes 元件的不同語意版本。  | 
|  `KubeClientErrors`  | warning |  Kubernetes API 伺服器用戶端發生錯誤。  | 
|  `KubeClientCertificateExpiration`  | warning |  用戶端憑證即將過期。  | 
|  `KubeClientCertificateExpiration`  | critical |  用戶端憑證即將過期。  | 
|  `KubeAggregatedAPIErrors`  | warning |  Kubernetes 彙總 API 已回報錯誤。  | 
|  `KubeAggregatedAPIDown`  | warning |  Kubernetes 彙總 API 已關閉。  | 
|  `KubeAPIDown`  | critical |  目標已從 Prometheus 目標探索中消失。  | 
|  `KubeAPITerminatedRequests`  | warning |  kubernetes apiserver 已終止其傳入請求的 \$1\$1 \$1value \$1 humanizePercentage \$1\$1。  | 
|  `KubePersistentVolumeFillingUp`  | critical |  持久性磁碟區正在填滿。  | 
|  `KubePersistentVolumeFillingUp`  | warning |  持久性磁碟區正在填滿。  | 
|  `KubePersistentVolumeInodesFillingUp`  | critical |  持久性磁碟區 Inodes 正在填滿。  | 
|  `KubePersistentVolumeInodesFillingUp`  | warning |  持久性磁碟區節點正在填滿。  | 
|  `KubePersistentVolumeErrors`  | critical |  持久性磁碟區佈建發生問題。  | 
|  `KubeCPUOvercommit`  | warning |  叢集有過度遞交的 CPU 資源請求。  | 
|  `KubeMemoryOvercommit`  | warning |  叢集有過度遞交的記憶體資源請求。  | 
|  `KubeCPUQuotaOvercommit`  | warning |  叢集有過度遞交的 CPU 資源請求。  | 
|  `KubeMemoryQuotaOvercommit`  | warning |  叢集有過度遞交的記憶體資源請求。  | 
|  `KubeQuotaAlmostFull`  | info |  命名空間配額將已滿。  | 
|  `KubeQuotaFullyUsed`  | info |  命名空間配額已完全使用。  | 
|  `KubeQuotaExceeded`  | warning |  命名空間配額已超過限制。  | 
|  `CPUThrottlingHigh`  | info |  程序會體驗提升的 CPU 限流。  | 
|  `KubePodCrashLooping`  | warning |  Pod 正在當機迴圈。  | 
|  `KubePodNotReady`  | warning |  Pod 已處於非就緒狀態超過 15 分鐘。  | 
|  `KubeDeploymentGenerationMismatch`  | warning |  由於可能的復原，部署產生不相符  | 
|  `KubeDeploymentReplicasMismatch`  | warning |  部署不符合預期的複本數量。  | 
|  `KubeStatefulSetReplicasMismatch`  | warning |  StatefulSet 不符合預期的複本數量。  | 
|  `KubeStatefulSetGenerationMismatch`  | warning |  由於可能的轉返，StatefulSet 產生不相符  | 
|  `KubeStatefulSetUpdateNotRolledOut`  | warning |  StatefulSet 更新尚未推出。  | 
|  `KubeDaemonSetRolloutStuck`  | warning |  DaemonSet 推展卡住。  | 
|  `KubeContainerWaiting`  | warning |  Pod 容器等待超過 1 小時  | 
|  `KubeDaemonSetNotScheduled`  | warning |  未排程 DaemonSet Pod。  | 
|  `KubeDaemonSetMisScheduled`  | warning |  DaemonSet Pod 排程錯誤。  | 
|  `KubeJobNotCompleted`  | warning |  任務未及時完成  | 
|  `KubeJobFailed`  | warning |  任務無法完成。  | 
|  `KubeHpaReplicasMismatch`  | warning |  HPA 不符合所需的複本數量。  | 
|  `KubeHpaMaxedOut`  | warning |  HPA 以最大複本執行  | 
|  `KubeStateMetricsListErrors`  | critical |  kube-state-metrics 在清單操作中遇到錯誤。  | 
|  `KubeStateMetricsWatchErrors`  | critical |  kube-state-metrics 在監看操作中遇到錯誤。  | 
|  `KubeStateMetricsShardingMismatch`  | critical |  kube-state-metrics 碎片設定錯誤。  | 
|  `KubeStateMetricsShardsMissing`  | critical |  缺少 kube-state-metrics 碎片。  | 
|  `KubeAPIErrorBudgetBurn`  | critical |  API 伺服器消耗過多的錯誤預算。  | 
|  `KubeAPIErrorBudgetBurn`  | critical |  API 伺服器消耗過多的錯誤預算。  | 
|  `KubeAPIErrorBudgetBurn`  | warning |  API 伺服器消耗過多的錯誤預算。  | 
|  `KubeAPIErrorBudgetBurn`  | warning |  API 伺服器消耗過多的錯誤預算。  | 
|  `TargetDown`  | warning |  一或多個目標已關閉。  | 
|  `etcdInsufficientMembers`  | critical |  Etcd 叢集成員不足。  | 
|  `etcdHighNumberOfLeaderChanges`  | warning |  Etcd 叢集大量領導者變更。  | 
|  `etcdNoLeader`  | critical |  Etcd 叢集沒有領導者。  | 
|  `etcdHighNumberOfFailedGRPCRequests`  | warning |  Etcd 叢集大量失敗的 gRPC 請求。  | 
|  `etcdGRPCRequestsSlow`  | critical |  Etcd 叢集 gRPC 請求緩慢。  | 
|  `etcdMemberCommunicationSlow`  | warning |  Etcd 叢集成員通訊緩慢。  | 
|  `etcdHighNumberOfFailedProposals`  | warning |  Etcd 叢集大量失敗的提案。  | 
|  `etcdHighFsyncDurations`  | warning |  Etcd 叢集高同步持續時間。  | 
|  `etcdHighCommitDurations`  | warning |  Etcd 叢集的遞交持續時間高於預期。  | 
|  `etcdHighNumberOfFailedHTTPRequests`  | warning |  Etcd 叢集的 HTTP 請求失敗。  | 
|  `etcdHighNumberOfFailedHTTPRequests`  | critical |  Etcd 叢集有大量失敗的 HTTP 請求。  | 
|  `etcdHTTPRequestsSlow`  | warning |  Etcd 叢集 HTTP 請求緩慢。  | 
|  `HostClockNotSynchronizing`  | warning |  主機時鐘未同步。  | 
|  `HostOomKillDetected`  | warning |  偵測到主機 OOM 刪除。  | 

## 疑難排解
<a name="solution-eks-troubleshooting"></a>

有幾件事可能會導致專案設定失敗。請務必檢查下列項目。
+ 您必須先完成所有[先決條件](#solution-eks-prerequisites)，才能安裝解決方案。
+ 叢集必須至少有一個節點，才能嘗試建立解決方案或存取指標。
+ 您的 Amazon EKS 叢集必須安裝 `AWS CNI`、 `CoreDNS`和 `kube-proxy` 附加元件。如果未安裝，解決方案將無法正常運作。透過主控台建立叢集時，預設會安裝它們。如果叢集是透過 AWS SDK 建立，您可能需要安裝它們。
+ Amazon EKS Pod 安裝逾時。如果節點容量不足，就可能發生這種情況。這些問題有多種原因，包括：
  + Amazon EKS 叢集已使用 Fargate 而非 Amazon EC2 初始化。此專案需要 Amazon EC2。
  + 節點會[受到污點](https://docs.aws.amazon.com/eks/latest/userguide/node-taints-managed-node-groups.html)，因此無法使用。

    您可以使用 `kubectl describe node NODENAME | grep Taints`檢查污點。然後`kubectl taint node NODENAME TAINT_NAME-`移除污點。請務必在污點名稱`-`後面包含 。
  + 節點已達到容量限制。在這種情況下，您可以建立新的節點或增加容量。
+ 您在 Grafana 中看不到任何儀表板：使用不正確的 Grafana 工作區 ID。

  執行下列命令以取得 Grafana 的相關資訊：

  ```
  kubectl describe grafanas external-grafana -n grafana-operator
  ```

  您可以檢查結果是否有正確的工作區 URL。如果不是您預期的工作空間，請使用正確的工作區 ID 重新部署。

  ```
  Spec:
    External:
      API Key:
        Key:   GF_SECURITY_ADMIN_APIKEY
        Name:  grafana-admin-credentials
      URL:     https://g-123example.grafana-workspace.aws-region.amazonaws.com
  Status:
    Admin URL:  https://g-123example.grafana-workspace.aws-region.amazonaws.com
    Dashboards:
      ...
  ```
+ 您在 Grafana 中看不到任何儀表板：您正在使用過期的 API 金鑰。

  若要尋找此案例，您需要取得 grafana 運算子並檢查日誌是否有錯誤。使用此命令取得 Grafana 運算子的名稱：

  ```
  kubectl get pods -n grafana-operator
  ```

  這將傳回運算子名稱，例如：

  ```
  NAME                               READY   STATUS    RESTARTS   AGE
  grafana-operator-1234abcd5678ef90   1/1     Running   0          1h2m
  ```

  在下列命令中使用運算子名稱：

  ```
  kubectl logs grafana-operator-1234abcd5678ef90 -n grafana-operator
  ```

  下列錯誤訊息表示 API 金鑰已過期：

  ```
  ERROR   error reconciling datasource    {"controller": "grafanadatasource", "controllerGroup": "grafana.integreatly.org", "controllerKind": "GrafanaDatasource", "GrafanaDatasource": {"name":"grafanadatasource-sample-amp","namespace":"grafana-operator"}, "namespace": "grafana-operator", "name": "grafanadatasource-sample-amp", "reconcileID": "72cfd60c-a255-44a1-bfbd-88b0cbc4f90c", "datasource": "grafanadatasource-sample-amp", "grafana": "external-grafana", "error": "status: 401, body: {\"message\":\"Expired API key\"}\n"}
  github.com/grafana-operator/grafana-operator/controllers.(*GrafanaDatasourceReconciler).Reconcile
  ```

  在此情況下，請建立新的 API 金鑰並再次部署解決方案。如果問題仍然存在，您可以在重新部署之前使用下列命令強制同步：

  ```
  kubectl delete externalsecret/external-secrets-sm -n grafana-operator
  ```
+ *CDK 安裝* – 缺少 SSM 參數。如果您看到類似以下的錯誤，請執行 `cdk bootstrap` ，然後再試一次。

  ```
  Deployment failed: Error: aws-observability-solution-eks-infra-$EKS_CLUSTER_NAME: SSM 
  parameter /cdk-bootstrap/xxxxxxx/version not found. Has the environment been 
  bootstrapped? Please run 'cdk bootstrap' (see https://docs.aws.amazon.com/cdk/latest/
  guide/bootstrapping.html)
  ```
+ 如果 OIDC 提供者已存在，則部署可能會失敗。您會看到如下所示的錯誤 （在此情況下，適用於 CDK 安裝）：

  ```
  | CREATE_FAILED | Custom::AWSCDKOpenIdConnectProvider | OIDCProvider/Resource/Default
  Received response status [FAILED] from custom resource. Message returned: 
  EntityAlreadyExistsException: Provider with url https://oidc.eks.REGION.amazonaws.com/id/PROVIDER ID already exists.
  ```

  在此情況下，請前往 IAM 入口網站並刪除 OIDC 供應商，然後再試一次。
+ *Terraform 安裝* – 您看到錯誤訊息，其中包含 `cluster-secretstore-sm failed to create kubernetes rest client for update of resource`和 `failed to create kubernetes rest client for update of resource`。

  此錯誤通常表示未在您的 Kubernetes 叢集中安裝或啟用外部秘密運算子。這是做為解決方案部署的一部分進行安裝，但有時在解決方案需要它時尚未就緒。

  您可以使用下列命令來驗證是否已安裝：

  ```
  kubectl get deployments -n external-secrets
  ```

  如果已安裝，可能需要一些時間才能完全準備好使用運算子。您可以執行下列命令，檢查所需自訂資源定義 (CRDs的狀態：

  ```
  kubectl get crds|grep external-secrets
  ```

  此命令應列出與外部秘密運算子相關的 CRDs，包括 `clustersecretstores.external-secrets.io`和 `externalsecrets.external-secrets.io`。如果未列出，請等待幾分鐘，然後再次檢查。

  註冊 CRDs後，您可以`terraform apply`再次執行 來部署解決方案。

# 使用 Amazon Managed Grafana 監控 JVM 應用程式的解決方案
<a name="solution-jvm"></a>

使用 Java 虛擬機器 (JVM) 建置的應用程式有專門的監控需求。此頁面說明 範本，提供監控在 Amazon EKS 叢集上執行之 JVM 型應用程式的解決方案。您可以使用 安裝解決方案[AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)。

**注意**  
此解決方案提供 JVM 應用程式的監控。如果您的 JVM 應用程式特別為 Apache Kafka 應用程式，您可以選擇使用 [Kafka 監控解決方案](solution-kafka.md)，其中包含 JVM 和 Kafka 監控。

此解決方案會設定：
+ Amazon Managed Service for Prometheus 工作區，用於存放來自 Amazon EKS 叢集的 Java 虛擬機器 (JVM) 指標。
+ 使用 CloudWatch 代理程式以及 CloudWatch 代理程式附加元件收集特定 JVM 指標。指標設定為傳送至 Amazon Managed Service for Prometheus 工作區。
+ 您的 Amazon Managed Grafana 工作區可提取這些指標，並建立儀表板以協助您監控叢集。

**注意**  
此解決方案為在 Amazon EKS 上執行的應用程式提供 JVM 指標，但不包含 Amazon EKS 指標。您也可以使用[可觀測性解決方案來監控 Amazon EKS](solution-eks.md)，以查看 Amazon EKS 叢集的指標和提醒。

## 關於此解決方案
<a name="solution-jvm-about"></a>

此解決方案會設定 Amazon Managed Grafana 工作區，為您的 Java 虛擬機器 (JVM) 應用程式提供指標。這些指標用於產生儀表板，透過提供應用程式運作狀態和效能的洞察，協助您更有效地操作應用程式。

下圖顯示此解決方案所建立其中一個儀表板的範例。

![\[此影像顯示使用此解決方案建置的 Grafana 儀表板資料夾範例。\]](http://docs.aws.amazon.com/zh_tw/grafana/latest/userguide/images/jvm-solution-overview.png)


指標會以 1 分鐘的抓取間隔進行抓取。儀表板會根據特定指標，顯示彙總至 1 分鐘、5 分鐘或更多的指標。

如需此解決方案追蹤的指標清單，請參閱 [追蹤的指標清單](#solution-jvm-metrics)。

## 成本
<a name="solution-jvm-costs"></a>

此解決方案會在您的工作區中建立和使用 資源。您將需要支付所建立資源的標準用量費用，包括：
+ 使用者存取 Amazon Managed Grafana 工作區。如需定價的詳細資訊，請參閱 [Amazon Managed Grafana 定價](https://aws.amazon.com/grafana/pricing/)。
+ Amazon Managed Service for Prometheus 指標擷取和儲存，以及指標分析 （查詢範例處理）。此解決方案使用的指標數量取決於您的應用程式組態和用量。

  您可以使用 CloudWatch 檢視 Amazon Managed Service for Prometheus 中的擷取和儲存指標 如需詳細資訊，請參閱《*Amazon Managed Service for Prometheus 使用者指南*》中的 [CloudWatch 指標](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-CW-usage-metrics.html)。

  您可以使用 [Amazon Managed Service for Prometheus 定價](https://aws.amazon.com/prometheus/pricing/)頁面上的定價計算器來估計成本。指標數量取決於叢集中的節點數量，以及應用程式產生的指標。
+ 網路成本。您可能會針對跨可用區域、區域或其他流量產生標準 AWS 網路費用。

每個產品的定價頁面提供定價計算器，可協助您了解解決方案的潛在成本。下列資訊有助於取得在與 Amazon EKS 叢集相同可用區域中執行之解決方案的基本成本。


| 產品 | 計算器指標 | Value | 
| --- | --- | --- | 
| Amazon Managed Service for Prometheus | 作用中系列 | 50 （每個應用程式 Pod) | 
|  | 平均收集間隔 | 60 （秒） | 
| Amazon Managed Grafana | 作用中編輯器/管理員的數量 | 1 （或更多，視您的使用者而定） | 

這些數字是在 Amazon EKS 上執行的 JVM 應用程式的基本號碼。這將為您提供基本成本的預估。當您將 Pod 新增至應用程式時，成本將會增加，如下所示。這些成本會免除網路使用成本，這取決於 Amazon Managed Grafana 工作區、Amazon Managed Service for Prometheus 工作區和 Amazon EKS 叢集是否位於相同的可用區域 AWS 區域和 VPN。

## 先決條件
<a name="solution-jvm-prerequisites"></a>

此解決方案需要您在使用解決方案之前完成以下操作。

1. 您必須擁有或**建立您要監控的 Amazon Elastic Kubernetes Service 叢集**，且叢集必須至少有一個節點。叢集必須設定 API 伺服器端點存取，以包含私有存取 （也可以允許公開存取）。

   [身分驗證模式](https://docs.aws.amazon.com/eks/latest/userguide/grant-k8s-access.html#set-cam)必須包含 API 存取 （可以設定為 `API`或 `API_AND_CONFIG_MAP`)。這可讓解決方案部署使用存取項目。

   應該在叢集中安裝下列項目 （透過主控台建立叢集時預設為 true，但如果您使用 AWS API 或 建立叢集，則必須新增） AWS CLI：Amazon EKS Pod Identity Agent、 AWS CNI、CoreDNS、Kube-proxy 和 Amazon EBS CSI Driver AddOns （解決方案在技術上不需要 Amazon EBS CSI Driver AddOn，但某些 JVM 應用程式需要）。

   *儲存叢集名稱以稍後指定*。這可在 Amazon EKS 主控台的叢集詳細資訊中找到。
**注意**  
如需如何建立 Amazon EKS 叢集的詳細資訊，請參閱 [Amazon EKS 入門](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)。

1. 您必須在 Amazon EKS 叢集的 Java 虛擬機器上執行應用程式。

1. 您必須在 AWS 帳戶 與 **Amazon EKS 叢集相同的 中建立 Amazon Managed Service for Prometheus 工作區**。如需詳細資訊，請參閱《*Amazon Managed Service for Prometheus 使用者指南*》中的[建立工作區](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-create-workspace.html)。

   *儲存 Amazon Managed Service for Prometheus 工作區 ARN 以供稍後指定。*

1. 您必須在**與 Amazon EKS 叢集相同的 中，使用 Grafana 第 9 版或更新版本建立 Amazon Managed Grafana 工作區**。 AWS 區域 如需建立新工作區的詳細資訊，請參閱 [建立 Amazon Managed Grafana 工作區](AMG-create-workspace.md)。

   工作區角色必須具有存取 Amazon Managed Service for Prometheus 和 Amazon CloudWatch APIs許可。最簡單的方法是使用[服務受管許可](AMG-manage-permissions.md)，然後選取 Amazon Managed Service for Prometheus 和 CloudWatch。您也可以手動將 [AmazonPrometheusQueryAccess](https://docs.aws.amazon.com/prometheus/latest/userguide/security-iam-awsmanpol.html#AmazonPrometheusQueryAccess) 和 [AmazonGrafanaCloudWatchAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonGrafanaCloudWatchAccess) 政策新增至工作區 IAM 角色。

   *儲存 Amazon Managed Grafana 工作區 ID 和端點以供稍後指定。*ID 的格式為 `g-123example`。您可以在 Amazon Managed Grafana 主控台中找到 ID 和端點。端點是工作區的 URL，並包含 ID。例如 `https://g-123example.grafana-workspace.<region>.amazonaws.com/`。

**注意**  
雖然不需要嚴格設定解決方案，但您必須在 Amazon Managed Grafana 工作區中設定使用者身分驗證，使用者才能存取建立的儀表板。如需詳細資訊，請參閱[驗證 Amazon Managed Grafana 工作區中的使用者](authentication-in-AMG.md)。

## 使用此解決方案
<a name="solution-jvm-use"></a>

此解決方案會設定 AWS 基礎設施，以支援從 Amazon EKS 叢集中執行的 Java 虛擬機器 (JVM) 應用程式報告和監控指標。您可以使用 安裝它[AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)。

**注意**  
此處的步驟假設您有一個已安裝 AWS CLI、 和 AWS CDK以及 [Node.js ](https://nodeja.org/)和 [NPM](https://docs.npmjs.com/) 的環境。您將使用 `make`和 `brew`來簡化建置和其他常見動作。

**使用此解決方案透過 監控 Amazon EKS 叢集 AWS CDK**

1. 請確定您已完成所有[先決條件](#solution-jvm-prerequisites)步驟。

1. 從 Amazon S3 下載解決方案的所有檔案。檔案位於 `s3://aws-observability-solutions/JVM_EKS/OSS/CDK/v1.0.0/iac`，您可以使用下列 Amazon S3 命令下載。從命令列環境中的資料夾執行此命令。

   ```
   aws s3 sync s3://aws-observability-solutions/JVM_EKS/OSS/CDK/v1.0.0/iac/ .
   ```

   您不需要修改這些檔案。

1. 在命令列環境中 （從您下載解決方案檔案的資料夾），執行下列命令。

   設定所需的環境變數。將 *REGION*、*AMG\$1ENDPOINT*、*EKS\$1CLUSTER* 和 *AMP\$1ARN* 取代為您的 AWS 區域、Amazon Managed Grafana 工作區端點 （格式為 `http://g-123example.grafana-workspace.us-east-1.amazonaws.com`)、Amazon EKS 叢集名稱和 Amazon Managed Service for Prometheus 工作區 ARN。

   ```
   export AWS_REGION=REGION
   export AMG_ENDPOINT=AMG_ENDPOINT
   export EKS_CLUSTER_NAME=EKS_CLUSTER
   export AMP_WS_ARN=AMP_ARN
   ```

1. 建立可供解決方案使用的註釋。您可以選擇直接註釋命名空間、部署、狀態集、協助程式集或 Pod。JSM 解決方案需要兩個註釋。您將使用 `kubectl`以下列命令來註釋資源：

   ```
   kubectl annotate <resource-type> <resource-value> instrumentation.opentelemetry.io/inject-java=true
   kubectl annotate <resource-type> <resource-value> cloudwatch.aws.amazon.com/inject-jmx-jvm=true
   ```

   將 *<resource-type>* 和 *<resource-value>* 取代為系統的正確值。例如，若要註釋您的`foo`部署，您的第一個命令將是：

   ```
   kubectl annotate deployment foo instrumentation.opentelemetry.io/inject-java=true
   ```

1. 建立具有 ADMIN 存取權的服務帳戶字符，以呼叫 Grafana HTTP APIs。如需詳細資訊，請參閱[使用服務帳戶向 Grafana HTTP APIs進行身分驗證](service-accounts.md)。您可以使用 AWS CLI 搭配下列命令來建立字符。您需要以 Grafana 工作區的 ID 取代 *GRAFANA\$1ID* （格式為 `g-123example`)。此金鑰會在 7，200 秒或 2 小時後過期。如果需要，您可以變更時間 (`seconds-to-live`)。部署時間不到一小時。

   ```
   # creates a new service account (optional: you can use an existing account)
   GRAFANA_SA_ID=$(aws grafana create-workspace-service-account \
     --workspace-id GRAFANA_ID \
     --grafana-role ADMIN \
     --name grafana-operator-key \
     --query 'id' \
     --output text)
   
   # creates a new token for calling APIs
   export AMG_API_KEY=$(aws grafana create-workspace-service-account-token \
     --workspace-id $managed_grafana_workspace_id \
     --name "grafana-operator-key-$(date +%s)" \
     --seconds-to-live 7200 \
     --service-account-id $GRAFANA_SA_ID \
     --query 'serviceAccountToken.key' \
     --output text)
   ```

    AWS Systems Manager 使用下列命令將 API 金鑰 AWS CDK 新增至 ，使其可供 使用。將 *AWS\$1REGION* 取代為您的解決方案將在其中執行的區域 （格式為 `us-east-1`)。

   ```
   aws ssm put-parameter --name "/observability-aws-solution-jvm-eks/grafana-api-key" \
     --type "SecureString" \
     --value $AMG_API_KEY \
     --region AWS_REGION \
     --overwrite
   ```

1. 執行下列`make`命令，這會為專案安裝任何其他相依性。

   ```
   make deps
   ```

1. 最後，執行 AWS CDK 專案：

   ```
   make build && make pattern aws-observability-solution-jvm-eks-$EKS_CLUSTER_NAME deploy
   ```

1. 【選用】 堆疊建立完成後，只要您完成每個 （包括單獨的 Amazon Managed Grafana 和 Amazon Managed Service for Prometheus 工作區） 的其他先決條件，您就可以使用相同的環境為在相同區域中 Amazon EKS 叢集上執行的其他 JVM 應用程式建立更多堆疊執行個體。您需要使用新參數重新定義`export`命令。

堆疊建立完成後，您的 Amazon Managed Grafana 工作區將填入儀表板，其中顯示應用程式和 Amazon EKS 叢集的指標。收集指標時，需要幾分鐘的時間才會顯示指標。

## 追蹤的指標清單
<a name="solution-jvm-metrics"></a>

此解決方案會從以 JVM 為基礎的應用程式收集指標。這些指標儲存在 Amazon Managed Service for Prometheus 中，然後顯示在 Amazon Managed Grafana 儀表板中。

系統會使用此解決方案追蹤下列指標。
+ jvm.classes.loaded
+ jvm.gc.collections.count
+ jvm.gc.collections.elapsed
+ jvm.memory.heap.init
+ jvm.memory.heap.max
+ jvm.memory.heap.used
+ jvm.memory.heap.committed
+ jvm.memory.nonheap.init
+ jvm.memory.nonheap.max
+ jvm.memory.nonheap.used
+ jvm.memory.nonheap.committed
+ jvm.memory.pool.init
+ jvm.memory.pool.max
+ jvm.memory.pool.used
+ jvm.memory.pool.committed
+ jvm.threads.count

## 疑難排解
<a name="solution-jvm-troubleshooting"></a>

有幾件事可能會導致專案設定失敗。請務必檢查下列項目。
+ 您必須先完成所有[先決條件](#solution-jvm-prerequisites)，才能安裝解決方案。
+ 叢集必須至少有一個節點，才能嘗試建立解決方案或存取指標。
+ 您的 Amazon EKS 叢集必須安裝 `AWS CNI`、 `CoreDNS`和 `kube-proxy` 附加元件。如果未安裝，解決方案將無法正常運作。透過主控台建立叢集時，預設會安裝它們。如果叢集是透過 AWS SDK 建立，您可能需要安裝它們。
+ Amazon EKS Pod 安裝逾時。如果節點容量不足，就可能發生這種情況。這些問題有多種原因，包括：
  + Amazon EKS 叢集已使用 Fargate 而非 Amazon EC2 初始化。此專案需要 Amazon EC2。
  + 節點會[受到污點](https://docs.aws.amazon.com/eks/latest/userguide/node-taints-managed-node-groups.html)，因此無法使用。

    您可以使用 `kubectl describe node NODENAME | grep Taints`檢查污點。然後`kubectl taint node NODENAME TAINT_NAME-`移除污點。請務必在污點名稱`-`後面包含 。
  + 節點已達到容量限制。在這種情況下，您可以建立新的節點或增加容量。
+ 您在 Grafana 中看不到任何儀表板：使用不正確的 Grafana 工作區 ID。

  執行下列命令以取得 Grafana 的相關資訊：

  ```
  kubectl describe grafanas external-grafana -n grafana-operator
  ```

  您可以檢查結果是否有正確的工作區 URL。如果不是您預期的工作空間，請使用正確的工作區 ID 重新部署。

  ```
  Spec:
    External:
      API Key:
        Key:   GF_SECURITY_ADMIN_APIKEY
        Name:  grafana-admin-credentials
      URL:     https://g-123example.grafana-workspace.aws-region.amazonaws.com
  Status:
    Admin URL:  https://g-123example.grafana-workspace.aws-region.amazonaws.com
    Dashboards:
      ...
  ```
+ 您在 Grafana 中看不到任何儀表板：您正在使用過期的 API 金鑰。

  若要尋找此案例，您需要取得 grafana 運算子並檢查日誌是否有錯誤。使用此命令取得 Grafana 運算子的名稱：

  ```
  kubectl get pods -n grafana-operator
  ```

  這將傳回運算子名稱，例如：

  ```
  NAME                               READY   STATUS    RESTARTS   AGE
  grafana-operator-1234abcd5678ef90   1/1     Running   0          1h2m
  ```

  在下列命令中使用運算子名稱：

  ```
  kubectl logs grafana-operator-1234abcd5678ef90 -n grafana-operator
  ```

  下列錯誤訊息表示 API 金鑰已過期：

  ```
  ERROR   error reconciling datasource    {"controller": "grafanadatasource", "controllerGroup": "grafana.integreatly.org", "controllerKind": "GrafanaDatasource", "GrafanaDatasource": {"name":"grafanadatasource-sample-amp","namespace":"grafana-operator"}, "namespace": "grafana-operator", "name": "grafanadatasource-sample-amp", "reconcileID": "72cfd60c-a255-44a1-bfbd-88b0cbc4f90c", "datasource": "grafanadatasource-sample-amp", "grafana": "external-grafana", "error": "status: 401, body: {\"message\":\"Expired API key\"}\n"}
  github.com/grafana-operator/grafana-operator/controllers.(*GrafanaDatasourceReconciler).Reconcile
  ```

  在此情況下，請建立新的 API 金鑰並再次部署解決方案。如果問題仍然存在，您可以在重新部署之前使用下列命令強制同步：

  ```
  kubectl delete externalsecret/external-secrets-sm -n grafana-operator
  ```
+ 缺少 SSM 參數。如果您看到類似以下的錯誤，請執行 `cdk bootstrap` ，然後再試一次。

  ```
  Deployment failed: Error: aws-observability-solution-jvm-eks-$EKS_CLUSTER_NAME: SSM 
  parameter /cdk-bootstrap/xxxxxxx/version not found. Has the environment been 
  bootstrapped? Please run 'cdk bootstrap' (see https://docs.aws.amazon.com/cdk/latest/
  guide/bootstrapping.html)
  ```

# 使用 Amazon Managed Grafana 監控 Kafka 應用程式的解決方案
<a name="solution-kafka"></a>

在 [Apache Kafka](https://kafka.apache.org) 上建置的應用程式有專門的監控需求。此頁面說明一個 範本，提供監控 Amazon EKS 叢集上 Java 虛擬機器中執行之 Kafka 應用程式的解決方案。您可以使用 安裝解決方案[AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)。

**注意**  
此解決方案不支援監控 Amazon Managed Streaming for Apache Kafka 應用程式。如需有關監控 Amazon MSK 應用程式的資訊，請參閱[《Amazon Managed Streaming for Apache Kafka 開發人員指南》中的監控 Amazon MSK 叢集](https://docs.aws.amazon.com/msk/latest/developerguide/monitoring.html)。 **

此解決方案會設定：
+ Amazon Managed Service for Prometheus 工作區，用於從 Amazon EKS 叢集存放 Kafka 和 Java 虛擬機器 (JVM) 指標。
+ 使用 CloudWatch 代理程式以及 CloudWatch 代理程式附加元件收集特定 Kafka 和 JVM 指標。指標設定為傳送至 Amazon Managed Service for Prometheus 工作區。
+ 您的 Amazon Managed Grafana 工作區可提取這些指標，並建立儀表板以協助您監控叢集。

**注意**  
此解決方案為在 Amazon EKS 上執行的應用程式提供 JVM 和 Kafka 指標，但不包含 Amazon EKS 指標。您可以使用[可觀測性解決方案來監控 Amazon EKS](solution-eks.md)，以查看 Amazon EKS 叢集的指標和提醒。

## 關於此解決方案
<a name="solution-kafka-about"></a>

此解決方案會設定 Amazon Managed Grafana 工作區，為您的 Apache Kafka 應用程式提供指標。這些指標用於產生儀表板，透過提供 Kafka 應用程式的效能和工作負載洞察，協助您更有效地操作應用程式。

下圖顯示此解決方案所建立其中一個儀表板的範例。

![\[此影像顯示使用此解決方案建置的 Grafana 儀表板資料夾範例。\]](http://docs.aws.amazon.com/zh_tw/grafana/latest/userguide/images/kafka-solution-cluster-overview.png)


指標會以 1 分鐘的抓取間隔進行抓取。儀表板會根據特定指標，顯示彙總至 1 分鐘、5 分鐘或更多的指標。

如需此解決方案追蹤的指標清單，請參閱 [追蹤的指標清單](#solution-kafka-metrics)。

## 成本
<a name="solution-kafka-costs"></a>

此解決方案會在您的工作區中建立和使用 資源。您將需要支付所建立資源的標準用量費用，包括：
+ 使用者存取 Amazon Managed Grafana 工作區。如需定價的詳細資訊，請參閱 [Amazon Managed Grafana 定價](https://aws.amazon.com/grafana/pricing/)。
+ Amazon Managed Service for Prometheus 指標擷取和儲存，以及指標分析 （查詢範例處理）。此解決方案使用的指標數量取決於您的應用程式組態和用量。

  您可以使用 CloudWatch 檢視 Amazon Managed Service for Prometheus 中的擷取和儲存指標。如需詳細資訊，請參閱《*Amazon Managed Service for Prometheus 使用者指南*》中的 [CloudWatch 指標](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-CW-usage-metrics.html)。

  您可以使用 [Amazon Managed Service for Prometheus 定價](https://aws.amazon.com/prometheus/pricing/)頁面上的定價計算器估計成本。指標數量取決於叢集中的節點數量，以及應用程式產生的指標。
+ 網路成本。您可能會針對跨可用區域、區域或其他流量產生標準 AWS 網路費用。

每個產品的定價頁面提供定價計算器，可協助您了解解決方案的潛在成本。下列資訊有助於取得在與 Amazon EKS 叢集相同可用區域中執行之解決方案的基本成本。


| 產品 | 計算器指標 | Value | 
| --- | --- | --- | 
| Amazon Managed Service for Prometheus | 作用中系列 | 95 （每個 Kafka Pod) | 
|  | 平均收集間隔 | 60 （秒） | 
| Amazon Managed Grafana | 作用中編輯器/管理員的數量 | 1 （或更多，視您的使用者而定） | 

這些數字是 Amazon EKS 上執行 Kafka 之解決方案的基本號碼。這將為您提供基本成本的預估。當您將 Kafka Pod 新增至應用程式時，成本將會增加，如下所示。這些成本會免除網路使用成本，這取決於 Amazon Managed Grafana 工作區、Amazon Managed Service for Prometheus 工作區和 Amazon EKS 叢集是否位於相同的可用區域 AWS 區域和 VPN。

## 先決條件
<a name="solution-kafka-prerequisites"></a>

此解決方案需要您在使用解決方案之前完成以下操作。

1. 您必須擁有或**建立您要監控的 Amazon Elastic Kubernetes Service 叢集**，且叢集必須至少有一個節點。叢集必須設定 API 伺服器端點存取，以包含私有存取 （也可以允許公開存取）。

   [身分驗證模式](https://docs.aws.amazon.com/eks/latest/userguide/grant-k8s-access.html#set-cam)必須包含 API 存取 （可以設定為 `API`或 `API_AND_CONFIG_MAP`)。這可讓解決方案部署使用存取項目。

   應該在叢集中安裝下列項目 （透過主控台建立叢集時預設為 true，但如果您使用 AWS API 或 建立叢集，則必須新增） AWS CLI：Amazon EKS Pod Identity Agent、 AWS CNI、CoreDNS、Kube-proxy 和 Amazon EBS CSI Driver AddOns （解決方案在技術上不需要 Amazon EBS CSI Driver AddOn，但大多數 Kafka 應用程式都需要）。

   *儲存叢集名稱以稍後指定*。這可在 Amazon EKS 主控台的叢集詳細資訊中找到。
**注意**  
如需如何建立 Amazon EKS 叢集的詳細資訊，請參閱 [Amazon EKS 入門](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)。

1. 您必須在 Amazon EKS 叢集的 Java 虛擬機器上執行 Apache Kafka 應用程式。

1. 您必須在 AWS 帳戶 與 **Amazon EKS 叢集相同的 中建立 Amazon Managed Service for Prometheus 工作區**。如需詳細資訊，請參閱《*Amazon Managed Service for Prometheus 使用者指南*》中的[建立工作區](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-create-workspace.html)。

   *儲存 Amazon Managed Service for Prometheus 工作區 ARN 以供稍後指定。*

1. 您必須在 AWS 區域 與 **Amazon EKS 叢集相同的 中，使用 Grafana 第 9 版或更新版本建立 Amazon Managed Grafana 工作區**。如需建立新工作區的詳細資訊，請參閱 [建立 Amazon Managed Grafana 工作區](AMG-create-workspace.md)。

   工作區角色必須具有存取 Amazon Managed Service for Prometheus 和 Amazon CloudWatch APIs許可。最簡單的方法是使用[服務受管許可](AMG-manage-permissions.md)，然後選取 Amazon Managed Service for Prometheus 和 CloudWatch。您也可以手動將 [AmazonPrometheusQueryAccess](https://docs.aws.amazon.com/prometheus/latest/userguide/security-iam-awsmanpol.html#AmazonPrometheusQueryAccess) 和 [AmazonGrafanaCloudWatchAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonGrafanaCloudWatchAccess) 政策新增至工作區 IAM 角色。

   *儲存 Amazon Managed Grafana 工作區 ID 和端點以供稍後指定。*ID 的格式為 `g-123example`。您可以在 Amazon Managed Grafana 主控台中找到 ID 和端點。端點是工作區的 URL，並包含 ID。例如 `https://g-123example.grafana-workspace.<region>.amazonaws.com/`。

**注意**  
雖然不需要嚴格設定解決方案，但您必須在 Amazon Managed Grafana 工作區中設定使用者身分驗證，使用者才能存取建立的儀表板。如需詳細資訊，請參閱[驗證 Amazon Managed Grafana 工作區中的使用者](authentication-in-AMG.md)。

## 使用此解決方案
<a name="solution-kafka-use"></a>

此解決方案會設定 AWS 基礎設施，以支援從在 Amazon EKS 叢集中執行的 Kafka 應用程式報告和監控指標。您可以使用 安裝它[AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html)。

**注意**  
此處的步驟假設您有一個已安裝 AWS CLI、 和 AWS CDK以及 [Node.js ](https://nodejs.org/)和 [NPM](https://docs.npmjs.com/) 的環境。您將使用 `make`和 `brew`來簡化建置和其他常見動作。

**使用此解決方案透過 監控 Amazon EKS 叢集 AWS CDK**

1. 請確定您已完成所有[先決條件](#solution-kafka-prerequisites)步驟。

1. 從 Amazon S3 下載解決方案的所有檔案。檔案位於 `s3://aws-observability-solutions/Kafka_EKS/OSS/CDK/v1.0.0/iac`，您可以使用下列 Amazon S3 命令下載。從命令列環境中的資料夾執行此命令。

   ```
   aws s3 sync s3://aws-observability-solutions/Kafka_EKS/OSS/CDK/v1.0.0/iac/ .
   ```

   您不需要修改這些檔案。

1. 在命令列環境中 （從您下載解決方案檔案的資料夾），執行下列命令。

   設定所需的環境變數。將 *REGION*、*AMG\$1ENDPOINT*、*EKS\$1CLUSTER* 和 *AMP\$1ARN* 取代為您的 AWS 區域、Amazon Managed Grafana 工作區端點 （格式為 `http://g-123example.grafana-workspace.us-east-1.amazonaws.com`)、Amazon EKS 叢集名稱和 Amazon Managed Service for Prometheus 工作區 ARN。

   ```
   export AWS_REGION=REGION
   export AMG_ENDPOINT=AMG_ENDPOINT
   export EKS_CLUSTER_NAME=EKS_CLUSTER
   export AMP_WS_ARN=AMP_ARN
   ```

1. 您必須建立可供部署使用的註釋。您可以選擇直接註釋命名空間、部署、狀態集、協助程式集或 Pod。Kafka 解決方案需要五個註釋。您將使用 `kubectl`以下列命令來註釋資源：

   ```
   kubectl annotate <resource-type> <resource-value> instrumentation.opentelemetry.io/inject-java=true
   kubectl annotate <resource-type> <resource-value> cloudwatch.aws.amazon.com/inject-jmx-jvm=true
   kubectl annotate <resource-type> <resource-value> cloudwatch.aws.amazon.com/inject-jmx-kafka=true
   kubectl annotate <resource-type> <resource-value> cloudwatch.aws.amazon.com/inject-jmx-kafka-producer=true
   kubectl annotate <resource-type> <resource-value> cloudwatch.aws.amazon.com/inject-jmx-kafka-consumer=true
   ```

   將 *<resource-type>* 和 *<resource-value>* 取代為系統的正確值。例如，若要註釋您的`foo`部署，您的第一個命令將是：

   ```
   kubectl annotate deployment foo instrumentation.opentelemetry.io/inject-java=true
   ```

1. 建立具有 ADMIN 存取權的服務帳戶字符，以呼叫 Grafana HTTP APIs。如需詳細資訊，請參閱[使用服務帳戶向 Grafana HTTP APIs進行身分驗證](service-accounts.md)。您可以使用 AWS CLI 搭配下列命令來建立字符。您需要以 Grafana 工作區的 ID 取代 *GRAFANA\$1ID* （格式為 `g-123example`)。此金鑰會在 7，200 秒或 2 小時後過期。如果需要，您可以變更時間 (`seconds-to-live`)。部署時間不到一小時。

   ```
   # creates a new service account (optional: you can use an existing account)
   GRAFANA_SA_ID=$(aws grafana create-workspace-service-account \
     --workspace-id GRAFANA_ID \
     --grafana-role ADMIN \
     --name grafana-operator-key \
     --query 'id' \
     --output text)
   
   # creates a new token for calling APIs
   export AMG_API_KEY=$(aws grafana create-workspace-service-account-token \
     --workspace-id $managed_grafana_workspace_id \
     --name "grafana-operator-key-$(date +%s)" \
     --seconds-to-live 7200 \
     --service-account-id $GRAFANA_SA_ID \
     --query 'serviceAccountToken.key' \
     --output text)
   ```

    AWS Systems Manager 使用下列命令將 API 金鑰 AWS CDK 新增至 ，使其可供 使用。將 *AWS\$1REGION* 取代為您的解決方案將在其中執行的區域 （格式為 `us-east-1`)。

   ```
   aws ssm put-parameter --name "/observability-aws-solution-kafka-eks/grafana-api-key" \
     --type "SecureString" \
     --value $AMG_API_KEY \
     --region AWS_REGION \
     --overwrite
   ```

1. 執行下列`make`命令，這會為專案安裝任何其他相依性。

   ```
   make deps
   ```

1. 最後，執行 AWS CDK 專案：

   ```
   make build && make pattern aws-observability-solution-kafka-eks-$EKS_CLUSTER_NAME deploy
   ```

1. 【選用】 堆疊建立完成後，只要完成每個 （包括單獨的 Amazon Managed Grafana 和 Amazon Managed Service for Prometheus 工作區） 的其他先決條件，您就可以使用相同的環境為在相同區域中的 Amazon EKS 叢集上執行的其他 Kafka 應用程式建立更多堆疊執行個體。您需要使用新參數重新定義`export`命令。

堆疊建立完成後，您的 Amazon Managed Grafana 工作區將填入儀表板，其中顯示應用程式和 Amazon EKS 叢集的指標。收集指標時，需要幾分鐘的時間才會顯示指標。

## 追蹤的指標清單
<a name="solution-kafka-metrics"></a>

此解決方案會從以 JVM 為基礎的 Kafka 應用程式收集指標。這些指標儲存在 Amazon Managed Service for Prometheus 中，然後顯示在 Amazon Managed Grafana 儀表板中。

系統會使用此解決方案追蹤下列指標。
+ jvm.classes.loaded
+ jvm.gc.collections.count
+ jvm.gc.collections.elapsed
+ jvm.memory.heap.init
+ jvm.memory.heap.max
+ jvm.memory.heap.used
+ jvm.memory.heap.committed
+ jvm.memory.nonheap.init
+ jvm.memory.nonheap.max
+ jvm.memory.nonheap.used
+ jvm.memory.nonheap.committed
+ jvm.memory.pool.init
+ jvm.memory.pool.max
+ jvm.memory.pool.used
+ jvm.memory.pool.committed
+ jvm.threads.count
+ kafka.message.count
+ kafka.request.count
+ kafka.request.failed
+ kafka.request.time.total
+ kafka.request.time.50p
+ kafka.request.time.99p
+ kafka.request.time.avg
+ kafka.network.io
+ kafka.purgatory.size
+ kafka.partition.count
+ kafka.partition.offline
+ kafka.partition.under\$1replicated
+ kafka.isr.operation.count
+ kafka.max.lag
+ kafka.controller.active.count
+ kafka.leader.election.rate
+ kafka.unclean.election.rate
+ kafka.request.queue
+ kafka.logs.flush.time.count
+ kafka.logs.flush.time.median
+ kafka.logs.flush.time.99p
+ kafka.consumer.fetch-rate
+ kafka.consumer.records-lag-max
+ kafka.consumer.total.bytes-consumed-rate
+ kafka.consumer.total.fetch-size-avg
+ kafka.consumer.total.records-consumed-rate
+ kafka.consumer.bytes-consumed-rate
+ kafka.consumer.fetch-size-avg
+ kafka.consumer.records-consumed-rate
+ kafka.producer.io-wait-time-ns-avg
+ kafka.producer.outgoing-byte-rate
+ kafka.producer.request-latency-avg
+ kafka.producer.request-rate
+ kafka.producer.response-rate
+ kafka.producer.byte 速率
+ kafka.producer.compression-rate
+ kafka.producer.record-error-rate
+ kafka.producer.record-retry-rate
+ kafka.producer.record-send-rate

## 疑難排解
<a name="solution-kafka-troubleshooting"></a>

有幾件事可能會導致專案設定失敗。請務必檢查下列項目。
+ 您必須先完成所有[先決條件](#solution-kafka-prerequisites)，才能安裝解決方案。
+ 叢集必須至少有一個節點，才能嘗試建立解決方案或存取指標。
+ 您的 Amazon EKS 叢集必須安裝 `AWS CNI`、 `CoreDNS`和 `kube-proxy` 附加元件。如果未安裝，解決方案將無法正常運作。透過主控台建立叢集時，預設會安裝它們。如果叢集是透過 AWS SDK 建立，您可能需要安裝它們。
+ Amazon EKS Pod 安裝逾時。如果節點容量不足，就可能發生這種情況。這些問題有多種原因，包括：
  + Amazon EKS 叢集已使用 Fargate 而非 Amazon EC2 初始化。此專案需要 Amazon EC2。
  + 節點會[受到污點](https://docs.aws.amazon.com/eks/latest/userguide/node-taints-managed-node-groups.html)，因此無法使用。

    您可以使用 `kubectl describe node NODENAME | grep Taints`檢查污點。然後`kubectl taint node NODENAME TAINT_NAME-`移除污點。請務必在污點名稱`-`後面包含 。
  + 節點已達到容量限制。在這種情況下，您可以建立新的節點或增加容量。
+ 您在 Grafana 中看不到任何儀表板：使用不正確的 Grafana 工作區 ID。

  執行下列命令以取得 Grafana 的相關資訊：

  ```
  kubectl describe grafanas external-grafana -n grafana-operator
  ```

  您可以檢查結果是否有正確的工作區 URL。如果不是您預期的工作空間，請使用正確的工作區 ID 重新部署。

  ```
  Spec:
    External:
      API Key:
        Key:   GF_SECURITY_ADMIN_APIKEY
        Name:  grafana-admin-credentials
      URL:     https://g-123example.grafana-workspace.aws-region.amazonaws.com
  Status:
    Admin URL:  https://g-123example.grafana-workspace.aws-region.amazonaws.com
    Dashboards:
      ...
  ```
+ 您在 Grafana 中看不到任何儀表板：您正在使用過期的 API 金鑰。

  若要尋找此案例，您需要取得 grafana 運算子並檢查日誌是否有錯誤。使用此命令取得 Grafana 運算子的名稱：

  ```
  kubectl get pods -n grafana-operator
  ```

  這將傳回運算子名稱，例如：

  ```
  NAME                               READY   STATUS    RESTARTS   AGE
  grafana-operator-1234abcd5678ef90   1/1     Running   0          1h2m
  ```

  在下列命令中使用運算子名稱：

  ```
  kubectl logs grafana-operator-1234abcd5678ef90 -n grafana-operator
  ```

  下列錯誤訊息表示 API 金鑰已過期：

  ```
  ERROR   error reconciling datasource    {"controller": "grafanadatasource", "controllerGroup": "grafana.integreatly.org", "controllerKind": "GrafanaDatasource", "GrafanaDatasource": {"name":"grafanadatasource-sample-amp","namespace":"grafana-operator"}, "namespace": "grafana-operator", "name": "grafanadatasource-sample-amp", "reconcileID": "72cfd60c-a255-44a1-bfbd-88b0cbc4f90c", "datasource": "grafanadatasource-sample-amp", "grafana": "external-grafana", "error": "status: 401, body: {\"message\":\"Expired API key\"}\n"}
  github.com/grafana-operator/grafana-operator/controllers.(*GrafanaDatasourceReconciler).Reconcile
  ```

  在此情況下，請建立新的 API 金鑰並再次部署解決方案。如果問題仍然存在，您可以在重新部署之前使用下列命令強制同步：

  ```
  kubectl delete externalsecret/external-secrets-sm -n grafana-operator
  ```
+ 缺少 SSM 參數。如果您看到類似以下的錯誤，請執行 `cdk bootstrap` ，然後再試一次。

  ```
  Deployment failed: Error: aws-observability-solution-kafka-eks-$EKS_CLUSTER_NAME: SSM 
  parameter /cdk-bootstrap/xxxxxxx/version not found. Has the environment been 
  bootstrapped? Please run 'cdk bootstrap' (see https://docs.aws.amazon.com/cdk/latest/
  guide/bootstrapping.html)
  ```