티스토리 뷰

개발/Apache Airflow

EKS Airflow에 git-sync 적용

Jaeyeon Baek 2022. 5. 23. 22:39

KubernetesExecutor 적용에서 이어지는 내용입니다. 환경 구성이 끝났다는 가정하에 진행합니다.


 

앞에서 만든  values.yaml 파일을 수정하고 적용해야 합니다. 이 파일은 계속 사용되므로 VCS(Version Control System)에서 관리하면 좋습니다. 자, 파일을 열어보면 gitSync라는 설정 부분이 있습니다. 이 부분을 수정해서 Kubernetes에서 Sidecar Pattern으로 gitSync를 사용할 수 있습니다. 이름부터 직관적이라 어떤 기능인지 이해하는데 어려움은 없습니다. 일단 values.yaml 파일에서 관련된 부분을 살펴보시죠.

# Git sync
dags:
  persistence:
    # Enable persistent volume for storing dags
    enabled: false
    # Volume size for dags
    size: 1Gi
    # If using a custom storageClass, pass name here
    storageClassName:
    # access mode of the persistent volume
    accessMode: ReadWriteOnce
    ## the name of an existing PVC to use
    existingClaim:
  gitSync:
    enabled: false

    # git repo clone url
    # ssh examples ssh://git@github.com/apache/airflow.git
    # git@github.com:apache/airflow.git
    # https example: https://github.com/apache/airflow.git
    repo: https://github.com/apache/airflow.git
    branch: v2-2-stable
    rev: HEAD
    depth: 1
    # the number of consecutive failures allowed before aborting
    maxFailures: 0
    # subpath within the repo where dags are located
    # should be "" if dags are at repo root
    subPath: "tests/dags"
    # if your repo needs a user name password
    # you can load them to a k8s secret like the one below
    #   ---
    #   apiVersion: v1
    #   kind: Secret
    #   metadata:
    #     name: git-credentials
    #   data:
    #     GIT_SYNC_USERNAME: <base64_encoded_git_username>
    #     GIT_SYNC_PASSWORD: <base64_encoded_git_password>
    # and specify the name of the secret below
    #
    # credentialsSecret: git-credentials
    #
    #
    # If you are using an ssh clone url, you can load
    # the ssh private key to a k8s secret like the one below
    #   ---
    #   apiVersion: v1
    #   kind: Secret
    #   metadata:
    #     name: airflow-ssh-secret
    #   data:
    #     # key needs to be gitSshKey
    #     gitSshKey: <base64_encoded_data>
    # and specify the name of the secret below
    # sshKeySecret: airflow-ssh-secret
    #
    # If you are using an ssh private key, you can additionally
    # specify the content of your known_hosts file, example:
    #
    # knownHosts: |
    #    <host1>,<ip1> <key1>
    #    <host2>,<ip2> <key2>
    # interval between git sync attempts in seconds
    wait: 60
    containerName: git-sync
    uid: 65533

    # When not set, the values defined in the global securityContext will be used
    securityContext: {}
    #  runAsUser: 65533
    #  runAsGroup: 0

    extraVolumeMounts: []
    env: []
    resources: {}
    #  limits:
    #   cpu: 100m
    #   memory: 128Mi
    #  requests:
    #   cpu: 100m
    #   memory: 128Mi

 

편집 없이 git sync 설정 전체를 가져왔습니다. Dag 소스가 있는 Repository 경로를  gitSync 부분에 작성해주면 됩니다. Repository URL에 토큰 정보가 담겨있다면 dags.gitSync.repo 부분만 변경해도 충분하지만 일반적으로 그렇지 않을 테니 아래와 같이 SSH Key를 발급받고 EKS에서 사용 가능하도록 연동해주도록 합니다.

우선 SSH 키를 발급받습니다. 

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

 

위 명령어를 통해 발급받은 공용 키( .pub )를 GitHub에 등록해줍니다. 이때 Allow write access는 체크하지 않도록 합니다. Airflow에서 dag 정보를 가져가는(read) 용도로만 사용하게 될 테니까요. 등록이 끝나면 아래 같은 상태가 됩니다. 최초에는 키가 사용된 적이 없어서 회색일 겁니다.

GitHub > Settings > Security > Deploy keys

 

그리고 아래와 같이 kubectl 명령어를 통해 EKS에 키를 등록해줍니다. /Users/jybaek/ 경로는 각자 설정에 맞게 변경해주시면 됩니다. 그리고 generic 뒤에 airflow-ssh-secret이라는 이름은 뒤쪽 values.yaml에 그대로 사용될 예정입니다. 혹시 여기서 변경하게 되시면 그쪽도 같이 수정해줘야 합니다.

$ kubectl create secret generic airflow-ssh-secret \
--from-file=gitSshKey=/Users/jybaek/.ssh/id_ed25519 \
--from-file=known_hosts=/Users/jybaek/.ssh/known_hosts \
--from-file=id_ed25519.pub=/Users/jybaek/.ssh/id_ed25519.pub -n transformer

 

secret이 정상적으로 등록되었는지는 다음과 같이 확인할 수 있습니다. AGE가 61s인 11번째 라인을 봐주세요.

$ kubectl get secrets -n transformer
NAME                                       TYPE                                  DATA   AGE
airflow-airflow-metadata                   Opaque                                1      6d17h
airflow-broker-url                         Opaque                                1      6d17h
airflow-create-user-job-token-dqrtb        kubernetes.io/service-account-token   3      6d17h
airflow-fernet-key                         Opaque                                1      6d17h
airflow-migrate-database-job-token-brzc2   kubernetes.io/service-account-token   3      6d17h
airflow-postgresql                         Opaque                                1      6d17h
airflow-redis-password                     Opaque                                1      6d17h
airflow-scheduler-token-nr48l              kubernetes.io/service-account-token   3      6d17h
airflow-ssh-secret                         Opaque                                3      61s
airflow-statsd-token-vqm4s                 kubernetes.io/service-account-token   3      6d17h
airflow-triggerer-token-pqncl              kubernetes.io/service-account-token   3      6d17h
airflow-webserver-secret-key               Opaque                                1      6d17h
airflow-webserver-token-b7fp2              kubernetes.io/service-account-token   3      6d17h
airflow-worker-token-tb5k2                 kubernetes.io/service-account-token   3      6d17h
default-token-nw9jq                        kubernetes.io/service-account-token   3      6d17h
sh.helm.release.v1.airflow.v1              helm.sh/release.v1                    1      6d17h
sh.helm.release.v1.airflow.v2              helm.sh/release.v1                    1      6d17h
sh.helm.release.v1.airflow.v3              helm.sh/release.v1                    1      50s

 

이제 values.yaml 파일을 수정해줍시다. 위와 마찬가지로 코드 전체를 첨부합니다. dags.gitSync.repo 부분만 각자의 경로에 맞게 설정해주면 나머지는 그대로 복사하셔도 됩니다.

# Git sync
dags:
  persistence:
    # Enable persistent volume for storing dags
    enabled: false
    # Volume size for dags
    size: 1Gi
    # If using a custom storageClass, pass name here
    storageClassName:
    # access mode of the persistent volume
    accessMode: ReadWriteOnce
    ## the name of an existing PVC to use
    existingClaim:
  gitSync:
    enabled: true

    # git repo clone url
    # ssh examples ssh://git@github.com/apache/airflow.git
    # git@github.com:apache/airflow.git
    # https example: https://github.com/apache/airflow.git
    repo: ssh://git@github.com/foo/bar.git
    branch: main
    rev: HEAD
    depth: 1
    # the number of consecutive failures allowed before aborting
    maxFailures: 0
    # subpath within the repo where dags are located
    # should be "" if dags are at repo root
    subPath: ""
    # if your repo needs a user name password
    # you can load them to a k8s secret like the one below
    #   ---
    #   apiVersion: v1
    #   kind: Secret
    #   metadata:
    #     name: git-credentials
    #   data:
    #     GIT_SYNC_USERNAME: <base64_encoded_git_username>
    #     GIT_SYNC_PASSWORD: <base64_encoded_git_password>
    # and specify the name of the secret below
    #
    credentialsSecret: git-credentials
    #
    #
    # If you are using an ssh clone url, you can load
    # the ssh private key to a k8s secret like the one below
    #   ---
    #   apiVersion: v1
    #   kind: Secret
    #   metadata:
    #     name: airflow-ssh-secret
    #   data:
    #     # key needs to be gitSshKey
    #     gitSshKey: <base64_encoded_data>
    # and specify the name of the secret below
    sshKeySecret: airflow-ssh-secret
    #
    # If you are using an ssh private key, you can additionally
    # specify the content of your known_hosts file, example:
    #
    # knownHosts: |
    #    <host1>,<ip1> <key1>
    #    <host2>,<ip2> <key2>
    # interval between git sync attempts in seconds
    wait: 60
    containerName: git-sync
    uid: 65533

    # When not set, the values defined in the global securityContext will be used
    securityContext: {}
    #  runAsUser: 65533
    #  runAsGroup: 0

    extraVolumeMounts: []
    env: []
    resources: {}
    #  limits:
    #   cpu: 100m
    #   memory: 128Mi
    #  requests:
    #   cpu: 100m
    #   memory: 128Mi

 

이제 끝입니다. 변경한 설정을 우리 EKS 환경에 적용시켜 줍시다. 앞선 페이지의 연장이므로 namespace는 transformer입니다.

$ helm upgrade --install airflow apache-airflow/airflow -n transformer -f values.yaml --debug

 

airflow webserver 접속을 위해 포트 포워딩을 열어줍시다.

$ kubectl port-forward svc/airflow-webserver 8080:8080 --namespace transformer

 

그리고 접속해보면 다음과 같이 Dag 파일이 확인됩니다!

비록 DAG 이름은 가렸지만 정상적으로 동기화 됐습니다

 

 

여기까지 진행하셨다면 수고 많으셨습니다. 끝으로 처음 gitSync를 설정할 때 궁금했던 내용을 아래처럼 정리해둡니다. 누군가에게는 도움이 되겠죠? :) 

 

소스코드가 GitHub과 동기화되는 시점은 언제일까?

values.yaml 파일에 보면 wait 부분이 있습니다. 설명에 보면 interval between git sync attempts in seconds라고 되어 있죠. 거기 설정된 주기마다 sync를 맞춥니다. 짧게 하면 빠르게 동기화될 테지만 소스코드를 내려받는 네트워크 트래픽이 그만큼 빈번하게 발생할 테니 repository에 있는 소스코드의 크기나 상황에 맞게 설정하면 좋을 듯합니다

 

requirements.txt 설치는 언제/어떻게 되는 거지?

아직 정확한 해답은 찾지 못했습니다. 다만 유사한 질문을 찾아 여기 남겨놓습니다. 링크 안에 내용을 살펴보면 dags.installRequirements 설정이 true라면 pod가 시작될 때 requirements.txt가 설치될 것이고, dags.initContainer.enabledtrue로 설정하면 initContainer에서 설치할 수 있다고 하네요. 

 

dags.persistence ?

아직 정확히 어떤 역할인지 잘 모르겠습니다 ( 업데이트 예정 )

 


# Ref.

 

'개발 > Apache Airflow' 카테고리의 다른 글

KubernetesExecutor 적용  (0) 2022.05.23
EKS 위에 Airflow 구성  (0) 2022.05.23
airflow 파라미터 튜닝  (6) 2021.07.05
docker-compose로 Airflow 한방에 설치하기  (0) 2021.06.21
Hello, Apache Airflow  (4) 2021.06.16
댓글
댓글쓰기 폼