본문 바로가기

MLOps/Development

효율적인 대규모 크롤링 시스템 운영을 위한 Fargate on EKS 적용하기 - 1편

효율적인 대규모 크롤링 시스템 운영을 위한 Fargate on EKS 적용하기 - 1편

본 글은 대규모 크롤링 시스템 환경 개선을 위해 Fargate on EKS 적용하여 주니어 입장에서 멘땅에 헤딩하며 구축한 과정의 이야기다


다음과 같은 분들이 읽으면 좋습니다.

  • EKS를 사용해보고자 하는 엔지니어 입문자
  • 피드백을 남기고 싶은 고수분들
  • 지나가는 행인

시작하기 전에 알면 좋은 것들

프로비저닝(Provisioning)

  • 사용자 요구에 맞게 시스템 자원을 할당/배치/배포해 두었다가 필요시 시스템을 즉시 사용할 수 있는 상태로 미리 준비해 두는 것

스팟 인스턴스(Spot Instance)

  • Spot : 시간당 가격
  • 즉, 인스턴스 가격이 시간마다 달라지는데 수요와 공급에 따라 조정되기 때문에 공급이 많은 시간 때는 온디멘드 보다 저렴하게 사용할 수 있는 인스턴스 방식

AWS Fargate Spot

  • Fargate Spot은 있지만, EKS에 사용 가능한 Fargate spot은 아직 지원하지 않음

AWS Fargate

  • 컨테이너 실행을 위한 AWS 서버리스 컴퓨팅엔진(업그레이드 및 패치 걱정 No!)
  • 편리하지만 EC2보다 비쌈

EKS 구축 시 적합 한 인스턴스 타입 고르기

ENI(Elastic Network Interface)

  • 인스턴스가 AWS 서비스, 다른 인스턴스 그리고 인터넷 등 다른 네트워크 리소스와 통신할 수 있도록 하며, SSH 등을 이용해 인스턴스에서 실행 중인 OS와 통신을 가능하게 함

가용 영역(Availability Zone)

  • 1개 이상의 물리적인 데이터 센터를 묶어놓은 논리적인 데이터 센터
  • 가용 영역은 물리적으로 떨어져 있어서 장애 발생에 독립 적임

리전(Region)

  • 2개 이상의 가용영역으로 구성된 물리적인 영역
  • 예) 서울 리전, 독일 리전

1. 파이프라인

  • Airflow는 상시 동작하며 모니터링하기 위해 노드에 올림
  • 동작이 끝나면 인스턴스를 종료시켜 비용을 아끼기 위해 크롤러 On Fargate
  • Dag 관리를 위해 Git sync를 하거나 Repo를 하나 따로 사용하는 행위는 필요성을 느끼지 못해서 Airflow Image 안에 심어서 사용할 예정에 있다. 물론 필요하다면 추가 예정
  • 파이프라인은 계속 개선해나가야 한다. 


2. 환경 구축

2.1 VPC 구성 하기

  • VPC 생성할 때, "VPC/VPC 등"이 나오는데 VPC 등을 선택해서 서브넷, NAT, 게이트웨이 및 엔드포인트도 같이 설정하자

2.2 AWS CLI 설치

  • 설치 전 사용자 추가와 키파일 설정
# eks 유저 추가, eks가 소속될 그룹 지정 (root, sudo)
useradd -G sudo,root eks

# 비밀번호 지정
passwd eks

# 키파일 설정
sudo cp -r /home/ubuntu/.ssh/ /home/eks/.ssh/
ssh$ sudo chown -R eks:eks /home/eks/.ssh/

sudo service sshd restart
sudo service ssh restart

2.3 Kubectl 설치

# 다운로드 
curl -O https://s3.us-west-2.amazonaws.com/amazon-eks/1.24.10/2023-01-30/bin/linux/amd64/kubectl

chmod +x ./kubectl
mkdir -p $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$PATH:$HOME/bin
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc

# 설치 확인
kubectl version --short --client

2.4 Ekctl 설치

2.5 Kubectl과 생성한 EKS Cluster 연결

  • Cluster란 AWS EKS에서 생성한 Cluster을 말함
HGom@HGom:~$ aws eks update-kubeconfig --region ap-northeast-2 --name <cluster_name>

Unable to locate credentials. You can configure credentials by running "aws configure".
  • 바로 자격이 없다고 나오니까 아래 단계를 수행하면 된다.
aws configure

  • 그리고 다시 EKS 클러스터용 kubeconfig 파일을 생성 or 업데이트 후 확인
HGom@HGom:~$ aws eks update-kubeconfig --region ap-northeast-2 --name <cluster_name>

HGom@HGom:~$ kubectl get svc

만약
계속 권한 문제가 발생하면, 새로운 클러스터를 만들어 볼 것

2.6 도커 및 ECR

# 도커 설치
sudo apt install docker.io

sudo chmod 666 /var/run/docker.sock

# 시작
sudo service docker start

# 확인
sudo docker info

2.6.1 ECR 사용을 위한 인증하기

  • region_code, accound_id 변경 후 입력
aws ecr get-login-password --region <region_code> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.region.amazonaws.com

2.6.2 이미지 푸시 후 확인

  • 우측 상단에 푸시 명령 보기하면 명령어 복붙해서 사용 가능
# <기존이미지명>:<태그> <accound_id>.dkr.ecr.<region>/<repo 명>:<태그명>
docker tag hello-world:latest <account_id>.dkr.ecr.ap-northeast-2.amazonaws.com/<repo>:hellotest

docker push <account_id>.dkr.ecr.ap-northeast-2.amazonaws.com/<repo>:hellotest

2.7 노드 그룹 추가

노드 IAM Role 생성

노드를 추가하게 되면 명령어로 확인이 가능함

kubectl get no

2.8 Airflow 배포

Helm 사용?

눈치를 챘다면, Helm에 대한 언급을 하지 않았다.

그 이유는 EKS를 사용하기 전, Helm Char를 사용해서 배포를 했었다. 하지만 기본적인 매니페스트 작성을 위한 템플릿도 잘 모르는 상태에서 사용하려다 보니 혼란이 많았다. 그래서 이번에는 직접 매니페스트를 작성하면서  파드부터 SA와 Role, RoleBinding 등등 개념을 익히기로 했다. 쿠버네티스를 시작하는 입문 자라면, 한번 정도 직접 작성해 보는 것을 조심스럽게 추천한다.

 

2.8.1 Airflow image Upload

  • Airflow 이미지는 Docker hub에 있는 최신 이미지 사용했고 DB 부분만 변경해서 ECR에 업로드했다. 
sql_alchemy_conn = mysql://ID:password@ip:port/dbname
  • 그리고 DB 초기화하고, 정상적으로 초기화된 것을 확인할 수 있었다.
airflow db init

2.8.2 Airflow Webserver

  • Namespace를 하나 추가하고 아래 정보를 Base로 해서 추가 작성해서 사용했다. 

Deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: airflow
spec:
  replicas: 1
  selector:
    matchLabels:
      app: airflow
  template:
    metadata:
      labels:
        app: airflow
    spec:
      containers:
        - name: airflow-webserver
          image: <account_id>.dkr.ecr.ap-northeast-2.amazonaws.com/<repo_name>:<tag>
          ports:
            - containerPort: 8080
          command: ["airflow"]
          args: ["webserver"]

Service.yaml

apiVersion: v1
kind: Service
metadata:
  name: airflow-service
spec:
  selector:
    app: airflow
  type: NodePort
  ports:
    - name: airflow-webserver-port
      protocol: TCP
      port: 8080
      targetPort: 8080

적용

kubectl apply -f webserver.yaml -n airflow

웹서버 접속 확인

  • 접속 방법은 Node IP : Node Port 형식으로 접속이 가능하다.

2.8.3 Airflow Scheduler

  • Kubernetes Native 하기 위해 KubernetesExecutor를 사용하려고 한다.
  • 사용하기 위해서 RoleBinding을 해줘야 하는데, 처음에 그냥 해서 아래와 같은 에러를 만났다.


그러기 위해서는, Kubernets RBAC(Role-based access control)을 알아두면 좋다.

  • K8s RBAC Authorization 공식 문서
  • 개별 사용자의 역할에 따라 컴퓨터 또는 네트워크 리소스에 대한 액세스를 규제하는 방법
  • RBAC API는 4 가지 종류의 Kubernetes 개체인 Role, ClusterRole, RoleBinding, ClusterRoleBinding 선언이 가능하다.
  • Role : 특정 네임스페이스에 적용할 권한
  • ClusterRole : 클러스터 범위 리소스에 대한 권한, 여러 개의 네임스페이스, 단일도 가능

Role과 Binding의 차이를 쉽게 설명하면

Role/Cluster vs RoleBinding/ClusterRoleBinding

  • 전자는 ~~ 한 테 줄 권한들 리스트 작성해야지
  • 후자는 작성한 리스트 적용 시켜야지

같은 느낌이다.

 

예시

  • Role : default namespace에 Pod에 대한 권한(get, watch, list) 작성
  • RoleBinding : default namespace 내에서 subject(대상 주체)는 User(사용자), name(사용자 이름) 은 jane에게 rolRef(권한) 줄 건데, 그 권한의 Kind(종류)는 Role, 이름은 pod-reader 임
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]


--------

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: jane
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader 
  apiGroup: rbac.authorization.k8s.io

ClusterRole/Binding으로 작성해서 적용했고 정상 작동을 확인함

  • EKS에서 개인적으로 좋았던 건 정보들을 직관적으로 확인할 수 있다는 점이 매우 편리함 


3. 마무리 & 다음 편 예고

주니어들이 가장 쉽게 할 수 있는 것은 신규 기능개발이고, 그다음 레벨로 넘어가는 것은 개발한 기능을 개선하는 것이다.

개발을 하면서 개선 포인트를 계속 찾아갈 예정이다. 

우선은 완전한 플로우를 완성시키기 위해, 다음 편에 이어서 기능 구현에 초점을 둔 포스팅을 할 예정이다.

 

4. 참고한 테크 블로그

 

쏘카 데이터 그룹 - Airflow와 함께한 데이터 환경 구축기(feat. Airflow on Kubernetes)

지난 3년간 Airflow 구축 및 운영기록

tech.socarcorp.kr

 

 

Kubernetes를 이용한 효율적인 데이터 엔지니어링(Airflow on Kubernetes VS Airflow Kubernetes Executor) - 2

들어가며안녕하세요. LINE Financial Data Platform을 운영하고 개발하고 있는 이웅규입니다. 이 글은 지난 NAVER DEVIEW 2020에서 발표했던 Kubernetes를 이용한 효율적인 데이터 엔지니어링 (Airflow on Kuberne...

engineering.linecorp.com

 

 

결제플랫폼 구축에 EKS on Fargate 적용하기

10편 - AWS에서 MSA 서비스 구축하기 | AWS에서 MSA 서비스 구축하기 티맵모빌리티가 출범한 이후 새로운 서비스들이 속속 개발되고 있습니다. 새로 개발되는 서비스들은 AWS 상에서 운영되고 있고,

brunch.co.kr