

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Flink Kubernetes 연산자 설정 및 사용
<a name="jobruns-flink-kubernetes-operator"></a>

다음 페이지에서는 Flink Kubernetes 운영자를 설정 및 사용하여, Amazon EMR on EKS에서 Flink 작업을 실행하는 방법을 설명합니다. 사용 가능한 주제에는 필수 사전 조건, 환경 설정 방법, Amazon EMR on EKS에서 Flink 애플리케이션 실행이 포함됩니다.

**Topics**
+ [Amazon EMR on EKS에 대한 Flink Kubernetes 운영자 설정](jobruns-flink-kubernetes-operator-setup.md)
+ [Amazon EMR on EKS에 대한 Flink Kubernetes 연산자 설치](jobruns-flink-kubernetes-operator-getting-started.md)
+ [Flink 애플리케이션 실행](jobruns-flink-kubernetes-operator-run-application.md)
+ [Flink 애플리케이션을 실행하기 위한 보안 역할 권한](jobruns-flink-kubernetes-security.md)
+ [Amazon EMR on EKS에 대한 Flink Kubernetes 운영자 제거](jobruns-flink-kubernetes-operator-uninstall.md)

# Amazon EMR on EKS에 대한 Flink Kubernetes 운영자 설정
<a name="jobruns-flink-kubernetes-operator-setup"></a>

Amazon EKS에서 Flink Kubernetes 운영자를 설치하려면 먼저 설정을 위해 다음 작업을 수행합니다. Amazon Web Services(AWS)에 이미 가입했고 Amazon EKS를 사용하고 있는 경우 Amazon EMR on EKS를 사용할 준비를 거의 마친 상태입니다. Amazon EKS에서 Flink 운영자를 설정하려면 다음 작업을 수행합니다. 필수 조건 중 하나를 이미 완료한 경우 해당 조건을 건너뛰고 다음 조건으로 넘어갈 수 있습니다.
+ **[의 최신 버전 설치 또는 업데이트 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) ** -를 이미 설치한 경우 최신 버전이 있는지 AWS CLI확인합니다.
+ **[kubectl 및 eksctl 설치](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)** - eksctl은 Amazon EKS와 통신하는 데 사용하는 명령줄 도구입니다.
+ **[Install Helm](https://docs.aws.amazon.com/eks/latest/userguide/helm.html)** – Kubernetes용 Helm 패키지 관리자는 Kubernetes 클러스터에서 애플리케이션을 설치하고 관리하는 데 도움이 됩니다.
+ **[Amazon EKS 시작하기 – eksctl](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html) ** - 관련 단계를 수행하여 Amazon EKS에서 노드를 포함하는 새 Kubernetes 클러스터를 생성합니다.
+ **[Amazon EMR 릴리스 레이블 선택](jobruns-flink-security-release-versions.md)(릴리스 6.13.0 이상)** - Flink Kubernetes 연산자는 Amazon EMR 릴리스 6.13.0 이상에서 지원됩니다.
+ **[Amazon EKS 클러스터에서 서비스 계정에 대한 IAM 역할(IRSA)을 활성화](setting-up-enable-IAM.md)**합니다.
+ **[작업 실행 역할을 생성](creating-job-execution-role.md)**합니다.
+ **[작업 실행 역할의 신뢰 정책을 업데이트](setting-up-trust-policy.md)**합니다.
+ 운영자 실행 역할을 생성합니다. 이 단계는 선택 사항입니다. Flink 작업과 운영자에 동일한 역할을 사용할 수 있습니다. 운영자에 대해 다른 IAM 역할을 사용하려는 경우 별도의 역할을 생성할 수 있습니다.
+ 운영자 실행 역할의 신뢰 정책을 업데이트합니다. Amazon EMR Flink Kubernetes 운영자 서비스 계정에 사용할 역할에 대해 신뢰 정책 항목 하나를 명시적으로 추가해야 합니다. 다음 예제 형식을 따를 수 있습니다.

------
#### [ JSON ]

****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
          "sts:AssumeRoleWithWebIdentity"
        ],
        "Resource": [
          "*"
        ],
        "Condition": {
          "StringLike": {
            "aws:userid": "system:serviceaccount:emr:emr-containers-sa-flink-operator"
          }
        },
        "Sid": "AllowSTSAssumerolewithwebidentity"
      }
    ]
  }
  ```

------

# Amazon EMR on EKS에 대한 Flink Kubernetes 연산자 설치
<a name="jobruns-flink-kubernetes-operator-getting-started"></a>

이 주제는 Flink 배포를 준비하여 Amazon EKS에서 Flink Kubernetes 연산자 사용을 시작하는 데 도움을 줍니다.

## Kubernetes 연산자 설치
<a name="jobruns-flink-kubernetes-operator-getting-started-install-operator"></a>

다음 단계를 사용하여 Apache Flink용 Kubernetes 운영자를 설치합니다.

1. 아직 실행하지 않았다면, [Amazon EMR on EKS에 대한 Flink Kubernetes 운영자 설정](jobruns-flink-kubernetes-operator-setup.md)의 단계를 완료합니다.

1. *cert-manager*(Amazon EKS 클러스터당 하나)를 설치하여 웹후크 구성 요소 추가를 지원합니다.

   ```
   kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.0/cert-manager.yaml
   ```

1. 차트 Helm을 설치합니다.

   ```
   export VERSION=7.12.0 # The Amazon EMR release version
   export NAMESPACE=The Kubernetes namespace to deploy the operator
   
   helm install flink-kubernetes-operator \
   oci://public.ecr.aws/emr-on-eks/flink-kubernetes-operator \
   --version $VERSION \
   --namespace $NAMESPACE
   ```

   출력 예시:

   ```
   NAME: flink-kubernetes-operator
   LAST DEPLOYED: Tue May 31 17:38:56 2022
   NAMESPACE: $NAMESPACE
   STATUS: deployed
   REVISION: 1
   TEST SUITE: None
   ```

1. 배포가 완료될 때까지 기다린 후 차트 설치를 확인합니다.

   ```
   kubectl wait deployment flink-kubernetes-operator --namespace $NAMESPACE --for condition=Available=True --timeout=30s
   ```

1. 배포가 완료되면 다음 메시지가 표시됩니다.

   ```
   deployment.apps/flink-kubernetes-operator condition met
   ```

1. 다음 명령을 사용하여 배치된 운영자를 확인합니다.

   ```
   helm list --namespace $NAMESPACE
   ```

   다음은 앱 버전 `x.y.z-amzn-n`이 Amazon EMR on EKS 릴리스의 Flink 운영자 버전과 일치하는 예제 출력을 보여줍니다. 자세한 내용은 [Apache Flink가 포함된 Amazon EMR on EKS에 대해 지원되는 릴리스](jobruns-flink-security-release-versions.md) 단원을 참조하십시오.

   ```
   NAME                              NAMESPACE    REVISION    UPDATED                                STATUS      CHART                                   APP VERSION          
   flink-kubernetes-operator    $NAMESPACE   1           2023-02-22 16:43:45.24148 -0500 EST    deployed    flink-kubernetes-operator-emr-7.12.0    x.y.z-amzn-n
   ```

### Kubernetes 연산자 업그레이드
<a name="jobruns-flink-kubernetes-operator-upgrade"></a>

Flink 연산자의 버전을 업그레이드하려면 다음 단계를 따르세요.

1. 이전 `flink-kubernetes-operator`: `helm uninstall flink-kubernetes-operator -n <NAMESPACE>`를 제거합니다.

1. `kubectl delete crd flinkdeployments.flink.apache.org flinksessionjobs.flink.apache.org` CRD를 삭제(helm은 이전 CRD를 자동으로 삭제하지 않으므로)합니다.

1. `flink-kubernetes-operator`를 최신 버전으로 다시 설치합니다.

# Flink 애플리케이션 실행
<a name="jobruns-flink-kubernetes-operator-run-application"></a>

Amazon EMR 6.13.0 이상을 사용할 경우 Amazon EMR on EKS의 애플리케이션 모드에서 Flink Kubernetes 연산자로 Flink 애플리케이션을 실행할 수 있습니다. Amazon EMR 6.15.0 이상을 사용할 경우 세션 모드에서 Flink 애플리케이션을 실행할 수도 있습니다. 이 페이지는 Amazon EMR on EKS로 Flink 애플리케이션을 실행하기 위해 활용할 수 있는 두 가지 방법을 모두 설명합니다.

**Topics**

**참고**  
Flink 작업을 제출할 때 고가용성 메타데이터를 저장할 Amazon S3 버킷을 생성해야 합니다. 이 기능을 사용하고 싶지 않은 경우 비활성화할 수 있습니다. 기본적으로 활성화됩니다.

**전제 조건** – Flink Kubernetes 운영자로 Flink 애플리케이션을 실행하기 전에 [Amazon EMR on EKS에 대한 Flink Kubernetes 운영자 설정](jobruns-flink-kubernetes-operator-setup.md) 및 [Kubernetes 연산자 설치](jobruns-flink-kubernetes-operator-getting-started.md#jobruns-flink-kubernetes-operator-getting-started-install-operator)의 단계를 완료합니다.

------
#### [ Application mode ]

Amazon EMR 6.13.0 이상을 사용할 경우 Amazon EMR on EKS의 애플리케이션 모드에서 Flink Kubernetes 연산자로 Flink 애플리케이션을 실행할 수 있습니다.

1. 다음 예제에서 `FlinkDeployment` 정의 파일 `basic-example-app-cluster.yaml`을 생성합니다. [옵트인 AWS 리전](https://docs.aws.amazon.com/controltower/latest/userguide/opt-in-region-considerations.html) 중 하나를 활성화하고 사용하는 경우 구성의 주석 처리를 해제하고 구성해야 합니다`fs.s3a.endpoint.region`.

   ```
   apiVersion: flink.apache.org/v1beta1
   kind: FlinkDeployment
   metadata:
     name: basic-example-app-cluster
   spec:
     flinkConfiguration:
       taskmanager.numberOfTaskSlots: "2"
       #fs.s3a.endpoint.region: OPT_IN_AWS_REGION_NAME
       state.checkpoints.dir: CHECKPOINT_S3_STORAGE_PATH
       state.savepoints.dir: SAVEPOINT_S3_STORAGE_PATH 
     flinkVersion: v1_17
     executionRoleArn: JOB_EXECUTION_ROLE_ARN
     emrReleaseLabel: "emr-6.13.0-flink-latest" # 6.13 or higher
     jobManager:
       storageDir: HIGH_AVAILABILITY_STORAGE_PATH
       resource:
         memory: "2048m"
         cpu: 1
     taskManager:
       resource:
         memory: "2048m"
         cpu: 1
     job:
       # if you have your job jar in S3 bucket you can use that path as well
       jarURI: local:///opt/flink/examples/streaming/StateMachineExample.jar
       parallelism: 2
       upgradeMode: savepoint
       savepointTriggerNonce: 0
     monitoringConfiguration:    
       cloudWatchMonitoringConfiguration:
          logGroupName: LOG_GROUP_NAME
   ```

1. 다음 명령으로 Flink 배포를 제출합니다. 이렇게 하면 `FlinkDeployment` 객체(`basic-example-app-cluster`)도 생성됩니다.

   ```
   kubectl create -f basic-example-app-cluster.yaml -n <NAMESPACE>
   ```

1. Flink UI에 액세스합니다.

   ```
   kubectl port-forward deployments/basic-example-app-cluster 8081 -n NAMESPACE
   ```

1. `localhost:8081`을 열어서 Flink 작업을 로컬에서 확인합니다.

1. 작업을 정리합니다. 이 작업을 위해 생성된 S3 아티팩트(예: 검사, 고가용성, 메타데이터 세이브포인트 및 CloudWatch 로그)를 정리해야 합니다.

Flink Kubernetes 운영자를 통해 Flink에 애플리케이션을 제출하는 방법에 대한 자세한 내용은 GitHub의 `apache/flink-kubernetes-operator` 폴더에 있는 [Flink Kubernetes operator examples](https://github.com/apache/flink-kubernetes-operator/tree/main/examples)를 참조하세요.

------
#### [ Session mode ]

Amazon EMR 6.15.0 이상을 사용할 경우 Amazon EMR on EKS의 세션 모드에서 Flink Kubernetes 연산자로 Flink 애플리케이션을 실행할 수 있습니다.

1. 다음 예제에서 이름이 `basic-example-app-cluster.yaml`인 `FlinkDeployment` 정의 파일을 생성합니다. [옵트인 AWS 리전](https://docs.aws.amazon.com/controltower/latest/userguide/opt-in-region-considerations.html) 중 하나를 활성화하고 사용하는 경우 구성의 주석 처리를 해제하고 구성해야 합니다`fs.s3a.endpoint.region`.

   ```
   apiVersion: flink.apache.org/v1beta1
   kind: FlinkDeployment
   metadata:
     name: basic-example-session-cluster
   spec:
     flinkConfiguration:
       taskmanager.numberOfTaskSlots: "2"
       #fs.s3a.endpoint.region: OPT_IN_AWS_REGION_NAME
       state.checkpoints.dir: CHECKPOINT_S3_STORAGE_PATH
       state.savepoints.dir: SAVEPOINT_S3_STORAGE_PATH
     flinkVersion: v1_17
     executionRoleArn: JOB_EXECUTION_ROLE_ARN
     emrReleaseLabel: "emr-6.15.0-flink-latest"
     jobManager:
       storageDir: HIGH_AVAILABILITY_S3_STORAGE_PATH
       resource:
         memory: "2048m"
         cpu: 1
     taskManager:
       resource:
         memory: "2048m"
         cpu: 1
     monitoringConfiguration:    
       s3MonitoringConfiguration:
          logUri: 
       cloudWatchMonitoringConfiguration:
          logGroupName: LOG_GROUP_NAME
   ```

1. 다음 명령으로 Flink 배포를 제출합니다. 이렇게 하면 `FlinkDeployment` 객체(`basic-example-session-cluster`)도 생성됩니다.

   ```
   kubectl create -f basic-example-app-cluster.yaml -n NAMESPACE
   ```

1. 다음과 같은 명령을 사용하여 세션 클러스터 `LIFECYCLE`이 `STABLE`인지 확인하세요.

   ```
   kubectl get flinkdeployments.flink.apache.org basic-example-session-cluster -n NAMESPACE
   ```

   출력은 다음 예시와 비슷해야 합니다.

   ```
   NAME                              JOB STATUS   LIFECYCLE STATE
   basic-example-session-cluster                          STABLE
   ```

1. 다음 콘텐츠 예제가 포함된 `FlinkSessionJob` 사용자 지정 정의 리소스 파일 `basic-session-job.yaml`을 생성합니다.

   ```
   apiVersion: flink.apache.org/v1beta1
   kind: FlinkSessionJob
   metadata:
     name: basic-session-job
   spec:
     deploymentName: basic-session-deployment
     job:
       # If you have your job jar in an S3 bucket you can use that path.
       # To use jar in S3 bucket, set 
       # OPERATOR_EXECUTION_ROLE_ARN (--set emrContainers.operatorExecutionRoleArn=$OPERATOR_EXECUTION_ROLE_ARN)
       # when you install Spark operator
       jarURI: https://repo1.maven.org/maven2/org/apache/flink/flink-examples-streaming_2.12/1.16.1/flink-examples-streaming_2.12-1.16.1-TopSpeedWindowing.jar
       parallelism: 2
       upgradeMode: stateless
   ```

1. 다음 명령으로 Flink 세션 작업을 제출합니다. 이렇게 하면 `FlinkSessionJob` 객체 `basic-session-job`이 생성됩니다.

   ```
   kubectl apply -f basic-session-job.yaml -n $NAMESPACE
   ```

1. 다음과 같은 명령을 사용하여 세션 클러스터 `LIFECYCLE`이 `STABLE`이고 `JOB STATUS`가 `RUNNING`인지 확인하세요.

   ```
   kubectl get flinkdeployments.flink.apache.org basic-example-session-cluster -n NAMESPACE
   ```

   출력은 다음 예시와 비슷해야 합니다.

   ```
   NAME                              JOB STATUS   LIFECYCLE STATE
   basic-example-session-cluster     RUNNING      STABLE
   ```

1. Flink UI에 액세스합니다.

   ```
   kubectl port-forward deployments/basic-example-session-cluster 8081 -n NAMESPACE
   ```

1. `localhost:8081`을 열어서 Flink 작업을 로컬에서 확인합니다.

1. 작업을 정리합니다. 이 작업을 위해 생성된 S3 아티팩트(예: 검사, 고가용성, 메타데이터 세이브포인트 및 CloudWatch 로그)를 정리해야 합니다.

------

# Flink 애플리케이션을 실행하기 위한 보안 역할 권한
<a name="jobruns-flink-kubernetes-security"></a>

이 주제에서는 Flink 애플리케이션을 배포하고 실행하기 위한 보안 역할에 대해 설명합니다. 배포를 관리하고 작업을 생성 및 관리하는 데 필요한 두 가지 역할(작업자 역할과 작업 역할)이 있습니다. 이 주제에서는 이러한 역할을 소개하고 해당 권한을 나열합니다.

## 역할 기반 액세스 제어
<a name="jobruns-flink-kubernetes-security-rbac"></a>

운영자를 배포하고 Flink 작업을 실행하려면 두 개의 Kubernetes 역할(즉, 운영자 하나와 작업 역할 하나)을 생성해야 합니다. Amazon EMR은 운영자를 설치할 때 기본적으로 두 가지 역할을 생성합니다.

## 운영자 역할
<a name="jobruns-flink-kubernetes-security-operator-role"></a>

운영자 역할을 사용하여 `flinkdeployments`를 관리함으로써 각 Flink 작업 및 기타 리소스(예: 서비스)에 대한 JobManager를 생성하고 관리합니다.

운영자 역할의 기본 이름은 `emr-containers-sa-flink-operator`이며, 다음과 같은 권한이 필요합니다.

```
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - services
  - events
  - configmaps
  - secrets
  - serviceaccounts
  verbs:
  - '*'
- apiGroups:
  - rbac.authorization.k8s.io
  resources:
  - roles
  - rolebindings
  verbs:
  - '*'
- apiGroups:
  - apps
  resources:
  - deployments
  - deployments/finalizers
  - replicasets
  verbs:
  - '*'
- apiGroups:
  - extensions
  resources:
  - deployments
  - ingresses
  verbs:
  - '*'
- apiGroups:
  - flink.apache.org
  resources:
  - flinkdeployments
  - flinkdeployments/status
  - flinksessionjobs
  - flinksessionjobs/status
  verbs:
  - '*'
- apiGroups:
  - networking.k8s.io
  resources:
  - ingresses
  verbs:
  - '*'
- apiGroups:
  - coordination.k8s.io
  resources:
  - leases
  verbs:
  - '*'
```

## 작업 역할
<a name="jobruns-flink-security-job-role"></a>

JobManager는 작업 역할을 사용하여 각 작업에 대한 TaskManager 및 ConfigMap을 생성하고 관리합니다.

```
rules:
- apiGroups:
  - ""
  resources:
  - pods
  - configmaps
  verbs:
  - '*'
- apiGroups:
  - apps
  resources:
  - deployments
  - deployments/finalizers
  verbs:
  - '*'
```

# Amazon EMR on EKS에 대한 Flink Kubernetes 운영자 제거
<a name="jobruns-flink-kubernetes-operator-uninstall"></a>

다음 단계에 따라 Flink Kubernetes 운영자를 제거합니다.

1. 운영자를 삭제합니다.

   ```
   helm uninstall flink-kubernetes-operator -n <NAMESPACE>
   ```

1. Helm에서 제거하지 않는 Kubernetes 리소스를 삭제합니다.

   ```
   kubectl delete serviceaccounts, roles, rolebindings -l emr-containers.amazonaws.com/component=flink.operator --namespace <namespace>
   kubectl delete crd flinkdeployments.flink.apache.org flinksessionjobs.flink.apache.org
   ```

1. (선택 사항) cert-manager를 삭제합니다.

   ```
   kubectl delete -f https://github.com/jetstack/cert-manager/releases/download/v1.12.0/cert-manager.yaml
   ```