

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Flink Kubernetes オペレータと Flink ジョブのモニタリング
<a name="jobruns-flink-monitoring"></a>

このセクションでは、Amazon EMR on EKS で Flink ジョブをモニタリングする方法をいくつか紹介します。これには、Flink と Amazon Managed Service for Prometheus の統合、ジョブのステータスとメトリクスを提供する *Flink Web Dashboard* の使用、Amazon S3 と Amazon CloudWatchにログデータを送信するためのモニタリング設定の使用が含まれます。

**Topics**
+ [Amazon Managed Service for Prometheus を使用した Flink ジョブのモニタリング](jobruns-flink-monitoring-prometheus.md)
+ [Flink UI を使用した Flink ジョブのモニタリング](jobruns-flink-monitoring-ui.md)
+ [モニタリング設定を使用した、Flink Kubernetes オペレータと Flink ジョブのモニタリング](jobruns-flink-monitoring-configuration.md)

# Amazon Managed Service for Prometheus を使用した Flink ジョブのモニタリング
<a name="jobruns-flink-monitoring-prometheus"></a>

Apache Flink を Amazon Managed Service for Prometheus (管理ポータル) とインテグレーションできます。Amazon Managed Service for Prometheus では、Amazon Managed Service for Prometheus サーバーからメトリクスを Amazon EKS で実行されているクラスターに取り込むことができます。Amazon Managed Service for Prometheus は、Amazon EKS クラスターで既に実行されている Prometheus サーバーと連携して動作します。Amazon Managed Service for Prometheus と Amazon EMR Flink オペレータとのインテグレーションを実行すると、Prometheus サーバーが自動的にデプロイされ、Amazon Managed Service for Prometheus とインテグレーションするように設定されます。

1. [Amazon Managed Service for Prometheus ワークスペースを作成します](https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-onboard-create-workspace.html)。このワークスペースは、取り込みエンドポイントとして機能します。後でそのリモート書き込み URL が必要になります。

1. サービスアカウントの IAM ロールをセットアップします。

   このオンボーディング方法では、Prometheus サーバーが稼働している Amazon EKS クラスターのサービスアカウントの IAM ロールを使用します。こうしたロールは、サービスロールとも呼ばれます。

   まだサービスロールがない場合は、[Amazon EKS クラスターからメトリクスを取り込めるようにサービスロールをセットアップします](https://docs.aws.amazon.com/prometheus/latest/userguide/set-up-irsa.html)。

   続行する前に、IAM ロールを `amp-iamproxy-ingest-role` という名前で作成します。

1. Amazon EMR Flink オペレータを Amazon Managed Service for Prometheus と共にインストールします。

Amazon Managed Service for Prometheus ワークスペース、Amazon Managed Service for Prometheus 専用の IAM ロール、および必要な権限が用意できたので、Amazon EMR Flink オペレータをインストールできます。

`enable-amp.yaml` ファイルを作成します。このファイルを使用すると、カスタム設定で Amazon Managed Service for Prometheus の設定を上書きできます。必ず独自のロールを使用してください。

```
kube-prometheus-stack:
    prometheus:
    serviceAccount:
        create: true
        name: "amp-iamproxy-ingest-service-account"
        annotations:
            eks.amazonaws.com/role-arn: "arn:aws:iam::<AWS_ACCOUNT_ID>:role/amp-iamproxy-ingest-role"
    remoteWrite:
        - url: <AMAZON_MANAGED_PROMETHEUS_REMOTE_WRITE_URL>
        sigv4:
            region: <AWS_REGION>
        queueConfig:
            maxSamplesPerSend: 1000
            maxShards: 200
            capacity: 2500
```

[https://helm.sh/docs/helm/helm_install/](https://helm.sh/docs/helm/helm_install/) コマンドを使用して、`flink-kubernetes-operator` チャートにオーバーライドを渡します。

```
helm upgrade -n <namespace> flink-kubernetes-operator \
   oci://public.ecr.aws/emr-on-eks/flink-kubernetes-operator \
   --set prometheus.enabled=true
   -f enable-amp.yaml
```

このコマンドにより、オペレータ内の Prometheus レポーターがポート 9999 に自動的にインストールされます。また、以後 `FlinkDeployment` を指定すると、`metrics` ポートが 9249 に公開されます。
+ Flink オペレータメトリクスは、Prometheus のラベル `flink_k8soperator_` の下に表示されます。
+ Flink タスクマネージャーメトリクスは、Prometheus のラベル `flink_taskmanager_` の下に表示されます。
+ Flink ジョブマネージャーメトリクスは、Prometheus のラベル `flink_jobmanager_` の下に表示されます。

# Flink UI を使用した Flink ジョブのモニタリング
<a name="jobruns-flink-monitoring-ui"></a>

実行中の Flink アプリケーションの正常性とパフォーマンスをモニタリングするには、*Flink Web Dashboard* を使用します。ジョブのステータス、TaskManagers の数、ジョブのメトリクスとログといった情報を確認できます。また、Flink ジョブの設定を表示して変更できるほか、Flink クラスターとやり取りしてジョブの送信やキャンセルができます。

Kubernetes で実行中の Flink アプリケーションの Flink Web Dashboard にアクセスするには

1. `kubectl port-forward` コマンドを使用して、Flink アプリケーションの TaskManager ポッドで Flink Web Dashboard が実行されているポートにローカルポートを転送します。デフォルトでは、このポートは 8081 です。*deployment-name* を上記の Flink アプリケーションデプロイの名前に置き換えます。

   ```
   kubectl get deployments -n namespace
   ```

   出力例:

   ```
   kubectl get deployments -n flink-namespace
   NAME                        READY   UP-TO-DATE   AVAILABLE  AGE
   basic-example               1/1       1            1           11m
   flink-kubernetes-operator   1/1       1            1           21h
   ```

   ```
   kubectl port-forward deployments/deployment-name 8081 -n namespace
   ```

1. 別のポートをローカルに使用する場合は、*local-port*:8081 パラメータを使用します。

   ```
   kubectl port-forward -n flink deployments/basic-example 8080:8081
   ```

1. ウェブブラウザで、`http://localhost:8081` (カスタムローカルポートを使用した場合は `http://localhost:local-port`) に移動して、Flink Web Dashboard にアクセスします。ジョブのステータス、TaskManagers の数、ジョブのメトリクスとログといった実行中の Flink アプリケーションの情報を確認できます。  
![\[Flink Dashboard の UI の例\]](http://docs.aws.amazon.com/ja_jp/emr/latest/EMR-on-EKS-DevelopmentGuide/images/sample-flink-dashboard-ui.png)

# モニタリング設定を使用した、Flink Kubernetes オペレータと Flink ジョブのモニタリング
<a name="jobruns-flink-monitoring-configuration"></a>

モニタリング設定を使用すると、Flink アプリケーションログとオペレータログを S3 や CloudWatch (どちらか一方または両方を選択可能) にアーカイブするように簡単にセットアップできます。このようにすると、FluentD サイドカーが JobManager ポッドと TaskManager ポッドに追加され、その後、設定しておいたシンクにこれらのコンポーネントのログが転送されます。

**注記**  
この機能は他の AWS のサービスとやり取りする必要があるため、この機能を使用できるようにするには、Flink オペレータと Flink ジョブ (サービスアカウント) のサービスアカウントに IAM ロールをセットアップする必要があります。このセットアップを行うには、「[Amazon EMR on EKS での Flink Kubernetes オペレータのセットアップ](jobruns-flink-kubernetes-operator-setup.md)」で IRSA を使用必要があります。

## Flink アプリケーションログ
<a name="jobruns-flink-monitoring-configuration-application-logs"></a>

この設定は、次の方法で定義できます。

```
apiVersion: flink.apache.org/v1beta1
kind: FlinkDeployment
metadata:
  name: basic-example
spec:
  image: FLINK IMAGE TAG
  imagePullPolicy: Always
  flinkVersion: v1_17
  flinkConfiguration:
    taskmanager.numberOfTaskSlots: "2"
  executionRoleArn: JOB EXECUTION ROLE
  jobManager:
    resource:
      memory: "2048m"
      cpu: 1
  taskManager:
    resource:
      memory: "2048m"
      cpu: 1
  job:
    jarURI: local:///opt/flink/examples/streaming/StateMachineExample.jar
  monitoringConfiguration:
    s3MonitoringConfiguration:
      logUri: S3 BUCKET
    cloudWatchMonitoringConfiguration:
      logGroupName: LOG GROUP NAME
      logStreamNamePrefix: LOG GROUP STREAM PREFIX
    sideCarResources:
      limits:
        cpuLimit: 500m
        memoryLimit: 250Mi
    containerLogRotationConfiguration:
        rotationSize: 2GB
        maxFilesToKeep: 10
```

次に、設定オプションを示します。
+ `s3MonitoringConfiguration` — S3 への転送をセットアップするための設定キー
  + `logUri` (必須) – ログの保存先への S3 バケットパス。
  + ログがアップロードされると、S3 上のパスは次のようになります。
    + ログローテーションは有効になっていません。

      ```
      s3://${logUri}/${POD NAME}/STDOUT or STDERR.gz
      ```
    + ログローテーションは有効になっています。ローテーションするファイルと現在のファイル (日付スタンプがないファイル) の両方を使用できます。

      ```
      s3://${logUri}/${POD NAME}/STDOUT or STDERR.gz
      ```

      次の形式にすると、数値が増分されます。

      ```
      s3://${logUri}/${POD NAME}/stdout_YYYYMMDD_index.gz
      ```
  + このフォワーダーを使用するには、次の IAM 権限が必要です。

    ```
    {
        "Effect": "Allow",
        "Action": [
            "s3:PutObject"
        ],
        "Resource": [
           "S3_BUCKET_URI/*",
           "S3_BUCKET_URI"
        ]
    }
    ```
+ `cloudWatchMonitoringConfiguration` — CloudWatch への転送をセットアップするための設定キー。
  + `logGroupName` (必須) – ログの送信先となる CloudWatch ロググループの名前 (ロググループが存在しない場合は自動的に作成されます)。
  + `logStreamNamePrefix` (オプション) – ログの送信先となるログストリームの名前。デフォルト値は空の文字列です。形式は次のとおりです。

    ```
    ${logStreamNamePrefix}/${POD NAME}/STDOUT or STDERR
    ```
  + このフォワーダーを使用するには、次の IAM 権限が必要です。

    ```
    {
        "Effect": "Allow",
        "Action": [
            "logs:CreateLogStream",
            "logs:CreateLogGroup",
            "logs:PutLogEvents"
        ],
        "Resource": [
            "arn:aws:logs:REGION:ACCOUNT-ID:log-group:{YOUR_LOG_GROUP_NAME}:*",
            "arn:aws:logs:REGION:ACCOUNT-ID:log-group:{YOUR_LOG_GROUP_NAME}"
        ]
    }
    ```
+ `sideCarResources` (オプション) – 起動した Fluentbit サイドカーコンテナにリソース制限を設定するための設定キー。
  + `memoryLimit` (オプション) - デフォルト値は 512Mi です。必要に応じて調整してください。
  + `cpuLimit` (オプション) — このオプションにはデフォルトはありません。必要に応じて調整してください。
+ `containerLogRotationConfiguration` (オプション) – コンテナログローテーションの動作を制御します。このエージェントは、デフォルトでは有効になっています。
  + `rotationSize` (必須) - ログローテーションのファイルサイズを指定します。指定できる値の範囲は 2 KB～2 GB です。rotationSize パラメータの数値単位部分は整数として渡されます。小数値はサポートされていないため、値 1500 MB などに 1.5 GB のローテーションサイズを指定できます。デフォルトは 2 GB です。
  + `maxFilesToKeep` (必須) — ローテーションが行われた後にコンテナに保持するファイルの最大数を指定します。最小値は 1 で、最大値は 50 です。デフォルトは 10 です。

## Flink オペレータログ
<a name="jobruns-flink-monitoring-configuration-operator-logs"></a>

また、オペレータのログアーカイブを有効にすることもできます。そのためには、Helm チャートのインストール先にある `values.yaml` ファイルで次のオプションを使用します。S3 と CloudWatch のいずれか、またはその両方を有効にできます。

```
monitoringConfiguration: 
  s3MonitoringConfiguration:
    logUri: "S3-BUCKET"
    totalFileSize: "1G"
    uploadTimeout: "1m"
  cloudWatchMonitoringConfiguration:
    logGroupName: "flink-log-group"
    logStreamNamePrefix: "example-job-prefix-test-2"
  sideCarResources:
    limits:
      cpuLimit: 1
      memoryLimit: 800Mi
  memoryBufferLimit: 700M
```

次に、`monitoringConfiguration` で使用できる設定オプションを示します。
+ `s3MonitoringConfiguration` — S3 にアーカイブするようにこのオプションを設定します。
+ `logUri` (必須) – ログの保存先への S3 バケットパス。
+ ログがアップロードされると、S3 バケットパスは次のような形式になります。
  + ログローテーションは有効になっていません。

    ```
    s3://${logUri}/${POD NAME}/OPERATOR or WEBHOOK/STDOUT or STDERR.gz
    ```
  + ログローテーションは有効になっています。ローテーションするファイルと現在のファイル (日付スタンプがないファイル) の両方を使用できます。

    ```
    s3://${logUri}/${POD NAME}/OPERATOR or WEBHOOK/STDOUT or STDERR.gz
    ```

    次の形式のインデックスにすると、数値が増分されます。

    ```
    s3://${logUri}/${POD NAME}/OPERATOR or WEBHOOK/stdout_YYYYMMDD_index.gz
    ```
+ `cloudWatchMonitoringConfiguration` — CloudWatch への転送をセットアップするための設定キー。
  + `logGroupName` (必須) - ログの送信となる CloudWatch ロググループの名前。このグループが存在しない場合は自動的に作成されます。
  + `logStreamNamePrefix` (オプション) – ログの送信先となるログストリームの名前。デフォルト値は空の文字列です。CloudWatch の形式は次のとおりです。

    ```
    ${logStreamNamePrefix}/${POD NAME}/STDOUT or STDERR
    ```
+ `sideCarResources` (オプション) – 起動した Fluentbit サイドカーコンテナにリソース制限を設定するための設定キー。
  + `memoryLimit` (オプション) — メモリの上限。必要に応じて調整してください。デフォルトは 512Mi です。
  + `cpuLimit` — CPU の制限。必要に応じて調整してください。デフォルト値はありません。
+ `containerLogRotationConfiguration` (オプション) – コンテナログローテーションの動作を制御します。このエージェントは、デフォルトでは有効になっています。
  + `rotationSize` (必須) - ログローテーションのファイルサイズを指定します。指定できる値の範囲は 2 KB～2 GB です。rotationSize パラメータの数値単位部分は整数として渡されます。小数値はサポートされていないため、値 1500 MB などに 1.5 GB のローテーションサイズを指定できます。デフォルトは 2 GB です。
  + `maxFilesToKeep` (必須) — ローテーションが行われた後にコンテナに保持するファイルの最大数を指定します。最小値は 1 で、最大値は 50 です。デフォルトは 10 です。