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 をセットアップする方法について説明します。

AWS Controllers for Kubernetesや、Amazon Managed Service for Prometheus 向けの ACK コントローラーに関するブログ記事も投稿されています。

前提条件

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」を参照してください。region には、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. この後で作成する Rulegroups と AlertManager の設定として、2 つの新しい yaml ファイルを以下に示す内容で作成します。

    次の設定を 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 }}
    注記

    これらの設定ファイルの形式の詳細については、「RuleGroupsNamespaceData」および「AlertManagerDefinitionData」を参照してください。

  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 Managed Service for Prometheus ワークスペースに書き込むための Amazon EKS クラスターの構成

このセクションでは、Helm を使用して、Amazon EKS クラスターで実行されている Prometheus を構成し、前のセクションで作成した Amazon Managed Service for Prometheus ワークスペースへのメトリクスのリモートで書き込みを行う方法について説明します。

この手順では、メトリクスの取り込みに使用するために作成した IAM ロールの名前が必要です。まだ作成していない場合は、「Amazon EKS クラスターからメトリクスを取り込むためのサービスロールの設定」を参照して、詳細と手順を確認してください。これらの手順に従うと、amp-iamproxy-ingest-role という IAM ロールが作成されます。

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"

これで、YAML ファイルを設定として使用して、Amazon Managed Service for Prometheus ワークスペースを作成し、そのワークスペースに Amazon EKS クラスターから接続することができました。これらのファイルはカスタムリソース定義 (CRD) と呼ばれ、Amazon EKS クラスター内に配置されます。AWS Controllers for Kubernetes を使用すると、Amazon Managed Service for Prometheus のすべてのリソースをクラスターから直接管理できます。