おうちk8sでCI/CDの導入(ArgoCD、Github Action)

スポンサーリンク
個人開発

はじめに

アプリケーションを運用していくにあたりCI/CDの実装の必要性はとても高いです。

今回はおうちk8sにCI/CDを導入してみようという内容となります。

今回の構成について

今の構成では、Blue Green Deploymentができません。

それは、ArgoCDが動かないからです。

ArgoCDはインフラ側のコードが変更されたことを検知して発火します。

しかし、今の状態では特定のフォルダにアプリケーションのファイル群を配置するので、Github Actionsで配置することができることはできますが、その後の更新ではHelmの停止と起動の処理が必要になります。

つまり、サービスが一時的に使えない時間が出てきます。

この方法をとった時にHelmの停止と起動の処理をBlue Green Deploymentをすればいいじゃないかと思うかもしれません。

たしかに、Blue Green Deploymentはできなくはありません。

以下の記事にその方法が書かれていました。

この方法ではざっくり書くと、Pre環境を用意する必要があります。

シンプルなアプリケーションのインフラ構成であればそこまで大変ではないのですが、インフラ環境が複雑になった場合(podが増えていった場合など)はインフラ側のコード管理が大変になります。

このため、アプリケーションのマウントの方法はとらず、アプリケーションの全てをDocker imageにパッケージ化して扱う方法にシフトすること決めました。

アプリケーション側のパイプラインではDocker imageにパッケージ化して、それをレジストリにpushするところまでを実装します。

その後、インフラ側の対象とするDocker imageのタグを変更して(今回使用する最新のDocker imageのタグに変更して)インフラ側のGithubのレポジトリにpush + pull requestをします。

そうすることで、今度はArgoCDのsyncを実施し、インフラ側の更新が動きます。

この時、ArgoCDが動くのでBlue Green Deploymentを実行するという流れを想定しています。

この記事ではArgoCDの設定と、Github Actionによるアプリケーション側のCIの実装についてまで記載します。

レポジトリとレジストリの違いは?

ちなみに、レジストリと似たような概念でレポジトリと言うものがあります。

その違いについて少しここで触れておきます。

階層で表すと以下のようになっています。

Docker Hub (レジストリ)
└── ollama (レポジトリ)
     ├── latest (タグ)
     ├── 0.1.26 (タグ)
     └── arm64 (タグ)

レジストリはイメージを配信する「サーバー」になります。

一方で、レポジトリはイメージ群を示します。

その中にイメージが複数あり、タグによって区別されているという訳です。

ArgoCD側の設定

まずは、ArgoCDを入れてクラスターの構成を確認してみます。

$ kubectl create namespace argocd
$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

確認

$ kubectl -n argocd get po
NAME                                                READY   STATUS    RESTARTS   AGE
argocd-application-controller-0                     1/1     Running   0          6h45m
argocd-applicationset-controller-7f8cf4fccd-dj9z8   1/1     Running   0          6h45m
argocd-dex-server-5476578f87-qlpqc                  1/1     Running   0          6h45m
argocd-notifications-controller-5cdf85f4cc-llvmn    1/1     Running   0          6h45m
argocd-redis-557d5777d9-gk7qx                       1/1     Running   0          6h45m
argocd-repo-server-59594d7685-6dzzv                 1/1     Running   0          6h45m
argocd-server-77d799c5fb-7flw5                      1/1     Running   0          6h45m

アクセスするにはまず、ポートフォワーディングを以下で行います。

$ kubectl -n argocd port-forward svc/argocd-server 8081:443 --address='0.0.0.0'&

これでラズパイのIP:8081で以下のページにアクセスできます。

ログインするにはユーザーが「admin」でパスワードは以下のコマンドで取得できます。

$ kubectl -n argocd get secrets argocd-initial-admin-secret -ojsonpath={.data.password} | base64 -d

ArgoCDにレポジトリを追加

settings→repositoryにgithubのrepository情報を追加します。

プロジェクトの追加

続いてプロジェクトを追加します。

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: ref-voice
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  description: ref-voice application
  sourceRepos:
    - "https://github.com/xxxx/*"
  destinations:
    - namespace: ref-voice
      server: https://kubernetes.default.svc

kubectl applyでこのファイルを指定してapplyします。

Applicationの追加

Applicationを追加します

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: ref-voice-backend
  namespace: argocd
spec:
  project: ref-voice
  source:
    repoURL: https://github.com/xxxx/helm_contents.git
    targetRevision: develop
    path: ref_voice/go_slim_backend
  destination:
    server: https://kubernetes.default.svc
    namespace: ref-voice
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

---

・・・【略】・・・

kubectl applyでこのファイルも指定してapplyします。

シークレットの作成

$ kubectl create secret generic helm-contents-cred -n argocd \ 
--from-literal url=https://github.com/appare9999/helm_contents.git \
--from-literal username=appare9999 --from-literal password=<ghp_token_key> \
--from-literal name=helm-contents

ラベルの追加

$ kubectl label secret helm-contents-cred argocd.argoproj.io/secret-type=repository -n argocd
secret/helm-contents-cred labeled

以下のようにApplicationsに各ApplicationができていたらOKです。

ここまでで、インフラ側の準備は完了です。

アプリケーション側のCICDを実装してから、払い出すところを実装します。(👉次回以降)

Github Actionの設定

Github ActionはGithub側ではなく、ラズパイ側でpushまで実行するようにします。

self-hostedというものです。

runnerのインストール

ラズパイ上で、以下のコマンドを実施して

$ mkdir actions-runner && cd actions-runner
$ curl -O -L https://github.com/actions/runner/releases/download/v2.328.0/actions-runner-linux-arm64-2.328.0.tar.gz
$ tar xzf ./actions-runner-linux-arm64-2.328.0.tar.gz

Github側でtokenを取得します。

GithubでSettings→Actions→Runnersから「New self-hosted runner」から作成します。

以下のサイトで詳しく書かれています。

GitHub Actionsのセルフホステッドランナーを構築する - Qiita
使用技術 GitHub Actions GitHubが提供しているCI/CD GitHubにシームレスに統合されており、GitHubとの親和性が高い GitHub: ドキュメント: GitHub A...

取得したtokenを以下のように使用します

~/actions-runner $ ./config.sh --url https://github.com/<user_name>/go_slim --token xxxxxxxxxxxxx

試しにパイプラインを動かしてみるとファイルがラズパイ側に配置されていることを確認しました。

## ここにファイル群がある
$ ls ~/actions-runner/_work/go_slim/go_slim/
_backend_django  db                  nginx   otel_collector     ref_voice_backend   schema    test_github_actions.txt
_frontend_vue    docker-compose.yml  ollama  postgresql_vector  ref_voice_frontend  test.txt

そしてパイプラインでjobが完了したところまで確認しました。

最後に

今回はGithub Action側の挙動までを確認しました。

次回はArgoCD側の動きも見てみます。

タイトルとURLをコピーしました