使用 AWS Controllers for Kubernetes 管理 Amazon Managed Service for Prometheus - Amazon Managed Service for Prometheus

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

使用 AWS Controllers for Kubernetes 管理 Amazon Managed Service for Prometheus

Amazon Managed Service for Prometheus 与 AWS Controllers for Kubernetes(ACK)集成,支持在 Amazon EKS 中管理您的工作区、警报管理器和规则器资源。您可以使用 AWS Controllers for Kubernetes 自定义资源定义(CRD)和原生 Kubernetes 对象,而不必在集群之外定义任何资源。

该部分介绍如何在现有 Amazon EKS 集群中设置 AWS Controllers for Kubernetes 和 Amazon Managed Service for Prometheus。

您还可以阅读博客文章 introducing AWS Controllers for Kubernetesintroducing the ACK controller for Amazon Managed Service for Prometheus

先决条件

在着手将 AWS Controllers for Kubernetes 和 Amazon Managed Service for Prometheus 与您的 Amazon EKS 集群集成之前,您必须具备以下先决条件。

正确配置您的 Amazon EKS 集群后,您应该能够通过调用 kubectl get --raw /metrics 查看针对 Prometheus 格式化的指标。现在,您可以安装 AWS Controllers for Kubernetes 服务控制器,并用来部署 Amazon Managed Service for Prometheus 资源。

使用 AWS Controllers for Kubernetes 部署工作区

要部署 Amazon Managed Service for Prometheus 工作区,您需要安装 AWS Controllers for Kubernetes 控制器,然后使用它来创建工作区。

使用 AWS Controllers for Kubernetes 部署新的 Amazon Managed Service for Prometheus 工作区
  1. 使用以下命令通过 Helm 安装 Amazon Managed Service for Prometheus 服务控制器。有关更多信息,请参阅 GitHub 上 AWS Controllers for Kubernetes 文档中的 Install an ACK Controller。为您的系统使用相应的区域,例如 us-east-1

    export SERVICE=prometheusservice export RELEASE_VERSION=`curl -sL https://api.github.com/repos/aws-controllers-k8s/$SERVICE-controller/releases/latest | grep '"tag_name":' | cut -d'"' -f4` 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 Controllers for Kubernetes 控制器是否已成功安装。

    helm list --namespace $ACK_SYSTEM_NAMESPACE -o yaml

    这将返回有关控制器 ack-prometheusservice-controller 的信息,包括 status: deployed

  2. 使用以下文本创建名为 workspace.yaml 的文件。这将用作您正在创建的工作区的配置。

    apiVersion: prometheusservice.services.k8s.aws/v1alpha1 kind: Workspace metadata: name: my-amp-workspace spec: alias: my-amp-workspace tags: ClusterName: EKS-demo
  3. 运行以下命令来创建您的工作区(此命令取决于您在步骤 1 中设置的系统变量)。

    kubectl apply -f workspace.yaml -n $ACK_SYSTEM_NAMESPACE

    稍等片刻,您应该就能看到在您的账户中有一个名为 my-amp-workspace 的新工作区。

    运行以下命令查看您工作区的详细信息和状态,包括工作区 ID。或者,您可以在 Amazon Managed Service for Prometheus 控制台中查看新的工作区。

    kubectl describe workspace my-amp-workspace -n $ACK_SYSTEM_NAMESPACE
    注意

    您也可以使用现有工作区,而不是创建新的工作区。

  4. 创建两个新的 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 主题必须具有权限

    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 }}
    注意

    要了解有关这些配置文件格式的更多信息,请参阅 RuleGroupsNamespaceDataAlertManagerDefinitionData

  5. 运行以下命令来创建您的规则组和警报管理器配置(此命令取决于您在步骤 1 中设置的系统变量)。

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

    稍等片刻,这些更改将会变得可用。

    注意

    要更新资源,而不是创建资源,只需更新 yaml 文件,然后再次运行 kubectl apply 命令即可。

    要删除资源,请运行以下命令。将 ResourceType 替换为要删除 WorkspaceAlertManagerDefinitionRuleGroupNamespace 的资源的类型。将 ResourceName 替换为要删除的资源的名称。

    kubectl delete ResourceType ResourceName -n $ACK_SYSTEM_NAMESPACE

至此,新工作区的部署就完成了。下一部分将介绍如何配置您的集群以向该工作区发送指标。

配置您的 Amazon EKS 集群以写入 Amazon Managed Service for Prometheus 工作区

本部分介绍如何使用 Helm 配置在您的 Amazon EKS 集群中运行的 Prometheus,以便将指标远程写入您在上一部分中创建的 Amazon Managed Service for Prometheus 工作区。

在此过程中,您将需要自己创建的用于摄取指标的 IAM 角色的名称。如果尚未执行此操作,请参阅设置服务角色从 Amazon EKS 集群中摄取指标以获取更多信息和说明。如果您按照这些说明进行操作,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 以供后续步骤使用。

  2. 创建一个包含以下文本的新文件,并将其命名为 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
  3. 使用以下 Helm 命令查找 Prometheus 图表和命名空间名称以及图表版本。

    helm ls --all-namespaces

    根据到目前为止的步骤,Prometheus 图表和命名空间都应该名为 prometheus,图表版本可能为 15.2.0

  4. 使用上一步中找到的 PrometheusChartNamePrometheusNamespacePrometheusChartVersion 运行以下命令。

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

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

  5. (可选)通过 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 集群与其连接。这些文件称为自定义资源定义(CRD),位于您的 Amazon EKS 集群中。您可以使用 AWS Controllers for Kubernetes 控制器直接从集群管理所有 Amazon Managed Service for Prometheus 资源。