Data Pipeline/Apache Flink

Kubernetes에 Apache Flink 구성해보기

재심 2022. 12. 1. 21:45

[준비]

 

윈도우10 WSL2 설치하기, WSL2 우분투 설치하기

WSL이란? Linux용 Windows 하위 시스템을 사용하면 개발자가 기존 가상 머신의 오버헤드 또는 듀얼 부팅 설정 없이 대부분의 명령줄 도구, 유틸리티 및 애플리케이션을 비롯한 GNU/Linux 환경을 수정하

gaesae.com

우분투(WSL2사용 )환경 기준으로 진행하였다.

 

Install and Set Up kubectl on Linux

Before you begin You must use a kubectl version that is within one minor version difference of your cluster. For example, a v1.25 client can communicate with v1.24, v1.25, and v1.26 control planes. Using the latest compatible version of kubectl helps avoid

kubernetes.io

 

Installing Helm

Learn how to install and get running with Helm.

helm.sh

#kubectl 확인
$ kubectl
kubectl controls the Kubernetes cluster manager.
 
 Find more information at: https://kubernetes.io/docs/reference/kubectl/
...
 
#helm 확인
$ helm
$ helm list

 

[Kubectl 구성하기 ]

kubeconfig 설정하기

kubeconfig 파일이란 k8s의 설정파일로 kubectl 명령어로 k8s api 서버에 접근할 인증정보를 담고 있다. 

구성 한 후 config 파일을 아래 경로에 위치시켜야 한다.

~/.kube/config

접속확인

# 노드목록이 나오면 성공!
$kubectl get node
NAME            STATUS   ROLES           AGE   VERSION
control1        Ready    control-plane   18d   v1.24.6
control2        Ready    control-plane   18d   v1.24.6
...

[Apache Flink를 Native Kubernetes로 구성해보기]

가이드: https://nightlies.apache.org/flink/flink-docs-master/docs/deployment/resource-providers/native_kubernetes/

쿠버네티스에 플링크를 구성하는 방법은 여러가지가 있는 듯하다. 가이드 페이지에는 크게 standalone + 쿠버네티스 형태의 flink구성과 native 쿠버네티스 형태의 구성이 있다. 

가이드에 따르면 신규 사용자는 native로 입문한다고 한다. 그러므로 우선 native 형태로 구성해본다.

 

일반적인 쿠버네티스 구성의 경우 master, job manager 등을 직접 yaml 파일로 작성하고 create해줘야 구성되지만, native 버전의 경우 단순히 bin 파일에 있는 스크립트를 실행하면 쿠버네티스 환경에서 flink를 구동할 수 있게 해주는 듯하다.

 

Step0 : namespace 만들기

독자적인 공간에서 하고싶어서 namespace를 하나 만들었다. 

#namespace 확인
$ kubectl get namespace
 
# namespace를 생성하기
$ kubectl create namespace jaeshim-flink
 
# 앞으로 kubectl 명령어를 수행할 때 namespace가 디폴트로 설정되게 하기 
$ sudo kubectl config set-context --current --namespace=jaeshim-flink

Step1: Start Kubernetes Session

# default라는 이름의 namespace 내에서 구동한다. (openshift의 프로젝트 같은 개념인듯..?)
$ ./kubernetes-session.sh -Dkubernetes.cluster-id=my-first-flink-cluster -Dkubernetes.namespace=jaeshim-flink
 
오류가 발생한다.. 오류 메시지로 찾아보니 권한이 없다는 뜻으로 추측된다.
오류 뜻: jaeshim-flink namespace에서 pod에 watch할 수 있는 권한이 없다.
pods is forbidden: User "system:serviceaccount:jaeshim-flink:default" cannot watch resource "pods" in API group "" in the namespace "jaeshim-flink"

쿠버네티스의 RABC, Role, RoleBinding

https://jangcenter.tistory.com/123

 

[Kubernetes] RBAC, Role, RoleBinding(Authorization)

쿠버네티스 접근제어 체계 Authentication : 접속한 사람의 신분을 시스템이 인증하는 단계 -> 신분증 확인 Authorization : 어떤 권한을 가지고 어떤 행동을 할 수 있는지 확인하는 단계 -> 사용자별 권한

jangcenter.tistory.com

https://velog.io/@khyup0629/K8S-RBAC-%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-Role-RoleBinding-ClusterRole-ClusterRoleBinding

 

[K8S] RBAC 의 개념과 Role, RoleBinding, ClusterRole, ClusterRoleBinding

API 서버에 접근하기 위해서는 인증 작업이 필요합니다.Role-based access control(RBAC. 역할 기반 액세스 제어)사용자의 역할에 따라 리소스에 대한 접근 권한을 가짐User: 클러스터 외부에서 쿠버네티스

velog.io

쿠버네티스의 접근제어는 RBAC을 사용하며 이는 역할 기반으로 권한을 부여하는 방법으로 Role, RoleBinding 오브젝트를 사용한다고 한다.

 

  • Role: Read, Write 같은 역할을 의미하며 여러개를 만들 수 있다. namespace단위로 Role을 생성하여 부여할 수 있다.
  • RoleBinding: Role과 ServiceAccount를 연결해주는 역할. RoleBinding에 연결된 ServiceAccount들은 RoleBinding에 연결된 Role의 역할을 사용할 수 있게 된다. ex) A RoleBinding에 read, write권한이 연결되어 있고, 이를 재심이라는 ServiceAccount에서 사용한다면 재심은 read,write 권한이 있게된다. 

 

ServiceAccount, Role, RoleBinding 생성하고 ServiceAccount와 연결하기

##serviceaccount 생성
$ kubectl create serviceaccount jaeshim --namespace=jaeshim-flink
#확인
$ kubectl get serviceaccount --namespace=jaeshim-flink
 
## Role 생성 (위의 오류에서 pod에 대해 forbidden 오류라고 했으므로 pod 리소스에 권한을 부여하는 Role을 생성하였다)
$ kubectl create role flink-role --verb=get --verb=list --verb=watch --resource=pods --namespace=jaeshim-flink
 
$ kubectl get role --namespace=jaeshim-flink
$ kubectl describe role flink-role --namespace=jaeshim-flink
 
##RoleBinding 생성 및 serviceaccount와 연결
$ kubectl create rolebinding flink-rolebinding --role=flink-role --serviceaccount=jaeshim --namespace=jaeshim-flink
# 확인
$ kubectl get rolebinding --namespace=jaeshim-flink
$ kubectl describe rolebinding flink-rolebinding --namespace=jaeshim-flink

다시 구동해보기

$ ./kubernetes-session.sh -Dkubernetes.cluster-id=my-first-flink-cluster -Dkubernetes.namespace=jaeshim-flink
 
#deployments 확인
$ kubectl get deployments
NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
my-first-flink-cluster   1/1     1            1           9s
 
#pods 확인
$ kubectl get pods
 
NAME                                     READY   STATUS    RESTARTS   AGE
my-first-flink-cluster-7c875559f-m4ffm   1/1     Running   0          43s
 
#로그확인
$ kubectl logs my-first-flink-cluster-7c875559f-m4ffm
 
...
nal.cluster.execution-mode, NORMAL
2022-12-01 12:30:32,153 INFO  org.apache.flink.configuration.GlobalConfiguration           [] - Loading configuration property: parallelism.default, 1
2022-12-01 12:30:32,153 INFO  org.apache.flink.configuration.GlobalConfiguration           [] - Loading configuration property: kubernetes.namespace, jaeshim-flink
2022-12-01 12:30:32,153 INFO  org.apache.flink.configuration.GlobalConfiguration           [] - Loading configuration property: taskmanager.numberOfTaskSlots, 1
2022-12-01 12:30:32,153 INFO  org.apache.flink.configuration.GlobalConfiguration           [] - Loading configuration property: rest.address, localhost
2022-12-01 12:30:32,156 INFO  org.apache.flink.runtime.rpc.akka.AkkaRpcService             [] - Starting RPC endpoint for org.apache.flink.runtime.resourcemanager.active.ActiveResourceManager at akka://flink/user/rpc/resourcemanager_1 .
2022-12-01 12:30:32,165 INFO  org.apache.flink.runtime.resourcemanager.active.ActiveResourceManager [] - Starting the resource manager.
2022-12-01 12:30:33,642 INFO  org.apache.flink.kubernetes.KubernetesResourceManagerDriver  [] - Recovered 0 pods from previous attempts, current attempt id is 1.
2022-12-01 12:30:33,642 INFO  org.apache.flink.runtime.resourcemanager.active.ActiveResourceManager [] - Recovered 0 workers from previous attempt.

아까와 달리 오류가 없이 구동되었다.

 

 Step2: 포트포워딩 적용하기

기본적으로 플링크의 Web UI는 ClusterIP형태로만 노출된다고 한다. 

Web UI에 접근하려면 포트포워딩을 설정하라고 한다.

#서비스확인 - -rest가 붙인 것에 web ui가 있는 듯 하다.
$ kubectl get services
 
NAME                          TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)             AGE
my-first-flink-cluster        ClusterIP   None          <none>        6123/TCP,6124/TCP   3m27s
my-first-flink-cluster-rest   ClusterIP   10.233.2.70   <none>        8081/TCP            3m27s
 
$ kubectl port-forward service/my-first-flink-cluster-rest 8081
Forwarding from 127.0.0.1:8081 -> 8081
Forwarding from [::1]:8081 -> 8081

 

/etc/hosts에 아래 적용

127.0.0.1 my-first-flink-cluster-rest
::1 my-first-flink-cluster-rest

Apache Flink Web UI

 

[참조 : 사용한 커맨드]

#Native Kubernetes에서 Flink 구동
./kubernetes-session.sh -Dkubernetes.cluster-id=my-first-flink-cluster -Dkubernetes.namespace=jaeshim-flink
./kubernetes-session.sh -Dkubernetes.cluster-id=my-first-flink-cluster -Dkubernetes.namespace=default
 
#포트포워딩 설정
kubectl port-forward service/my-first-flink-cluster-rest 8081
 
#job 제출
sudo ./flink run \
    --target kubernetes-session \
    -Dkubernetes.cluster-id=my-first-flink-cluster \
    ../examples/streaming/TopSpeedWindowing.jar
-------------------------------------------------
 
#deployment 삭제하기
kubectl delete deployment/my-first-flink-cluster
 
#
kubectl get --watch system:serviceaccount:default:default
#로그확인하기
kubectl logs my-first-flink-cluster-7c875559f-jm4m7
 
#권한 확인하기
kubectl auth can-i watch pods --as=system:serviceaccount:default:default
 
# namespace 관련
kubectl get namespace
kubectl get pods --namespace=default
kubectl create namespace jaeshim-flink
# 후속 namespace context를 변경하기
sudo kubectl config set-context --current --namespace=jaeshim-flink
sudo kubectl config set-context --current --namespace=default
 
kubectl describe namespace jaeshim-flink

'Data Pipeline > Apache Flink' 카테고리의 다른 글

Apache Flink란?  (0) 2022.10.29