

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用适用于 Kubernetes 的控制器管理适用于 Promethe AWS us 的亚马逊托管服务
<a name="integrating-ack"></a>

Amazon Managed Service for Prometheus 与 [AWS Controllers for Kubernetes（ACK）](https://aws-controllers-k8s.github.io/community/docs/community/overview/)集成，支持在 Amazon EKS 中管理您的工作区、警报管理器和规则器资源。你可以使用 Kubernetes 的 AWS 控制器自定义资源定义 (CRDs) 和原生 Kubernetes 对象，而不必在集群之外定义任何资源。

本节介绍如何在现有亚马逊 EKS 集群中为 Kubernetes 设置 AWS 控制器和针对 Prometheus 的亚马逊托管服务。

您还可以阅读介绍[适用于 Kubernetes 的 AWS 控制器和介绍适用于 Promethe](https://aws.amazon.com/blogs/containers/aws-controllers-for-kubernetes-ack/) us [的亚马逊托管服务的 ACK 控制器的](https://aws.amazon.com/blogs/mt/introducing-the-ack-controller-for-amazon-managed-service-for-prometheus/)博客文章。

## 先决条件
<a name="ack-prereqs"></a>

在开始将适用于 Kubernet AWS es 的控制器和适用于 Prometheus 的亚马逊托管服务与您的 Amazon EKS 集群集成之前，您必须具备以下先决条件。
+ 您必须拥有[现有角色 AWS 账户 和权限](AMP-setting-up.md)，才能以编程方式创建适用于 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 功能。
+ 必须安装 Kubernetes 的软件包管理器 [Helm](https://docs.aws.amazon.com/eks/latest/userguide/helm.html)。
+ 必须在 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 控制器安装控制器，并使用它为 Prometheus 资源部署亚马逊托管服务。

## 使用适用于 Kubernetes 的 AWS 控制器部署工作空间
<a name="ack-deploy-workspace"></a>

要部署适用于 Prometheus 的新亚马逊托管服务工作空间，您需要 AWS 为 Kubernetes 控制器安装控制器，然后使用它来创建工作空间。

**部署适用于 Prometheus 的全新 Amazon 托管服务工作空间，其中包含适用于 Kubernetes 的控制器 AWS**

1. 使用以下命令通过 Helm 安装 Amazon Managed Service for Prometheus 服务控制器。有关更多信息，请参阅在 Kubernetes [控制器 AWS 文档中安装 ACK](https://aws-controllers-k8s.github.io/community/docs/user-docs/install/) 控制器。 GitHub使用{{region}}适合您系统的正确值，例如`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"
   ```

   您可以选择使用以下 AWS 命令验证 Kubernetes 控制器的控制器是否已成功安装。

   ```
   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 文件作为规则组的配置，接下来您将使用以下配置创建 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 集群进行远程写入**

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`。{{account}}用您的账户 ID、{{workspaceURL/}}您刚刚找到的 URL 以及{{region}} 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. 使用上一步中{{PrometheusChartVersion}}找到的{{PrometheusChartName}}{{PrometheusNamespace}}、和，运行以下命令。

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

   几分钟后，您将看到一条消息，提示升级成功。

1. （可选）通过 `awscurl` 查询 Amazon Managed Service for Prometheus 终端节点，以此验证指标是否成功发送。{{Region}}替换为您 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 集群与其连接。这些文件称为自定义资源定义 (CRDs)，位于您的 Amazon EKS 集群中。您可以使用适用于 Kubernetes 的 AWS 控制器直接从集群管理所有适用于 Prometheus 的亚马逊托管服务资源。