FluxによるGitOpsの構築

# FluxによるGitOpsの構築

- [序章: はじめに](#序章-はじめに)
  - [GitOpsとは？](#gitopsとは)
  - [Fluxの概要](#fluxの概要)
- [第一章: チュートリアル](#第一章-チュートリアル)
  - [前提条件](#前提条件)
  - [1. Fluxのインストール](#1-fluxのインストール)
  - [2. Fluxの設定](#2-fluxの設定)
  - [3. Railsアプリケーションのデプロイ](#3-railsアプリケーションのデプロイ)
  - [4. Fluxによる変更の検出とデプロイ](#4-fluxによる変更の検出とデプロイ)
- [第二章: トラブルシューティング](#第二章-トラブルシューティング)

## 序章: はじめに

### GitOpsとは？
GitOpsは、Gitリポジトリを真実の唯一の情報源として扱い、そのリポジトリ内のマニフェストに基づいてインフラやアプリケーションのデプロイメントを行う手法です。

### Fluxの概要
Fluxは、Kubernetesクラスタ内で動作するオープンソースのGitOpsツールです。Gitリポジトリの変更を自動的に検出し、それに基づいてKubernetesのリソースを更新します。

## 第一章: チュートリアル

### 前提条件:
1. Kubernetesクラスタが動作していること
2. `kubectl`がインストールされ、クラスタにアクセスできること
3. Gitリポジトリ（例: GitHub）があり、RailsアプリケーションのKubernetesのマニフェストが格納されていること
3. 使用するDocker, docker-composeの設定は [こちら](https://qiita.com/TK_Yudai/items/1f185d27c46106747c88) の記事を参考に作成されていること

### 1. Fluxのインストール:

Fluxをインストールするためのコマンド:

```bash
curl -s https://fluxcd.io/install.sh | sh
```

次に、FluxのカスタムリソースをKubernetesクラスタにデプロイ:

```bash
kubectl apply -f https://github.com/fluxcd/flux2/releases/latest/download/install.yaml
```

### 2. Fluxの設定:

リポジトリをFluxと接続する手順:

```bash
flux bootstrap github \
  --owner=[GITHUB_USERNAME] \
  --repository=[REPO_NAME] \
  --branch=main \
  --path=./kubernetes \
  --personal
```

Flux v2 で `flux bootstrap` コマンドを使用する際にGitHubのPersonal Access Token (PAT)を要求される場合、そのトークンには特定のスコープの権限が必要となります。

以下のスコープの権限が一般的に要求されます:

1. **repo**: この権限により、プライベートリポジトリへのアクセスが可能になります。
2. **read:org**: オーガニゼーションのメンバーシップ情報を読み取ることができます。
3. **write:public_key**: ユーザーの公開鍵またはオーガニゼーションの公開鍵を追加、一覧表示、または削除できます。
4. **read:public_key**: ユーザーの公開鍵またはオーガニゼーションの公開鍵を読み取ることができます。

これらのスコープは、FluxがGitHubのリポジトリをクローンしたり、リポジトリの変更を検知したり、FluxのためのSSH公開鍵をリポジトリに追加したりする際に必要です。

**注意**: トークンを作成する際は、必要な権限だけを付与するように注意してください。不要な権限を付与すると、セキュリティのリスクが高まる可能性があります。また、生成されたトークンは安全に保存してください。

### 3. Railsアプリケーションのデプロイ:

GitリポジトリにRailsアプリケーションのKubernetesマニフェストを追加:

```yaml
# ./kubernetes/rails-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: rails-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: rails-app
  template:
    metadata:
      labels:
        app: rails-app
    spec:
      containers:
      - name: rails
        image: [YOUR_RAILS_IMAGE_NAME]:[TAG]
        ports:
        - containerPort: 3000
```

このマニフェストをリポジトリにコミット&プッシュします。

### 4. Fluxによる変更の検出とデプロイ:

Fluxはリポジトリの変更を定期的にポーリングして、新しい変更を検出した際に対象のKubernetesリソースを更新します。

#### ソースの再同期や確認
手動で変更を反映させるためには、以下のコマンドを使用します。
```bash
flux reconcile source git [GIT_REPOSITORY_NAME]
```

## 第二章: トラブルシューティング

### 1. よくある問題とその解決策
`kubectl get deployments` コマンドの出力が期待したデプロイメントを示していない場合、いくつかの原因が考えられます。以下のトラブルシューティング手順を試してみてください。

1. **Fluxの同期ステータスを確認**: FluxがGitリポジトリの変更を正しく検出しているかを確認するには、以下のコマンドを使用します。
   ```bash
   flux get sources git
   ```

2. **Kustomizationの確認**: Fluxがリポジトリのマニフェストをクラスタに適用するためには、Kustomization リソースが必要です。Kustomizationのステータスを確認してみましょう。
   ```bash
   flux get kustomizations
   ```

3. **Fluxのログを確認**: FluxのPodのログを確認することで、何らかのエラーや警告がある場合、それを確認することができます。
   ```bash
   kubectl logs -n flux-system deployment/flux-controller
   ```

4. **Gitリポジトリのマニフェストを確認**: Gitリポジトリ内のKubernetesマニフェストが正しいかどうかを確認します。誤ったマニフェストや不足しているリソース、不正な値が原因でデプロイメントが作成されない可能性があります。

5. **Kubernetesのイベントを確認**: クラスタのイベントを確認して、何らかのエラーや警告があるかを見てみます。これにより、リソースが適切に作成されない理由が明らかになるかもしれません。
   ```bash
   kubectl get events --sort-by='.metadata.creationTimestamp'
   ```