ArgoCDとGitLabを連携してGitOps(CI/CD)環境を構築する

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

先日microk8sベースのKubernetesクラスタ上にArgoCD環境をデプロイし、WebUIにログインするところまでを行いました。
今回はその続き。ArgoCDとGitLabを連携してGitOps環境を作り、DeamonSetを自動デプロイしていきたいと思います。

https://qiita.com/ohtsuka-shota/items/a6b7a68150426011c7c1

# 用語
## GitLab
以下公式より引用です。
競合サービスとしてGitHubがあるかと思いますが、GitLabがナウくてGitHubが質実剛健みたいなイメージがあるみたいですね。私はどちらのアカウントも持っていますが、今のところGitLabの方が取っつき易いです。

>GitLabは先進的なソフトウェア開発に必要な多くの機能を統合した製品です。課題管理、バージョン管理、コードレビュー、CI、CD、モニタリングを1つのアプリケーションで行うことができ、インストールも簡単にできます。GitLabを活用すると、ソフトウェア開発の計画からモニタリングまでを効率的に行うことができます。

https://www.gitlab.jp/

# 参考にしている動画

以下の動画が非常にわかりやすかったです。
比較的簡単な英語で話しておりスピードも速くなく聞き取りやすい印象です。日本語の字幕を付けることが出来るので、英語がからっきしダメな方でもたぶん行けるはず・・・！
更に、JenkinsとArgoCDの比較について最初の方で話しており、イメージを多分に使用していることも相まって私の様なCI/CDやGitOps、ArgoCD初学者にとって有用であると思います。

https://youtu.be/MeU5_k9ssrs

# 構築
GitLabのアカウントを作成し、ログインしてください。
Projectを開き、New projectを押下します。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/4c7f2e90-976c-4aaf-864b-ee9d7b6bdebc)
Create blank projectを押下します。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/3796c22b-2ab2-4303-b1e1-76b4ec3ddc88)
Project nameを入力し、deployment targetはKubernetesを選択しておきます。
Create projectを押下します。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/a92daf1b-23f0-4f3a-b5dd-8cdd6e6b3229)
Projectが作成されたことを確認します。Command line instractionsのGit global setupとCreate a new repositoryはk8sのホストで実際に入力していきます。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/cb9272a5-d633-4c42-8142-d8e51b198ce2)

k8sのホストでコマンドを実行していきます。
git cloneコマンドの後にユーザ名とパスワードを求められますが、GitLabにログインする際に使用したメールアドレスとパスワードで問題無いかと思います。
```
root@k8s-master:~# git config --global user.name "●●●●" 
root@k8s-master:~# git config --global user.email "●●●●"
root@k8s-master:~# git clone https://gitlab.com/SHOLAND/argocd-my-config.git 
Cloning into 'argocd-my-config'... 
Username for 'https://gitlab.com':(メールアドレス入力)
Password for 'https://●●●●':(パスワード入力)
warning: You appear to have cloned an empty repository.
```

ここまで実行した後、lsコマンドを叩いてみると直下にGitLabで作成したProject名を関したディレクトリが表示されているはずです。
```
root@k8s-master:~# ls 
argocd-my-config  kubernetes-argocd-nodeport.yaml  kubernetes-dashboard-nodeport.yaml  kubernetes-grafana.yaml  kubernetes-prometheus.yaml  snap  wp-backup-yaml
```

ディレクトリに移動してコマンドの続きを打っていきます。
```
root@k8s-master:~# cd argocd-my-config 
root@k8s-master:~/argocd-my-config# git switch -c main 
Switched to a new branch 'main' 
root@k8s-master:~/argocd-my-config# touch README.md 
root@k8s-master:~/argocd-my-config# git add README.md 

root@k8s-master:~/argocd-my-config# git commit -m "add README" 
[main (root-commit) 64e07d0] add README 
 1 file changed, 0 insertions(+), 0 deletions(-) 
 create mode 100644 README.md 

root@k8s-master:~/argocd-my-config# git push -u origin main 
Username for 'https://gitlab.com':(メールアドレス入力)
Password for 'https://●●●●':(パスワード入力) 
Enumerating objects: 3, done. 
Counting objects: 100% (3/3), done. 
Writing objects: 100% (3/3), 220 bytes | 220.00 KiB/s, done. 
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 
To https://gitlab.com/SHOLAND/argocd-my-config.git 
 * [new branch]      main -> main 
Branch 'main' set up to track remote branch 'main' from 'origin'.
```
GitLabのWebUI上でreadmeファイルがProject配下に作成されていることを確認します。
動画ではdevディレクトリ上で色々作業をしているのでそれに合わせるために、devディレクトリを作成していきます。画面中央左にある【+】を押下します。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/886efba9-f7c7-4b13-93ca-2864dc28993e)

Directory nameにdevと入力してCreateします。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/8d926a0b-540d-4ff4-bf44-d4b8b14e9cfb)

GitLabで作成したディレクトリをk8sホスト側で認識させます。
認識させるにはgit pullコマンドを使用する様です。
```
root@k8s-master:~/argocd-my-config# ls 
README.md 
root@k8s-master:~/argocd-my-config# git pull origin main 
Username for 'https://gitlab.com':(メールアドレス入力)
Password for 'https://●●●●':(パスワード入力) 
remote: Enumerating objects: 4, done. 
remote: Counting objects: 100% (4/4), done. 
remote: Compressing objects: 100% (2/2), done. 
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 
Unpacking objects: 100% (3/3), 297 bytes | 297.00 KiB/s, done. 
From https://gitlab.com/SHOLAND/argocd-my-config 
 * branch            main       -> FETCH_HEAD 
   64e07d0..bd827c2  main       -> origin/main 
Updating 64e07d0..bd827c2 
Fast-forward 
 dev/.gitkeep | 0 
 1 file changed, 0 insertions(+), 0 deletions(-) 
 create mode 100644 dev/.gitkeep 
```
pullが正常に終了するとdevディレクトリが表示されると思います。
次の作業の為、そのディレクトリに移動します。
```
root@k8s-master:~/argocd-my-config# ls 
dev  README.md 
root@k8s-master:~/argocd-my-config# cd dev/ 
root@k8s-master:~/argocd-my-config/dev# ls 
root@k8s-master:~/argocd-my-config/dev#
```

以下のサイトを参考にしながらArgoCDの為のyamlファイルを作成していきます。

https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/#applications

用意したyamlは以下
sourceがGitLabについて。destnationがKubernetesについての記述です。動画を見ればこの辺りはすんなり入ると思います。
```Application.yaml 
apiVersion: argoproj.io/v1alpha1 
kind: Application 
metadata: 
  name: argo-application 
  namespace: argocd 
spec: 
  project: default 
  source: 
    repoURL: https://gitlab.com/SHOLAND/argocd-my-config.git 
    targetRevision: HEAD 
    path: dev 
  destination: 
    server: 'https://kubernetes.default.svc' 
    namespace: argo-app-ns 
  syncPolicy: 
    syncOptions: 
    - CreateNamespace=true 
    automated: 
      selfHeal: true 
      prune: true 
```

また、このタイミングでGitOps（CI/CD）試験用のyamlファイルを用意しておきます。今回用意したyamlは以下。nginx podを各nodeにデプロイするDeamonSetになります。metadata内でどのnamespaceにデプロイするかを併せて記載しておきます。
```argo-test-ds-app.yaml 
apiVersion: apps/v1 
kind: DaemonSet 
metadata: 
  name: argo-test-ds-app 
  namespace: argo-app-ns 
spec: 
  selector: 
    matchLabels: 
      name: nginx 
  template: 
    metadata: 
      labels: 
        name: nginx 
    spec: 
      containers: 
      - name: nginx-container 
        image: nginx:latest
```

これらのyamlファイルをGitLabにpushします。
git statusコマンドで差分を確認。2つのファイルが差分として出ていることが分かります。
git addでステージエリアにファイルを載せて、git commitでステージエリアに乗せたファイルをGitLabにコミットします。
```
root@k8s-master:~/argocd-my-config/dev# ls 
Application.yaml  argo-test-ds-app.yaml

root@k8s-master:~/argocd-my-config/dev# git status 
On branch main 
Your branch is up to date with 'origin/main'. 
Untracked files: 
  (use "git add <file>..." to include in what will be committed) 
        Application.yaml 
        argo-test-ds-app.yaml 
nothing added to commit but untracked files present (use "git add" to track) 

root@k8s-master:~/argocd-my-config/dev# git add . 
root@k8s-master:~/argocd-my-config/dev# git commit -m "ArgoCD trial" 
[main f3ceada] ArgoCD trial 
 2 files changed, 37 insertions(+) 
 create mode 100644 dev/Application.yaml 
 create mode 100644 dev/argo-test-ds-app.yaml 
root@k8s-master:~/argocd-my-config/dev# git push 
Username for 'https://gitlab.com':(メールアドレス入力) 
Password for 'https://●●●●':(パスワード入力) 
Enumerating objects: 7, done. 
Counting objects: 100% (7/7), done. 
Delta compression using up to 16 threads 
Compressing objects: 100% (5/5), done. 
Writing objects: 100% (5/5), 833 bytes | 833.00 KiB/s, done. 
Total 5 (delta 0), reused 0 (delta 0), pack-reused 0 
To https://gitlab.com/SHOLAND/argocd-my-config.git 
   384d2b2..f3ceada  main -> main
```

GitLabのWebUI上にも表示されることを確認します。出力されていればpushが上手くいったことを示します。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/f2ee5ed8-a467-4df9-8e2f-8e36bc751fe0)

ArgoCDの為のyamlをデプロイしていきます。
```
root@k8s-master:~/argocd-my-config/dev# kubectl apply -f Application.yaml 
application.argoproj.io/argo-application created 
```

デプロイするとArgoCDのWebUI上でも確認が出来るようになると思いますが、下記の様にSync関連で上手くいっていなかったリ、authenticationが上手くいっていないようなエラーが出力されると思います。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/47702479-b061-4f23-9b13-67e12d4793ea)
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/d1ddb958-25e1-473b-82fc-b5d83a0ecb05)
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/b6fcc2f8-8b87-4f3a-b119-9894151a9a5f)

ArgoCDやGitLab初心者の推測ですが、恐らくArgoCDにもGitLabについて登録をしていないから、このようなエラーを吐かれるのだと思います。
（k8s上でコマンドを実行してGitLabと連携を取りましたが、あっちはあくまでもk8s⇔GitLabの設定をしただけで、ArgoCD⇔GitLabの設定をしているわけではない。という推測）

ArgoCDのSettingsからRepositoriesに遷移します。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/7361901c-3ad4-422a-94ee-3f1e6c234dd7)
情報を入力します。ここまで設定が出来ているのであれば感覚的にどこに何を入れればいいかわかるかと思います。情報を入れましたら上部にあるCONNECTを押下します。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/e2eb84c2-7cdf-4be0-b3b3-86a07c1c53a6)
以下の様にSuccessfulとなればOKです。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/4bf978cc-0125-4839-875c-b3cfc7db5958)
元の場所に戻り、SYNCを押下します。
するとSyncingステータスになると思います。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/1fc0422e-5265-4243-a35d-6e17e85a056c)
数分待つとエラーが解消され、Healthy/Syncedステータスに変わるはずです。
DeamonSetも勝手にデプロイされていますね。
移行このディレクトリにyamlを置くとArgoCDがそれをpullして、k8sに環境を自動でデプロイしてくれるようになります。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/0254da93-0aa9-4c86-8bd0-78106d36256c)