

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

# 使用 Flink 原生 Kubernetes
<a name="jobruns-flink-native-kubernetes"></a>

Amazon EMR 6.13.0 版及更高版本支援 Flink Native Kubernetes 作為命令列工具，可以使用它向 Amazon EMR on EKS 叢集提交 Flink 應用程式並執行。

**Topics**
+ [針對 Amazon EMR on EKS 設定 Flink Native Kubernetes](jobruns-flink-native-kubernetes-setup.md)
+ [開始針對 Amazon EMR on EKS 使用 Flink Native Kubernetes](jobruns-flink-native-kubernetes-getting-started.md)
+ [Native Kubernetes 的 Flink JobManager 服務帳戶安全要求](jobruns-flink-native-kubernetes-security-requirements.md)

# 針對 Amazon EMR on EKS 設定 Flink Native Kubernetes
<a name="jobruns-flink-native-kubernetes-setup"></a>

完成下列任務進行設定，然後才能在 Amazon EMR on EKS 上使用 Flink CLI 執行應用程式。如果已經註冊 Amazon Web Services (AWS) 且已在使用 Amazon EKS，則您幾乎可使用 Amazon EMR on EKS。如果已經完成任何先決條件，則可以跳過這些先決條件，然後繼續進行下一個。
+ **[安裝或更新至最新版本的 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)**- 如果您已安裝 AWS CLI，請確認您擁有最新版本。
+ **[開始使用 Amazon EKS – eksctl](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html) ** – 請依照步驟在 Amazon EKS 中建立具有節點的新 Kubernetes 叢集。
+ **[選擇 Amazon EMR 基礎映像 URI](docker-custom-images-tag.md) (6.13.0 版或更高版本)** - Amazon EMR 6.13.0 版及更高版本支援 Flink Kubernetes 命令。
+ 確認 JobManager 服務帳戶具有建立和監控 TaskManager Pod 的適當許可。如需詳細資訊，請參閱[原生 Kubernetes 的 Flink JobManager 服務帳戶安全需求](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/jobruns-flink-native-kubernetes-security-requirements.html)。
+ 設定本機 [AWS 憑證設定檔](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html)。
+ 對於您要在其中執行 Flink 應用程式的 [Amazon EKS 叢集建立或更新 Kubeconfig 檔案](https://docs.aws.amazon.com/eks/latest/userguide/create-kubeconfig.html)。

# 開始針對 Amazon EMR on EKS 使用 Flink Native Kubernetes
<a name="jobruns-flink-native-kubernetes-getting-started"></a>

這些步驟說明如何設定、設定服務帳戶，以及執行 Flink 應用程式。Flink 原生 Kubernetes 用於在執行中的 Kubernetes 叢集上部署 Flink。

## 設定和執行 Flink 應用程式
<a name="jobruns-flink-native-kubernetes-getting-started-run-application"></a>

Amazon EMR 6.13.0 及更高版本支援 Flink Native Kubernetes，以便在 Amazon EKS 叢集上執行 Flink 應用程式。完成以下步驟，以執行 Flink 應用程式：

1. 在使用 Flink Native Kubernetes 命令執行 Flink 應用程式之前，請先完成 [針對 Amazon EMR on EKS 設定 Flink Native Kubernetes](jobruns-flink-native-kubernetes-setup.md) 中的步驟。

1. [下載並安裝 Flink](https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/try-flink/local_installation)。

1. 設定以下環境變數的值。

   ```
   #Export the FLINK_HOME environment variable to your local installation of Flink
   export FLINK_HOME=/usr/local/bin/flink #Will vary depending on your installation
   export NAMESPACE=flink
   export CLUSTER_ID=flink-application-cluster
   export IMAGE=<123456789012.dkr.ecr.sample-AWS 區域-.amazonaws.com/flink/emr-6.13.0-flink:latest>
   export FLINK_SERVICE_ACCOUNT=emr-containers-sa-flink
   export FLINK_CLUSTER_ROLE_BINDING=emr-containers-crb-flink
   ```

1. 建立服務帳戶，以管理 Kubernetes 資源。

   ```
   kubectl create serviceaccount $FLINK_SERVICE_ACCOUNT -n $NAMESPACE
   kubectl create clusterrolebinding $FLINK_CLUSTER_ROLE_BINDING --clusterrole=edit --serviceaccount=$NAMESPACE:$FLINK_SERVICE_ACCOUNT
   ```

1. 執行 `run-application` CLI 命令 。

   ```
   $FLINK_HOME/bin/flink run-application \
       --target kubernetes-application \
       -Dkubernetes.namespace=$NAMESPACE \
       -Dkubernetes.cluster-id=$CLUSTER_ID \
       -Dkubernetes.container.image.ref=$IMAGE \
       -Dkubernetes.service-account=$FLINK_SERVICE_ACCOUNT \
       local:///opt/flink/examples/streaming/Iteration.jar
   2022-12-29 21:13:06,947 INFO  org.apache.flink.kubernetes.utils.KubernetesUtils            [] - Kubernetes deployment requires a fixed port. Configuration blob.server.port will be set to 6124
   2022-12-29 21:13:06,948 INFO  org.apache.flink.kubernetes.utils.KubernetesUtils            [] - Kubernetes deployment requires a fixed port. Configuration taskmanager.rpc.port will be set to 6122
   2022-12-29 21:13:07,861 WARN  org.apache.flink.kubernetes.KubernetesClusterDescriptor      [] - Please note that Flink client operations(e.g. cancel, list, stop, savepoint, etc.) won't work from outside the Kubernetes cluster since 'kubernetes.rest-service.exposed.type' has been set to ClusterIP.
   2022-12-29 21:13:07,868 INFO  org.apache.flink.kubernetes.KubernetesClusterDescriptor      [] - Create flink application cluster flink-application-cluster successfully, JobManager Web Interface: http://flink-application-cluster-rest.flink:8081
   ```

1. 檢查已建立的 Kubernetes 資源。

   ```
   kubectl get all -n <namespace>
   NAME READY STATUS RESTARTS AGE
   pod/flink-application-cluster-546687cb47-w2p2z 1/1 Running 0 3m37s
   pod/flink-application-cluster-taskmanager-1-1 1/1 Running 0 3m24s
   
   NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
   service/flink-application-cluster ClusterIP None <none> 6123/TCP,6124/TCP 3m38s
   service/flink-application-cluster-rest ClusterIP 10.100.132.158 <none> 8081/TCP 3m38s
   
   NAME READY UP-TO-DATE AVAILABLE AGE
   deployment.apps/flink-application-cluster 1/1 1 1 3m38s
   
   NAME DESIRED CURRENT READY AGE
   replicaset.apps/flink-application-cluster-546687cb47 1 1 1 3m38s
   ```

1. 連接埠轉送到 8081。

   ```
   kubectl port-forward service/flink-application-cluster-rest 8081 -n <namespace>
   Forwarding from 127.0.0.1:8081 -> 8081
   ```

1. 在本機存取 Flink 使用者介面。  
![\[存取 Flink UI。\]](http://docs.aws.amazon.com/zh_tw/emr/latest/EMR-on-EKS-DevelopmentGuide/images/jobruns-flink-native-kubernetes-ui.png)

1. 刪除 Flink 應用程式。

   ```
   kubectl delete deployment.apps/flink-application-cluster -n <namespace>
   deployment.apps "flink-application-cluster" deleted
   ```

如需有關提交應用程式至 Flink 的詳細資訊，請參閱 Apache Flink 文件中的 [Native Kubernetes](https://nightlies.apache.org/flink/flink-docs-master/docs/deployment/resource-providers/native_kubernetes/)。

# Native Kubernetes 的 Flink JobManager 服務帳戶安全要求
<a name="jobruns-flink-native-kubernetes-security-requirements"></a>

Flink JobManager Pod 使用 Kubernetes 服務帳戶來存取 Kubernetes API 伺服器，以建立和監控 TaskManager Pod。JobManager 服務帳戶必須具有適當的許可，才能建立/刪除 TaskManager Pod，並允許 TaskManager 監看領導者 ConfigMaps，以擷取叢集中 JobManager 和 ResourceManager 的地址。

下列規則適用於此服務帳戶。

```
rules:
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - "*"
- apiGroups:
  - ""
  resources:
  - services
  verbs:
  - "*"
- apiGroups:
  - ""
  resources:
  - configmaps
  verbs:
  - "*"
- apiGroups:
  - "apps"
  resources:
  - deployments
  verbs:
  - "*"
```