はじめに
アプリケーションを運用していくにあたり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の実装についてまで記載します。
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 -dArgoCDにレポジトリを追加
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.svckubectl 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.gzGithub側でtokenを取得します。
GithubでSettings→Actions→Runnersから「New self-hosted runner」から作成します。
以下のサイトで詳しく書かれています。

取得した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側の動きも見てみます。

