

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

# 使用 Kubernetes 的 AWS 控制器管理 Amazon Managed Service for Prometheus
<a name="integrating-ack"></a>

Amazon Managed Service for Prometheus 與 [Kubernetes 專用AWS 控制器 (ACK)](https://aws-controllers-k8s.github.io/community/docs/community/overview/) 整合，並支援管理您在 Amazon EKS 中的工作區、警示管理員和尺規資源。您可以使用 AWS Controllers for Kubernetes 自訂資源定義 (CRDs) 和原生 Kubernetes 物件，而無需定義叢集外的任何資源。

本節說明如何在現有的 Amazon EKS 叢集中設定 Kubernetes 和 Amazon Managed Service for Prometheus 的 AWS 控制器。

您也可以閱讀[介紹 Kubernetes AWS 控制器](https://aws.amazon.com/blogs/containers/aws-controllers-for-kubernetes-ack/)和[介紹 Amazon Managed Service for Prometheus ACK 控制器的](https://aws.amazon.com/blogs/mt/introducing-the-ack-controller-for-amazon-managed-service-for-prometheus/)部落格文章。

## 先決條件
<a name="ack-prereqs"></a>

開始將 Kubernetes 和 Amazon Managed Service for Prometheus 的 AWS 控制器與您的 Amazon EKS 叢集整合之前，您必須具備下列先決條件。
+ 您必須擁有[現有 AWS 帳戶 和 許可](AMP-setting-up.md)，才能以程式設計方式建立 Amazon Managed Service for Prometheus 和 IAM 角色。
+ 您必須擁有已啟用 OpenID Connect (OIDC) 的現有 [Amazon EKS 叢集](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-console.html)。

  若您未啟用 OIDC，您可以使用下列命令來啟用。請記得將 {{YOUR\_CLUSTER\_NAME}} 和 {{AWS\_REGION}} 替換為帳戶的正確值。

  ```
  eksctl utils associate-iam-oidc-provider \
      --cluster ${{{YOUR_CLUSTER_NAME}}} --region ${{{AWS_REGION}}} \
      --approve
  ```

  如需有關將 OIDC 與 Amazon EKS 搭配使用的詳細資訊，請參閱 *Amazon EKS 使用者指南*中的 [OIDC 身分識別提供者身分驗證](https://docs.aws.amazon.com/eks/latest/userguide/authenticate-oidc-identity-provider.html)和[建立 IAM OIDC 提供者](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)。
+ 您必須在 Amazon EKS 叢集中安裝 [Amazon EBS CSI 驅動程式](https://docs.aws.amazon.com/eks/latest/userguide/ebs-csi.html)。
+ 您必須已安裝 [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。 AWS CLI 用於從命令列呼叫 AWS 功能。
+ 必須安裝 [Helm](https://docs.aws.amazon.com/eks/latest/userguide/helm.html)，Kubernetes 的套件管理員。
+ 必須在您的 Amazon EKS 叢集中設定[使用 Prometheus 的控制平面指標](https://docs.aws.amazon.com/eks/latest/userguide/prometheus.html)。
+ 您必須擁有 [Amazon Simple Notification Service (Amazon SNS)](https://docs.aws.amazon.com/sns/) 主題，且希望藉此從新工作區傳送警示。請確認您已[授予 Amazon Managed Service for Prometheus 權限，以將訊息傳送到該主題](AMP-alertmanager-receiver-AMPpermission.md)。

當您適當設定的 Amazon EKS 叢集時，您應該可以透過呼叫 `kubectl get --raw /metrics` 查看為 Prometheus 格式化的指標。現在您已準備好安裝適用於 Kubernetes 的 AWS 控制器服務控制器，並使用它來部署 Amazon Managed Service for Prometheus 資源。

## 使用適用於 Kubernetes 的 AWS 控制器部署工作區
<a name="ack-deploy-workspace"></a>

若要部署新的 Amazon Managed Service for Prometheus 工作區，您將安裝 Kubernetes AWS 控制器的 控制器，然後使用它來建立工作區。

**使用 Kubernetes 的 AWS 控制器部署新的 Amazon Managed Service for Prometheus 工作區**

1. 使用下列命令來使用 Helm 安裝 Amazon Managed Service for Prometheus 服務控制器。如需詳細資訊，請參閱 GitHub [GitHub 上的 Controllers for Kubernetes 文件中的安裝 ACK](https://aws-controllers-k8s.github.io/community/docs/user-docs/install/) AWS 控制器。為您的系統使用正確的{{區域}}，例如 `us-east-1`。

   ```
   export SERVICE=prometheusservice
   export RELEASE_VERSION=`curl -sL https://api.github.com/repos/aws-controllers-k8s/$SERVICE-controller/releases/latest | jq -r '.tag_name | ltrimstr("v")'`
   export ACK_SYSTEM_NAMESPACE=ack-system
   export AWS_REGION={{region}}
   
   aws ecr-public get-login-password --region us-east-1 | helm registry login --username AWS --password-stdin public.ecr.aws
   helm install --create-namespace -n $ACK_SYSTEM_NAMESPACE ack-$SERVICE-controller \
     oci://public.ecr.aws/aws-controllers-k8s/$SERVICE-chart --version=$RELEASE_VERSION --set=aws.region=$AWS_REGION
   ```

   幾分鐘後，您應該會看到類似於以下內容的回應，表示成功。

   ```
   You are now able to create Amazon Managed Service for Prometheus (AMP) resources!
   The controller is running in "cluster" mode.
   The controller is configured to manage AWS resources in region: "us-east-1"
   ```

   您可以選擇使用以下命令來驗證 Kubernetes 控制器的 AWS 控制器是否已成功安裝。

   ```
   helm list --namespace $ACK_SYSTEM_NAMESPACE -o yaml
   ```

   這將傳回與控制器 `ack-prometheusservice-controller` 有關的資訊，包含 `status: deployed`。

1. 使用下列內文建立稱為 `workspace.yaml` 的檔案。這將作為您正在建立的工作區組態使用。

   ```
   apiVersion: prometheusservice.services.k8s.aws/v1alpha1
   kind: Workspace
   metadata:
     name: my-amp-workspace
   spec:
     alias: my-amp-workspace
     tags:
       ClusterName: EKS-demo
   ```

1. 執行下列命令以建立工作區 (此命令取決於您在步驟 1 中設定的系統變數)。

   ```
   kubectl apply -f workspace.yaml -n $ACK_SYSTEM_NAMESPACE
   ```

   在幾分鐘之內，您應該能夠看到一個新的工作區，在您的帳戶中稱為 `my-amp-workspace`。

   執行下列命令以檢視工作區的詳細資訊和狀態，包含*工作區 ID*。或者，您也可以在 [Amazon Managed Service for Prometheus 主控台](https://console.aws.amazon.com/prometheus)中檢視新的工作區。

   ```
   kubectl describe workspace my-amp-workspace -n $ACK_SYSTEM_NAMESPACE
   ```
**注意**  
您也可以[使用現有工作區](https://aws-controllers-k8s.github.io/community/docs/user-docs/adopted-resource/)，而不建立新工作區。

1. 建立兩個新的 yaml 檔案做為 Rulegroups 和 AlertManager 的組態，您接下來要使用下列組態建立。

   將此組態另存為 `rulegroup.yaml`。將 {{WORKSPACE-ID}} 替換為上一個步驟的工作區 ID。

   ```
   apiVersion: prometheusservice.services.k8s.aws/v1alpha1
   kind: RuleGroupsNamespace
   metadata:
     name: default-rule
   spec:
     workspaceID: {{WORKSPACE-ID}}
     name: default-rule
     configuration: |
       groups:
       - name: example
         rules:
         - alert: HostHighCpuLoad
           expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > 60
           for: 5m
           labels:
             severity: warning
             event_type: scale_up
           annotations:
             summary: Host high CPU load (instance {{ $labels.instance }})
             description: "CPU load is > 60%\n  VALUE = {{ $value }}\n  LABELS = {{ $labels }}"
         - alert: HostLowCpuLoad
           expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) < 30
           for: 5m
           labels:
             severity: warning
             event_type: scale_down
           annotations:
             summary: Host low CPU load (instance {{ $labels.instance }})
             description: "CPU load is < 30%\n  VALUE = {{ $value }}\n  LABELS = {{ $labels }}"
   ```

   將以下組態另存為 `alertmanager.yaml`。將 {{WORKSPACE-ID}} 替換為上一個步驟的工作區 ID。將 {{TOPIC-ARN}} 取代為要傳送通知之 Amazon SNS 主題的 ARN，並將 {{REGION}} 取代為您 AWS 區域 正在使用的 。請記住，Amazon Managed Service for Prometheus [必須有 Amazon SNS 主題的許可](AMP-alertmanager-receiver-AMPpermission.md)。

   ```
   apiVersion: prometheusservice.services.k8s.aws/v1alpha1
   kind: AlertManagerDefinition
   metadata:
     name: alert-manager
   spec:
     workspaceID: {{WORKSPACE-ID}}
     configuration: |
       alertmanager_config: |
         route:
            receiver: default_receiver
         receivers:
           - name: default_receiver
             sns_configs:
             - topic_arn: {{TOPIC-ARN}}
               sigv4:
                 region: {{REGION}}
               message: |
                 alert_type: {{ .CommonLabels.alertname }}
                 event_type: {{ .CommonLabels.event_type }}
   ```
**注意**  
若要進一步了解這些組態檔案的格式，請參閱 [RuleGroupsNamespaceData](https://docs.aws.amazon.com/prometheus/latest/APIReference/yaml-RuleGroupsNamespaceData.html) 和 [AlertManagerDefinitionData](https://docs.aws.amazon.com/prometheus/latest/APIReference/yaml-AlertManagerDefinitionData.html)。

1. 執行下列命令以建立規則群組和警示管理員組態 (此命令取決於您在步驟 1 中設定的系統變數)。

   ```
   kubectl apply -f rulegroup.yaml -n $ACK_SYSTEM_NAMESPACE
   kubectl apply -f alertmanager.yaml -n $ACK_SYSTEM_NAMESPACE
   ```

   幾分鐘內將可進行這些變更。
**注意**  
若要更新資源，而不是建立資源，只要更新 yaml 檔案，然後再次執行 `kubectl apply` 命令即可。  
若要刪除資源，請執行下列命令。將 {{ResourceType}} 替換為您要刪除 `Workspace`、`AlertManagerDefinition` 或 `RuleGroupNamespace` 的資源類型。將 {{ResourceName}} 替換為要刪除的資源名稱。  

   ```
   kubectl delete {{ResourceType}} {{ResourceName}} -n $ACK_SYSTEM_NAMESPACE
   ```

這樣會完成新工作區的部署。下一節說明組態叢集以傳送指標至該工作區。

## 組態 Amazon EKS 叢集以寫入 Amazon Managed Service for Prometheus 工作區
<a name="ack-configure-workspace"></a>

本節說明如何使用 Helm 將 Amazon EKS 叢集中執行的 Prometheus 組態為遠端將指標寫入您在上一節建立的 Amazon Managed Service for Prometheus 工作區。

在此程序中，您將需要已建立的 IAM 角色名稱以用於擷取指標。如果您尚未這麼做，請參閱 [自 Amazon EKS 叢集設定指標擷取作業的服務角色](set-up-irsa.md#set-up-irsa-ingest) 以取得詳細資訊和指示。如果您遵循這些指示，將會呼叫 IAM 角色 `amp-iamproxy-ingest-role`。

**為 Amazon EKS 叢集設定 Amazon EKS 組態遠端寫入**

1. 使用下列命令來取得工作區的 `prometheusEndpoint`。將 {{WORKSPACE-ID}} 替換為上一節的工作區 ID。

   ```
   aws amp describe-workspace --workspace-id {{WORKSPACE-ID}}
   ```

   prometheusEndpoint 將在傳回結果中，並依照下列方式格式化：

   ```
   https://aps-workspaces.us-west-2.amazonaws.com/workspaces/ws-a1b2c3d4-a123-b456-c789-ac1234567890/
   ```

   儲存此 URL，以便用於接下來的幾個步驟。

1. 使用下列內文建立新檔案，並將其稱為 `prometheus-config.yaml`。將{{帳戶}}替換為您的帳戶 ID、將 {{workspaceURL/}} 替換為您剛才找到的 URL，以及將{{區域}}替換為您系統適用的 AWS 區域 。

   ```
   serviceAccounts:
           server:
               name: "amp-iamproxy-ingest-service-account"
               annotations:
                   eks.amazonaws.com/role-arn: "arn:aws:iam::{{account}}:role/amp-iamproxy-ingest-role"
   server:
       remoteWrite:
           - url: {{workspaceURL/}}api/v1/remote_write
             sigv4:
               region: {{region}}
             queue_config:
               max_samples_per_send: 1000
               max_shards: 200
               capacity: 2500
   ```

1. 使用下面的 Helm 命令，尋找 Prometheus 圖表和命名空間名稱以及的圖表版本。

   ```
   helm ls --all-namespaces
   ```

   根據到目前為止的步驟，Prometheus 圖表和命名空間都應該命名為 `prometheus`，並且圖表版本可能是 `15.2.0`

1. 使用上一步中找到的 {{PrometheusChartName}}、{{PrometheusNamespace}} 和 {{PrometheusChartVersion}}，執行下列命令。

   ```
   helm upgrade {{PrometheusChartName}} prometheus-community/prometheus -n {{PrometheusNamespace}} -f prometheus-config.yaml --version {{PrometheusChartVersion}}
   ```

   幾分鐘後，您會看到升級成功的訊息。

1. 或者，透過 `awscurl` 查詢 Amazon Managed Service for Prometheus 端點，驗證是否成功傳送指標。將{{區域}}取代為您正在使用 AWS 區域 的 ，並將 {{workspaceURL/}} 取代為您在步驟 1 中找到的 URL。

   ```
   awscurl --service="aps" --region="{{Region}}" "{{workspaceURL/}}api/v1/query?query=node_cpu_seconds_total"
   ```

您現在已經建立 Amazon Managed Service for Prometheus 工作區，並使用 YAML 檔案作為組態，從 Amazon EKS 叢集連線到該工作區。這些檔案，稱為自訂資源定義 (CRD)，在 Amazon EKS 叢集內運作中。您可以使用 Kubernetes AWS 控制器，直接從叢集管理所有 Amazon Managed Service for Prometheus 資源。