자체 관리형 Airflow 웹 서버 배포

이 페이지에서는 Airflow 웹 서버를 Cloud Composer 환경의 Kubernetes 클러스터에 배포하는 방법을 설명합니다. 다음과 같은 경우 이 가이드를 참조하세요.

  • Airflow 웹 서버가 배포되는 위치를 제어해야 하는 경우
  • 온프레미스 시스템 인증과 같이 일관된 IP 주소 집합에서 DAG를 가져와야 하는 경우

시작하기 전에

  • Google Kubernetes Engine에 워크로드를 배포하는 방법을 숙지합니다.
  • Cloud SDK를 설치합니다.
  • Cloud Composer 환경을 만듭니다.
  • Airflow 웹 서버를 기본 웹 서버보다 vCPU가 적고 Airflow 작업자와 공유되는 작업자 머신 유형에 배포합니다. 부하 크기에 따라 워커 노드의 수를 늘려야 할 수도 있습니다.
  • Cloud Composer 가비지 컬렉션은 이전 이미지를 삭제할 수 있습니다. 패키지를 설치하거나 버전을 업그레이드할 때마다 스케줄러 및 작업자가 실행 중인 이미지와 웹 서버 이미지 경로/태그를 동기화하는 것이 가장 좋습니다. 이렇게 하려면 스케줄러 pod 구성에서 이미지 이름을 검색하고 해당 값을 사용하여 자체 관리 웹 서버를 업데이트합니다.

Cloud Composer 환경의 GKE 클러스터 결정

gcloud composer environments describe 명령어를 사용하여 GKE 클러스터를 비롯한 Cloud Composer 환경의 속성을 표시합니다.

클러스터가 gkeCluster로 나열됩니다. location 속성의 마지막 부분을 확인하여(config > nodeConfig > location) 클러스터가 배포된 영역(예: us-central1-b)도 기록합니다.

gcloud composer environments describe ENVIRONMENT_NAME \
    --location LOCATION 

각 매개변수는 다음과 같습니다.

  • ENVIRONMENT_NAME은 환경 이름입니다.
  • LOCATION은 환경이 위치한 Compute Engine 리전입니다.

이제 이 문서에서는 클러스터를 ${GKE_CLUSTER}로, 영역을 ${GKE_LOCATION}으로 나타냅니다.

GKE 클러스터에 연결

gcloud를 사용하여 kubectl 명령어를 클러스터에 연결합니다.

gcloud container clusters get-credentials ${GKE_CLUSTER} --zone ${GKE_LOCATION}

스케줄러의 Pod 구성 가져오기

Airflow 웹 서버는 Airflow 스케줄러와 동일한 Docker 이미지를 사용하므로 스케줄러 pod의 구성을 가져와 시작점으로 사용합니다.

kubectl get pods --all-namespaces

airflow-scheduler-1a2b3c-x0yz와 같은 이름의 pod를 찾습니다. 스케줄러 pod의 구성을 가져와서 airflow-webserver.yaml에 작성합니다.

kubectl get pod -n NAMESPACE airflow-scheduler-1a2b3c-x0yz -o yaml --export > airflow-webserver.yaml

여기에서 NAMESPACE는 스케줄러 pod가 실행되는 네임스페이스입니다(예: composer-1-7-2-airflow-1-9-0-4d5e6f).

웹 서버 배포 구성 만들기

일반 텍스트 편집기에서 airflow-webserver.yaml을 수정하여 웹 서버 배포 구성을 만듭니다.

  1. apiVersion, kind, metadata 섹션(spec까지)을 배포 구성으로 바꿉니다.

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: airflow-webserver
      labels:
        run: airflow-webserver
    spec:
      replicas: 1
      selector:
        matchLabels:
          run: airflow-webserver
      strategy:
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 1
        type: RollingUpdate
      template:
        metadata:
          labels:
            run: airflow-webserver
    
  2. 라벨 및 이름에서 airflow-schedulerairflow-webserver로 바꿉니다. 참고: 웹 서버 컨테이너 이미지는 변경되지 않습니다. 동일한 이미지가 작업자, 스케줄러, 웹 서버에 사용됩니다.

  3. status 섹션을 삭제합니다.

  4. 기존 spec 섹션을 들여쓰기하여 spectemplate 섹션의 키로 사용합니다.

  5. - args: 섹션에서 - scheduler- webserver로 바꿉니다.

  6. livenessProbe 섹션을 상태 엔드포인트를 폴링하는 섹션으로 바꿉니다.

            livenessProbe:
              exec:
                command:
                - curl
                - localhost:8080/_ah/health
    

웹 서버 서비스 구성 만들기

airflow-webserver-service.yaml이라는 서비스 구성 파일을 만듭니다.

apiVersion: v1
kind: Service
metadata:
  name: airflow-webserver-service
  labels:
    run: airflow-webserver
spec:
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    run: airflow-webserver
  sessionAffinity: None
  type: ClusterIP

웹 서버 배포

  1. 웹 서버 pod를 배포합니다.

    kubectl create -n NAMESPACE -f airflow-webserver.yaml
    
  2. 웹 서버 서비스를 배포합니다.

    kubectl create -n NAMESPACE -f airflow-webserver-service.yaml
    

웹 서버에 연결

배포는 ClusterIP를 사용하므로 프록시를 사용하지 않고는 Kubernetes 클러스터 외부에서 웹 서버에 액세스할 수 없습니다.

  1. 웹 서버 pod를 찾습니다.

    kubectl get pods --all-namespaces
    
  2. 웹 서버 포트를 로컬 머신으로 전달합니다.

    kubectl -n NAMESPACE port-forward airflow-webserver-1a2b3cd-0x9yz 8080:8080
    
  3. http://localhost:8080/admin/의 웹브라우저에서 Airflow 웹 서버를 엽니다.

다음 단계