raspiでk3sクラスタを構築してairflowをデプロイしてみた

### 概要

以下の構成でraspiでk3sクラスタを構築しその上にairflowをデプロイしたのでメモ


#### 前提知識
- k3s
    - 概要:
K3s は、その小 さなシングルバイナリ、ネイティブ ARM サポート、および本番環境に適した高可用性アーキテクチャに より、エッジシステムでクラスターを自動初期化および維持する理想的な Kubernetes ディストリビュー ションです。([公式サイト参照](https://www.rancher.co.jp/pdfs/K3s-eBook4Styles0507.pdf))
    - 採用理由:
      k8sをkubeadmなどを利用してインストールするよりも簡便にインストールできるため今回こちらを採用
- airflow
    - 概要:
Apache Airflowは、データエンジニアリングパイプライン用のオープンソースのワークフロー管理プラットフォームである。2014年10月[1]にAirbnbで開発が始まり、ますます複雑化する社内のワークフローを管理するためのソリューション
([wikipedia参照](https://ja.wikipedia.org/wiki/Apache_Airflow))
    - 採用理由:
      業務で触るため...+自宅のnature remoなどのデータを溜め込んでみたいと思っておりバッチ処理をさせるため
- longhorn
    - 概要:
Longhornは複数のサーバ内のストレージをソフトウェアで束ね、仮想的に巨大なストレージを構成。ユーザーはその仮想的なストレージに対してボリュームサイズやIOPS性能、レプリカ数などを指定し、仮想マシンやコンテナにマウントして利用を開始することができます。
([public-keyサイト参照](https://www.publickey1.jp/blog/17/longhornrancher_labs.html))
    - 採用理由:
      k3sではデフォルトだとlocal-pathのストレージを使用する形になっているが、それだと冗長性に難があるので分散ストレージを採用

#### 構成
- サーバー
    - raspi4×4
- OS
    - raspberry Pi OS (32-bit)
- k8sクラスタ
    - k3s:v1.24.14+k3s1

![tmp.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255246/7c308fe8-8f17-a442-a0cc-ce62a7e2b6c0.png)

 

#### 1.raspiのセットアップ
##### 1-1 OSのインストール

Raspberry pi imagerを使い`Raspberry Pi OS (32-bit)`をインストール

##### 1-2 apt upgradeを実行
```
sudo apt upgrade
```

##### 1-3 cgroupの有効化
```
sudo vi /boot/cmdline.txt
```
/boot/cmdline.txt に `cgroup_memory=1 cgroup_enable=memory` を追加

#### 2.k3sのインストール
##### 2-1 control-planeへのk3sインストール
[公式サイト](https://www.rancher.co.jp/pdfs/K3s-eBook4Styles0507.pdf)のインストール手順をもとにcontrol-planeをインストール

※longhornがk8sのv1.2.5に1.2.5に対応していないためk3sもそれ以前のバージョンを指定している
```
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.24.14+k3s1 sh -
```

##### 2-2 worker-nodeへのk3sインストール

同じく公式サイトのインストール手順を元にworker-nodeをインストール
```
 curl -sfL https://get.k3s.io |   INSTALL_K3S_VERSION=v1.24.14+k3s1   K3S_URL=https://{Controll-Planeのip}:6443   K3S_TOKEN={TOKEN}   sh -
```
#### 3.helmのインストール
[公式サイト](https://helm.sh/ja/docs/intro/install/)のスクリプトからのインストール方法を選択
https://helm.sh/ja/docs/intro/install/
```
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh
```

#### 4.longhornのインストール
##### 4-1.longhornのインストール
下記のコマンドでlonghornをインストールする
 ```
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.3.0/deploy/longhorn.yaml
```

##### 4-2 longhornをデフォルトStorageClassに設定
[こちらの記事](https://qiita.com/hk220/items/bd7887fe407c1d5427e2)を参考にデフォルトのStorageClassを変更

#### 5.airflowのインストール
control-planeにて下記のコマンドを実行。
[公式サイト](https://airflow.apache.org/docs/helm-chart/stable/index.html)のhelmを使用。執筆時点で最新のv1.9.0をインストール
```
helm repo add apache-airflow https://airflow.apache.org
helm upgrade --install airflow apache-airflow/airflow --namespace airflow --create-namespace
```

#### 6. uiへのアクセス
control-planeで以下のコマンドを実行し、同一NWの端末からブラウザでhttp://{control-planeのip}:8080へアクセス。
```
 kubectl port-forward svc/airflow-webserver 8080:8080 --address="0.0.0.0" -n airflow
```

下記のUIが表示されるのでid/passを入れてログイン(デフォルトだとadmin/adminになっている)
![スクリーンショット 2023-06-04 18.53.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255246/b4fc8540-08d1-9b08-37d1-536d02c068e6.png)