【Airflow on Kubernetes】メタデータDBをデフォルトのPostgreSQLからMySQLに変更する

## 概要
Airflowのメタデータを管理するDBを、デフォルトのPostgreSQLからMySQLに変更する。

## 目次
- [【Airflow on Kubernetes】目次](https://qiita.com/Esfahan/items/cd6b3dc0f724b84361d2)

## 事前準備
MySQLの用意については触れないので、別途用意してください。
また、事前に`airflow`という名前のDBを作成しておいてください。

- [CentOS6 or 7にMySQL5.6 or 5.7のインストール](https://qiita.com/Esfahan/items/83200c64de8d826677b5)
- [DockerのMySQLコンテナに外部のサーバーから接続する](https://qiita.com/Esfahan/items/70047ea2e4fecab4e2cc)

### 変更方法
以下のファイルの`sql_alchemy_conn`を変更する。
[scripts/ci/kubernetes/kube/secrets.yaml#L25](https://github.com/apache/airflow/blob/master/scripts/ci/kubernetes/kube/secrets.yaml#L25)

デフォルトで設定されている`sql_alchemy_conn`の値は、
`postgresql+psycopg2://root:root@postgres-airflow:5432/airflow`をbase64エンコードしたもの。

### エンコード
base64でエンコードし、上記のsecrets.yamlの`sql_alchemy_conn`の部分を書き換える。
今回は、以下の接続情報をエンコードする。

| key | value |
| --- | --- |
| user | root |
| password | Password_123 |
| host | mysql-airflow |
| port | 3306 |
| db | airflow |

Pythonでエンコード。

```console
$ python
>>> import base64
>>> # Encode
...
>>> text = 'mysql+pymysql://root:Password_123@mysql-airflow:3306/airflow'
>>> encoded = base64.b64encode(text)
>>> print(encoded)
bXlzcWwyOi8vcm9vdDpQYXNzd29yZF8xMjNAbXlzcWwtYWlyZmxvdzo0NjY0Ni9haXJmbG93
>>>
>>> # Decode
...
>>> decoded = base64.b64decode(encoded)
>>> print(decoded)
mysql2://root:Password_123@mysql-airflow:46646/airflow
>>> quit()
```

### secrets.yaml変更
[scripts/ci/kubernetes/kube/secrets.yaml#L25](https://github.com/apache/airflow/blob/master/scripts/ci/kubernetes/kube/secrets.yaml#L25)を、エンコードしたMySQLの接続情報に書き換える。

```diff:scripts/ci/kubernetes/kube/secrets.yaml
apiVersion: v1
kind: Secret
metadata:
  name: airflow-secrets
type: Opaque
data:
  # The sql_alchemy_conn value is a base64 encoded representation of this connection string:
  # postgresql+psycopg2://root:root@postgres-airflow:5432/airflow
-  sql_alchemy_conn: cG9zdGdyZXNxbCtwc3ljb3BnMjovL3Jvb3Q6cm9vdEBwb3N0Z3Jlcy1haXJmbG93OjU0MzIvYWlyZmxvdwo=
+  sql_alchemy_conn: bXlzcWwyOi8vcm9vdDpQYXNzd29yZF8xMjNAbXlzcWwtYWlyZmxvdzo0NjY0Ni9haXJmbG93
```

### DockerイメージにPyMySQLを追加
Airflowでpymysqlを使うためには、PyMySQLというpipモジュールをインストール必要がある。
[scripts/ci/kubernetes/docker/Dockerfile#L41](https://github.com/apache/airflow/blob/master/scripts/ci/kubernetes/docker/Dockerfile#L41)に以下を追記。

```Dockerfile:scripts/ci/kubernetes/docker/Dockerfile
RUN pip install PyMySQL
```

### Dockerイメージをビルド
[scripts/ci/kubernetes/docker/build.sh](https://github.com/apache/airflow/blob/master/scripts/ci/kubernetes/docker/build.sh)を実行しDockerイメージを作成する。

```
$ sudo ./scripts/ci/kubernetes/docker/build.sh
```

### Podを起動
postgresのコンテナを起動する必要はないので、[scripts/ci/kubernetes/kube/deploy.sh](https://github.com/apache/airflow/blob/master/scripts/ci/kubernetes/kube/deploy.sh)の以下のpostgresの部分を修正し、Podを起動する。

```sh:scripts/ci/kubernetes/kube/deploy.sh
$ git diff deploy.sh
diff --git a/deploy.sh b/deploy.sh
index e3d19d2..4a79e14 100755
--- a/deploy.sh
+++ b/deploy.sh
@@ -189,7 +189,7 @@ set -e

 kubectl apply -f $DIRNAME/secrets.yaml
 kubectl apply -f $BUILD_DIRNAME/configmaps.yaml
-kubectl apply -f $BUILD_DIRNAME/postgres.yaml
+#kubectl apply -f $BUILD_DIRNAME/postgres.yaml
 kubectl apply -f $BUILD_DIRNAME/volumes.yaml
 kubectl apply -f $BUILD_DIRNAME/airflow.yaml

@@ -220,7 +220,8 @@ do
   echo "$PODS"
   NUM_AIRFLOW_READY=$(echo $PODS | grep airflow | awk '{print $2}' | grep -E '([0-9])\/(\1)' | wc -l | xargs)
   NUM_POSTGRES_READY=$(echo $PODS | grep postgres | awk '{print $2}' | grep -E '([0-9])\/(\1)' | wc -l | xargs)
-  if [ "$NUM_AIRFLOW_READY" == "1" ] && [ "$NUM_POSTGRES_READY" == "1" ]; then
+  #if [ "$NUM_AIRFLOW_READY" == "1" ] && [ "$NUM_POSTGRES_READY" == "1" ]; then
+  if [ "$NUM_AIRFLOW_READY" == "1" ]; then
     PODS_ARE_READY=1
     break
   fi
```

Podを起動。

```
$ sudo ./scripts/ci/kubernetes/kube/deploy.sh -d {persistent_mode,git_mode}
```

## 確認
### DB
MySQLにログインして、airflowのDBの中にテーブルが作成されていることを確認。

### WEB UI
ブラウザから確認。ページが見れればOK。