結合Google Cloud Storage將Airflow KubernetesExecutor運行的log給持久化

Posted by Kubeguts on 2021-05-30

由於tasks都透過pod來運行了,若沒有特別設置Volume等動作將運行的log儲存在本地端,等到tasks都跑完了但卻發生錯誤,這時因為pod在運行完畢也跟著被刪除,log資料也會跟著不見,這時候就摸不著頭緒到底task發生什麼狀況!!!

所以這篇也會分享如何將log存到Google Cloud Storage內,並且能夠在檢視task log時,可以看到運行的結果

若還沒有使用過Airflow KubernetesExecutor的讀者們,建議先看這篇使用Airflow-KuberenetesPodOperator與KubernetesExecutor
再過來繼續服用本篇

使用的Airflow版本為 : 2.1.0

設定Google Cloud Storage

來到Google Cloud的portal,點擊 cloud storage

img01

建立一個值區 (bucket),用來儲存資料

img02

並替這個值區命名,其他的就先依照預設的設定就好

img03

可以看到bucket已經創建完畢

img06

儲存到該bucket的路徑為 : gs://airflow_bucket_1234

接著透過 gsutil 測試一下是否可以將檔案上傳到 gs://airflow_bucket_1234

1
gsutil cp -r {local_file_path} gs://{bucket-name}/{gcs_file_path}

local_file_path建議用絕對路徑

接著會看到權限認證的問題,表示新增完畢的bucket有限制存取

1
2
3
4
gsutil cp -r /Users/xxxxx/xxxxx gs://airflow_bucket_1234
Copying file:///Users/xxxxx/xxxxx
[Content-Type=application/octet-stream]...
AccessDeniedException: 403 xxxxxx@gmail.com does not have storage.objects.create access to the Google Cloud Storage object.

開放GCS bucket的權限給特定身份

接著我們來產生一個給airflow使用的帳戶

請到 IAM與管理 > 服務帳戶,新增一個給airflow使用的帳戶

img08

只給airflow具備GCS的存取存限

img10

img09

建立完畢後,可以看到新產生的airflow帳戶,接著進入該帳戶產生一把金鑰供airflow使用

img11

img12

img13

img14

新增完畢後,就會自動下載到本機,key的內容大概會長如下

supple-bank-315301-a8f556f62bb8.json

1
2
3
4
5
6
7
8
9
10
11
12
{
"type": "service_account",
"project_id": "supple-bank-315301",
"private_key_id": "a8f556f62bb8de28ce6e86b18010799595117e8e",
"private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDHHLRw07Cik+Wp\n163R2z9k7U/gSaA+lE4Z6tYcbkkxnjtqVnw/3FiUbSaVmGp6yeAbPK0Vosir7LF7\nhiZlS65VKWX0so7uEmr2mh5fcPtXtzFg0VT+FS1izwcXOpKECFBKy4ILcdakgvo7\nmaJnv54A8xbNcqUFsxFrjNpdEG/gttK4ZH7GsVWgy33gOdMCSoU60xO1fY7YE7UK\nlA0ZGy+FfiOvj2Mv2m/2+iTRoFiTDZedEJIMFIRryuvdd4H1XzrC9Co3fY9LQPxd\n799NkPOupp8GiwxjE/yAFLbOr7Y+Br166UZWlRQuUmMD8KAyAsVq/XUvSJy/KQif\n+wQSxSf1AgMBAAECggEAD2U4ISPdG9T/rwWO2mkaGmhXAr/un1LBmd4UjBeNmaa3\nfYi5DAmyN60bjKQ/p3AwidVD33u6CcEVarhRWQe5r7qxuB04+/jPQx4LjH755YBe\nqwkZ30OCl4nrwcS09iHbw3dqKLm2n6XDn2lzqz31A5xy05PdD/cWjmWnr1vJVWs/\nyDh1KhEq1C/FaL/p7tCdhwVQROwlWO6K8O05OEw97QRScyk6LYvWh+/vV9shwjxc\nuZPvUHZipJ2EnJ07X9NSXHLTRv4CCwU6sbx6TGlCZ1YSwW1u3BVYhp4zDuS+m6OV\nQZOpahKQdojhksvD3o29WHNnWakMwPTYMVCIyYGCSQKBgQDwZwWLf7PTJcdBxhne\nJwsrOqjrdsGAo6rbPSg/5TLed79Z/tf1tz2Pc6uRWPZnn7SafmSMZWDy9CjEHbLW\nCNa3TYnLiVoILr5IyAUJL5X44eSdwnEPhM0492JYZmoy7jKcHT+GmZJGaeGQ2yAr\nhyLiChlg0DUIuV8TF3OiTzt8TwKBgQDUB96YFGLxDNmS5hLA0WtAsRwDjkyHMgYb\nrFbYaJwfJN7pYBp6xO4tFBKg9C1hEZ6fqVT7bRcrvM21Uk36CpL6fp4VCCIyFdhU\ndXVKzmrbPtdAk1crXuw8Rx6H6baABogjIECM9m+hOIjLpFFZKy47gkNv5Ji6Jdaz\nCpjbR0cyewKBgQDU26NBPTVQA+dGCc3lsdRl1m6y7levOzuRG7mDucEs0gKQAOHf\nIvxTBCwpagfjALm9AaSt2yXYeO+Plmw+r1zOuM0FdvxMunapotEyrPuxfvIZ7YyG\nHSRJCGH/u87Ugaw2Jn+VAm1OA3pB9IOrhuAQHLkTy8bpjpjsIpu0X0tgaQKBgQC0\nXE1ZCF5xtgCOGO/y3TFiwkWWMMGgb0kK2Tq2s6W6SF7mHj3oGQSRi/WcvJitbZOF\nNUF47n87UUua5fw2qjAErRhDw7ty52oxzgiMLbJv9bCc2bjYx9IkJEswSfpYRTYg\nyxqdzjN+7NxQfeJE+5pEPLaow8e28OEFRApq3OMPaQKBgC5SDSYHAfN+aWIBtxqG\n90Nl5PO4LGk40Fh6rneKysUZ13J+M8rBWW+U0wk9ykBqa3pdmWW7qDa3qFRipbTs\nPAgaG55yBODuLGHMnXVPbZa6uAeWyLS177Ft0i+iLpWoB8wpq8xMeK4Y/XOkPm6e\nKTnUI5APWx1K5KIWieL3KnNl\n-----END PRIVATE KEY-----\n",
"client_email": "airflow@supple-bank-315301.iam.gserviceaccount.com",
"client_id": "105233422255710271333",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/airflow%40supple-bank-315301.iam.gserviceaccount.com"
}

設定Airflow連接GCS

需要透過 airflow.cfg這個檔案來設置可以進行remote logging的動作,也就是將log儲存到GCS上,airflow.cfg位於 $AIRFLOW_HOME目錄底下

airflow.cfg的 [logging]這邊,進行以下設置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[logging]
# 原本儲存log的目錄
base_log_folder = /opt/airflow/logs

# 打開可以遠端儲存log
remote_logging = True

# 使用gcs
remote_log_conn_id = google_cloud_default

# 指定可以存取gcs的key放到這個目錄底下
google_key_path = /{your key path}/key.json

# 指定要儲存的bucket
remote_base_log_folder = gs://{your bucket path}

記得將剛剛產生的gcs key,放到 google_key_path內!

檢視pod與gcs的互動

設定完畢airflow.cfg與放置好給airflow使用的gcs_key.json 金鑰檔案後,
記得重啟airflow,並且再回到 k8sexecutor_example 這個範例重新執行dag task.

img15

執行完畢後,來到gcs內,可以看到有個目錄產生,這麼目錄名稱就是本次執行dag的名稱,且每個task的log都會各自以自己名稱的目錄儲存起來

img18
img19

點擊task_with_podtemplate這個task的log,可以查看到已經成功從 gs://airflow_bucket_1234讀取到剛剛執行的log!

img16

img17

若要調整每次log寫入的細節設定,可以在airflow.cfg檔案內的 [logging]中

對log_format與log_filename_template做調整

參考