OKE + Airflow ことはじめ

2022年11月2日 Oracle Cloud Hangout Cafe Season6 #3 [「ワークフローツールで楽々Job管理」](https://ochacafe.connpass.com/event/260559/) で実施したデモをベースに Oracle Container Engine for Kubernetes (OKE) + Airflow の環境構築から公式チュートリアルを実行しながら、 Airflow の最初の一歩を踏み出してみましょう。

以下、スライド資料と公開動画を合わせてご利用頂くとより理解が深まると思います。

- [スライド資料](https://speakerdeck.com/oracle4engineer/20221102-workflow?slide=56)
- [公開動画](https://www.youtube.com/watch?v=flVGZhPOFWQ&t=3546s)

# What is Airflow ?

Airflow は、オープンソースのワークフロー管理プラットフォームです。2014年に Airbnb 社が開発した OSS であり、2016年から Apache Software Foundation のプロジェクトになりました。Python と DAG ベースにワークフローを表現できることが特徴です。

[Airflow](https://airflow.apache.org/)

# DEMO Environment

以下の環境を構築して、実施します。

- Kubernetes Cluster : Oracle Container Engine for Kubernetes
- Node Shape (3 Nodes) : VM.Standard.E3.Flex
- Airflow : v2.4.1

# OKE Set Up

OKE のプロビジョニングについては、以下チュートリアルを参考にしてください。

[Oracle Container Engine for Kubernetes(OKE)をプロビジョニングしよう](https://oracle-japan.github.io/ocitutorials/cloud-native/oke-for-commons/)

# Airflow Set Up

## 1.Airflow Install

Airflow は、PyPi, Docker, Helm を利用してインストールできます。ここでは、Helm を利用します。

事前に Helm クライアントをインストールが必要となります。

Oracle Cloud Infrastructure(OCI) の場合は、Cloud Shell を利用することで Helm クライアントのインストールは不要です。

```sh
helm repo add apache-airflow https://airflow.apache.org
```

```sh
helm repo update
```

```sh
helm install airflow apache-airflow/airflow --create-namespace --namespace airflow
```
```sh
NAME: airflow
LAST DEPLOYED: Sun Oct 16 13:30:17 2022
NAMESPACE: airflow
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thank you for installing Apache Airflow 2.4.1!

Your release is named airflow.
You can now access your dashboard(s) by executing the following command(s) and visiting the corresponding port at localhost in your browser:

Airflow Webserver:     kubectl port-forward svc/airflow-webserver 8080:8080 --namespace airflow
Default Webserver (Airflow UI) Login credentials:
    username: admin
    password: admin
Default Postgres connection credentials:
    username: postgres
    password: postgres
    port: 5432

You can get Fernet Key value by running the following:

    echo Fernet Key: $(kubectl get secret --namespace airflow airflow-fernet-key -o jsonpath="{.data.fernet-key}" | base64 --decode)

###########################################################
#  WARNING: You should set a static webserver secret key  #
###########################################################

You are using a dynamically generated webserver secret key, which can lead to
unnecessary restarts of your Airflow components.

Information on how to set a static webserver secret key can be found here:
https://airflow.apache.org/docs/helm-chart/stable/production-guide.html#webserver-secret-key
```

7個の Pod が Running であることを確認します。

```sh
kubectl get pods -n airflow
```
```sh
NAME                                 READY   STATUS    RESTARTS   AGE
airflow-postgresql-0                 1/1     Running   0          2m46s
airflow-redis-0                      1/1     Running   0          2m46s
airflow-scheduler-5754fc7746-cdkvb   2/2     Running   0          2m47s
airflow-statsd-5b4964646f-nqqzc      1/1     Running   0          2m47s
airflow-triggerer-7795dfffcb-ln22d   1/1     Running   0          2m47s
airflow-webserver-7bf76fd7fc-qccj5   1/1     Running   0          2m47s
airflow-worker-0                     2/2     Running   0          2m46s
```

## 2.Airflow UI Access

Service としてインストールされる argo-workflow-service の type を LoadBalancer に変更して、ブラウザからアクセスできるようにします。

```sh
kubectl edit service/airflow-webserver -n airflow
```
```sh
・
・ ＜省略＞
・
  selector:
    component: webserver
    release: airflow
    tier: airflow
  sessionAffinity: None
  type: ClusterIP # type: LoadBalancer に変更
・
・ ＜省略＞
・
```

EXTERNAL-IP を確認

```sh
kubectl get service airflow-webserver -n airflow
```
```sh
NAME                TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)          AGE
airflow-webserver   LoadBalancer   10.96.110.188   144.xxx.xxx.xxx   8080:31703/TCP   4h5m
```

ブラウザを起動して、UI にアクセスします。

http://144.xxx.xxx.xxx:8080/

![34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61606/ae70e331-7e67-49a0-44f0-6e44d4677855.png)

Default Username : admin  
Default Password : admin

ログイン完了です。

![35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61606/39062fd4-4fa4-b298-36c9-f3cb65f6ace5.png)

## 3.サンプルワークフローのロード設定

チュートリアルを含めた、サンプルワークフローを読み込むことができるので有効化します。

values.yaml ファイルを書き出して、編集します。

```sh
helm show values apache-airflow/airflow > values.yaml
```

extraEnv の箇所を以下内容に変更します。

```sh
vim values.yaml
```
```sh
・
・ ＜省略＞
・
extraEnv: |
　- name: AIRFLOW__CORE__LOAD_EXAMPLES
　　value: 'True'
・
・ ＜省略＞
・
```

変更した values.yaml を適用します。

```sh
helm upgrade --install airflow apache-airflow/airflow -n airflow -f values.yaml
```
```sh
Release "airflow" has been upgraded. Happy Helming!
NAME: airflow
LAST DEPLOYED: Mon Oct 17 06:00:39 2022
NAMESPACE: airflow
STATUS: deployed
REVISION: 3
TEST SUITE: None
NOTES:
Thank you for installing Apache Airflow 2.4.1!

Your release is named airflow.
You can now access your dashboard(s) by executing the following command(s) and visiting the corresponding port at localhost in your browser:

Airflow Webserver:     kubectl port-forward svc/airflow-webserver 8080:8080 --namespace airflow
Default Webserver (Airflow UI) Login credentials:
    username: admin
    password: admin
Default Postgres connection credentials:
    username: postgres
    password: postgres
    port: 5432

You can get Fernet Key value by running the following:

    echo Fernet Key: $(kubectl get secret --namespace airflow airflow-fernet-key -o jsonpath="{.data.fernet-key}" | base64 --decode)

###########################################################
#  WARNING: You should set a static webserver secret key  #
###########################################################

You are using a dynamically generated webserver secret key, which can lead to
unnecessary restarts of your Airflow components.

Information on how to set a static webserver secret key can be found here:
https://airflow.apache.org/docs/helm-chart/stable/production-guide.html#webserver-secret-key
```

ステータスを確認します。

```sh
 helm ls -n airflow
```
```
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
airflow airflow         3               2022-10-17 06:00:39.789334761 +0000 UTC deployed        airflow-1.7.0   2.4.1 
```

以下のようにサンプルワークフローがリスト表示されます。

![36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61606/ea2150fb-365e-0444-de5d-ad61b1293966.png)

# Airflow Demo

読み込んだサンプルワークフローの tutorial ワークフローを実施します。

print_date タスクは、Airflow の BashOperator から date コマンドを実行、sleep タスクは5秒間 sleep 、templated は、Airflow の jinja テンプレートコードを実行するタスクです。

![37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61606/b1ad7ee9-6cca-219b-2294-a4096b1540fa.png)

サンプルワークフロー tutrial を有効化して、テキストリンクをクリックします。

![38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61606/e6df4b06-fd31-03a5-9d40-121e9cdede8b.png)

画面右上部にある実行ボタンをクリックして、Trigger Dag を選択します。

![39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61606/d2d01039-3569-ccb0-c123-5b353ce3a94b.png)

![40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61606/22b98ddc-ff23-ad4d-dfe4-bdf32c0e37c6.png)

各タスクの緑四角をクリックすると右側に詳細情報が表示されます。
Logs クリックします。

![41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61606/2c18640b-8b62-385f-33ea-7b127411f499.png)

print_date タスクの date コマンド実行結果を確認できます。

![42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61606/fec6af25-52bd-1149-6c5f-70d3a65ddf59.png)

sleep タスクの結果は以下となります。

![43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61606/2e16324f-5bf2-3f78-cae7-6ca847e546b3.png)

templated タスクの結果は以下となります。

![44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61606/8ad9882a-a299-d734-514d-7b313b7265d5.png)

上部メニューの Code ボタンをクリックして、tutorial ワークフローのソースコードが表示されるので、templated タスクの jinja テンプレートコードを確認してみます。

![45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61606/bffaea88-c27b-a1f0-7ab8-fc91e3001ae5.png)

実装内容は以下となります。

![46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61606/98d666ec-d2ba-7407-ebdc-30e020e28f1f.png)

実行ログと照らし合わせてみます。

![47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61606/babf5e60-6589-ea2f-fa1e-7e77e6ca8cfd.png)