

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

# 監控 Flink Kubernetes Operator 和 Flink 作業
<a name="jobruns-flink-monitoring"></a>

本章節描述了您可以透過 Amazon EMR on EKS 來監控 Flink 作業的幾種方式。這包括使用 Flink *Web Dashboard* 將 Flink 與 Amazon Managed Service for Prometheus 整合，以提供任務狀態和指標，或使用監控組態將日誌資料傳送至 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 Operator 和 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 EKS 上執行的叢集的 Amazon Managed Service 中擷取指標。Amazon Managed Service for Prometheus 與 Amazon EKS 叢集上已經執行的 Prometheus 伺服器搭配使用。執行 Amazon Managed Service for Prometheus 與 Amazon EMR Flink Operator 的整合將自動部署和設定 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)。

   在繼續之前，請先建立名為 `amp-iamproxy-ingest-role` 的 IAM 角色。

1. 安裝 Amazon EMR Flink Operator 與 Amazon Managed Service for Prometheus。

現在您擁有 Amazon Managed Service for Prometheus 工作區、Amazon Managed Service for Prometheus 的專用 IAM 角色以及必要的許可，可以安裝 Amazon EMR Flink Operator。

建立 `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
```

此命令會自動在連接埠 9999 的運算子中安裝 Prometheus 報告程式。任何未來的 `FlinkDeployment` 也會在 9249 上公開 `metrics` 連接埠。
+ Flink Operator 指標會顯示在標籤 `flink_k8soperator_` 下的 Prometheus 中。
+ Flink Task Manager 指標會顯示在標籤 `flink_taskmanager_` 下的 Prometheus 中。
+ Flink Job Manager 指標會顯示在標籤 `flink_jobmanager_` 下的 Prometheus 中。

# 使用 Flink UI 監控 Flink 任務
<a name="jobruns-flink-monitoring-ui"></a>

若要監控執行中 Flink 應用程式的運作狀態和效能，請使用 *Flink Web Dashboard*。此儀表板提供有關作業狀態、TaskManager 數目以及作業指標和日誌的資訊。它也可讓您檢視和修改 Flink 作業的組態，並與 Flink 叢集互動，以提交或取消作業。

若要存取正在 Kubernetes 上執行的 Flink 應用程式的 Flink Web Dashboard，請執行下列動作：

1. 使用 `kubectl port-forward` 命令將本機連接埠轉送至 Flink 應用程式的 TaskManager Pod 中執行 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。此儀表板會顯示有關執行中 Flink 應用程式的資訊，例如作業狀態、TaskManager 數目以及作業指標和日誌。  
![\[Flink 儀表板 UI 範例\]](http://docs.aws.amazon.com/zh_tw/emr/latest/EMR-on-EKS-DevelopmentGuide/images/sample-flink-dashboard-ui.png)

# 使用監控組態來監控 Flink Kubernetes Operator 和 Flink 任務
<a name="jobruns-flink-monitoring-configuration"></a>

監控組態可讓您輕鬆地將 Flink 應用程式和 Operator 日誌的日誌封存設定為 S3 和/或 CloudWatch (您可以選擇其中一個或兩者)。這樣做可將 FluentD 附屬項新增到 JobManager 和 TaskManager Pod，隨後將這些元件的日誌轉發到您設定的接收器。

**注意**  
必須為 Flink Oerator 和 Flink 作業 (服務帳戶) 的服務帳戶設定 IAM 角色，才能使用此功能，因為它需要與其他 AWS 服務互動。必須在 [針對 Amazon EMR on EKS 設定 Flink Kubernetes Operator](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` (必要) - 指定日誌輪換的檔案大小。可能的值範圍為 2KB 至 2GB。rotationSize 參數的數值單位部分會以整數形式傳遞。由於不支援小數值，因此可以使用值 1500MB 來指定 1.5GB 的輪換大小。預設值為 2GB。
  + `maxFilesToKeep` (必要) — 指定輪換發生後，要在容器中保留的檔案數上限。下限值是 1，上限值是 50。預設為 10。

## Flink Operator 日誌
<a name="jobruns-flink-monitoring-configuration-operator-logs"></a>

也可以使用 Helm Chart 安裝中 `values.yaml` 檔案的下列選項，為 Operator 啟用日誌封存。可以啟用 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` (必要) - 指定日誌輪換的檔案大小。可能的值範圍為 2KB 至 2GB。rotationSize 參數的數值單位部分會以整數形式傳遞。由於不支援小數值，因此可以使用值 1500MB 來指定 1.5GB 的輪換大小。預設值為 2GB。
  + `maxFilesToKeep` (必要) — 指定輪換發生後，要在容器中保留的檔案數上限。下限值是 1，上限值是 50。預設為 10。