kindを使ったKubeflow Pipelinesの環境構築方法について

## はじめに

今回は、できる限りMac環境を汚さずkindを活用してKubeflow Pipelinesを構築する手順を解説します。
Kubeflow Pipelinesとは、機械学習のワークフローを簡単に構築、実行、管理できるオープンソースのツールです。一方で、Kubernetesはコンテナ化されたアプリケーションを効率的に管理するためのプラットフォームであり、Kubeflowはその上で動作します。
「試してみたいけど環境構築が不安」という方に向けて、手順をわかりやすく説明しますので、ぜひご参考ください！

### **前提条件**  
以下のツールが必要です。未インストールの場合はリンク先を参照して準備してください。  
- **Docker Desktop**: [公式サイト](https://www.docker.com/products/docker-desktop/)  
- **kubectl**: Kubernetes CLI ツール ([Homebrewを使用](https://kubernetes.io/docs/tasks/tools/))  
- **kind**: Kubernetes in Docker ツール ([公式サイト](https://kind.sigs.k8s.io/))  

---

### **手順**

#### **1. Docker Desktopのセットアップとリソース調整**
Docker Desktopをインストールしたら、以下のリソース設定を調整してください。Kubernetesを有効化し、リソース不足を防ぎます。

1. **Docker Desktopを起動**  
   メニューバーのDockerアイコンをクリックして設定を開きます。

2. **Kubernetesを有効化**  
   設定画面で「Kubernetes」を選択し、「Enable Kubernetes」を有効にします。
![スクリーンショット 2024-11-22 0.53.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/0c9d01ba-96bf-fa26-8acd-c368608d1e08.png)

3. **リソース調整**  
   「Resources」タブを選択して、以下を設定：
   - **CPU:** 4 Core 以上  
   - **Memory:** 8GB 以上  
   - **Swap:** 2GB 以上  
![スクリーンショット 2024-11-22 0.52.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/236debd3-97a0-9478-8eec-0129773725d2.png)

4. **設定の適用**  
   「Apply & Restart」をクリックしてDockerを再起動します。

---

#### **2. kindのインストール**
`kind`（Kubernetes in Docker）を使用してKubernetesクラスタを構築します。

1. **公式バイナリを手動でダウンロード**  
   ターミナルで以下を実行してkindをダウンロードします：
   ```bash
   curl -Lo ./kind "https://kind.sigs.k8s.io/dl/v0.20.0/kind-darwin-amd64"
   ```

2. **実行権限を付与**  
   ダウンロードしたバイナリに実行権限を付与します：
   ```bash
   chmod +x ./kind
   ```

3. **バイナリをPATHに移動**  
   `kind` をシステムPATHに移動します：
   ```bash
   sudo mv ./kind /usr/local/bin/kind
   ```

4. **動作確認**  
   `kind` が正しく動作することを確認します：
   ```bash
   kind version
   ```
---

#### **3. Kubernetesクラスタの作成**
以下のコマンドを実行して、Kubernetesクラスタを作成します：
```bash
kind create cluster
```
![スクリーンショット 2024-11-22 0.00.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/5aeead49-ba88-15e8-e709-daba8844d48b.png)
作成には数分かかります。成功すると `kind` が自動的に `kubectl` のコンテキストを設定します。

**クラスタ情報を確認**：
```bash
kubectl cluster-info --context kind-kind
```

![スクリーンショット 2024-11-22 0.01.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/b3804595-0d05-1e27-48f2-55d707224563.png)

## **4. kubectlの動作確認**
`kubectl` が正しく動作するか確認します。

1. **インストール確認**：
   ```bash
   kubectl version --client
   ```
   
   ![スクリーンショット 2024-11-22 0.03.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/14aba019-dc11-697d-05ed-a7ad85ecc587.png)

2. **ノード確認**：
   ```bash
   kubectl get nodes
   ```
   クラスタが正しく作成されていれば、`kind-control-plane` のノードが表示されます。
![スクリーンショット 2024-11-22 0.05.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/b034947b-6a07-a028-b829-3dcda671e920.png)


## **5. Kubeflow Pipelinesのデプロイ**
次に、Kubeflow Pipelines をデプロイします。

1. **クラスター全体のリソースを適用**:
   ```bash
   kubectl apply -k "github.com/kubeflow/pipelines/manifests/kustomize/cluster-scoped-resources?ref=1.8.1"
   ```

2. **パイプライン環境のデプロイ**:
   ```bash
   kubectl apply -k "github.com/kubeflow/pipelines/manifests/kustomize/env/platform-agnostic-pns?ref=1.8.1"
   ```

3. **Podの起動確認**:
   ```bash
   kubectl get pods -n kubeflow
   ```
   すべてのPodが `Running` になるまで待機します。これには数分かかります。
   ![スクリーンショット 2024-11-22 0.37.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/eb72cf48-23fb-8cf6-d9a0-65c8c1966730.png)



## **6. ポートフォワードでUIアクセス**
以下のコマンドを実行して、ブラウザからアクセスできるようにします：

```bash
kubectl port-forward -n kubeflow svc/ml-pipeline-ui 8080:80
```

ブラウザで `http://localhost:8080` にアクセスし、Kubeflow PipelinesのUIが表示されることを確認してください。
![スクリーンショット 2024-11-22 0.39.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364428/bff8d8c5-5bb1-d3b5-549d-27a8bbc8f87d.png)

## 停止方法
以下の手順でリソースを削除または停止できます：
すべてのリソースを削除（完全停止）

現在のリソースをすべて削除します：
```
kubectl delete all --all -n kubeflow
```
### 個別のリソースを停止

必要に応じて特定のPodやサービスのみを停止します：
```
kubectl delete pod <POD_NAME> -n kubeflow
```
または
```
kubectl delete deployment <DEPLOYMENT_NAME> -n kubeflow
```
### クラスタ全体を削除

Kindで作成したクラスタ自体を削除します：
```
kind delete cluster
```

### **ポイント**
- Docker Desktopのリソース割り当てが不足していると、KubernetesやPodの起動が失敗する可能性があります。リソース調整は必須です。
- `kubectl describe pod <POD_NAME> -n kubeflow` を使用して、Podの詳細な状態を確認し、エラー解決に役立ててください。

## 終わりに
以上の手順を通して、Mac環境を汚さずにkindを活用してKubeflow Pipelinesをローカルで構築する方法を解説しました。この方法は、環境設定をシンプルに保ちながら、Kubernetesクラスタを使った開発やテストを行いたい方に最適です。Dockerのリソース設定やPodの状態確認を適切に行うことで、スムーズにセットアップが進むはずです。

ぜひこの記事を参考に、ローカルでKubeflow Pipelinesの実験や学習を進めてみてください！