---
author: usbharu
draft: false
categories:
  - 技術
date: 2024-11-23T22:31:06+09:00
tags:
  - Kubernetes
  - ArgoCD
  - CI/CD
  - k3s
keywords:
  - Kubernetes
  - ArgoCD
  - CI/CD
  - k3s
title: k8s+ArgoCDに入門したかった
relpermalink: posts/2024-11-23/
url: posts/2024-11-23/
decription: k8s+ArgoCDに入門したかった
---

[usbharu/usbharu-lab](https://github.com/usbharu/usbharu-lab)

## モチベーション

- CIはGitHub ActionsでなんとかなるけどCDを自動化したかった
- 運用側の気持ちを考えた開発をできるようになりたかった
- 手軽にデプロイできる環境を整えたかった
- なんかこうガチャガチャ動いてかっこいいじゃん?

## 何をしたか

ArgoCDを活用したGitOpsな感じで、リポジトリクローンして初期化スクリプトを実行するだけで全てのセットアップが完了し、そのまま使い始めることができる環境を作りたかった。現状の実験環境ではある程度完成しているが、ごちゃごちゃ過ぎて見れたもんじゃないので本番環境ように書き直している。時間が足りなかったので途中まで…

使用技術は

- k3s
- Helm
- ArgoCD
- CloudNative PostgreSQL
- Traefik
- cert-manager
- kube-prometheus-stack

~~うーん動いてるものが一つもない~~

MetalLBの代わりに組み込みのServiceLBを使っています。

実験環境ではmisskeyを自動で立ち上げたり、ownCloud Infinite Scaleを建てたりしていました。Helmをしっかりやるとreleaseを分けることで無限に自動でmisskeyが生えてくる環境を作ることもできる気がしています。

## App of Appsについて

k8s入門する前にArgoCDついてちょっと調べてたんですが、結局Appとか自分で追加するのか…と、あまりやる意味を感じていなかったときに、この構成を見つけました。ArgoCDに全てを管理してもらうことで自分のやりたいことができるということがわかったのでまた暇なときに本番環境で運用してみたいです。

[Argo CDのGetting Startedをシェルスクリプト化した](https://zenn.dev/akari0519/articles/33af4ddb92efcf)

[Argo CD + HelmでApp of Apps Patternを構築してみた](https://zenn.dev/akari0519/articles/409e1583eedf6e)

### 簡単な構成

1. ArgoCDをインストールする
2. helmでrootとなるappとcert-managerを追加する
3. rootがcnpgとtraefikとkube-prometheus-stackのApplicationを追加する
4. 各Applicationが読み込まれ、インストールされる

### 気をつけること

- ArgoCDのApplicationはArgoCDが動いてるものと同じnamespaceである必要がある
- GitHubはmainブランチがデフォでリポジトリを作るがgitはmaster
- yamlのインデントミスでvaluesがおかしくなっているかもしれないので2番目ぐらいに疑うこと

## CloudNative PGで自動的に監視対象に含める

以下を何らかの方法でkube-prometheus-stackのvaluesに追加する(監視対象を広げる)

```yaml
prometheus-node-exporter:
  hostRootFsMount:
    enabled: false
prometheus:
  prometheusSpec:
    podMonitorSelectorNilUsesHelmValues: false
    probeSelectorNilUsesHelmValues: false
    ruleSelectorNilUsesHelmValues: false
    serviceMonitorSelectorNilUsesHelmValues: false
    logLevel: info
```

以下をCNPGのvaluesに追加する(CNPG自体の監視とダッシュボードの作成)

```yaml
monitoring:
    podMonitorEnabled: true
    grafanaDashboard:
      create: true
```
以下をCNPGのClusterのvaluesに追加する(クラスタ自体の監視)
```yaml
cluster:
    monitoring:
      enabled: true
      podMonitor:
        enabled: true

```

これで自動的にPodMonitorが作成され、監視対象に含まれます。ここに1日溶かした

## 次に向けて

次触るときは本番環境に適用とimage updaterみたいなやつで自動でイメージの更新をしたい。あとはExternalDNSとかMetalLBのBGPモードを使って自宅で快適にクラスタを運用したい。最終的にはIngressの設定だけで公開できるようにしたいな~と