microk8sベースのクラスタにArgo CDをデプロイしてNodePortでアクセスする

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

今回はArgo CDをmicrok8sベースのクラスタにデプロイし、NodePort経由でWebUIにアクセス出来る環境を構築していきたいと思います。

# 用語
## Argo CDとは？

公式から引用します。
。。。正直わからんので追加で色々調べます。

>Argo CDは、Kubernetesのための宣言型、GitOps継続的デリバリーツールです。
>"Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes."

https://argo-cd.readthedocs.io/en/stable/?_gl=1*199wpvh*_ga*MTU1Mzg0MjI2OC4xNjg1NzAyODA2*_ga_5Z1VTPDL73*MTY4NTcwOTAwMC4yLjEuMTY4NTcwOTAxNS4wLjAuMA..#what-is-argo-cd

## 継続的デリバリーとは？
AWSから引用します。

>継続的デリバリーとは、ソフトウェア開発手法の 1 つで、コード変更が発生すると、自動的に実稼働環境へのリリース準備が実行されるというものです。

https://aws.amazon.com/jp/devops/continuous-delivery/#:~:text=%E7%B6%99%E7%B6%9A%E7%9A%84%E3%83%87%E3%83%AA%E3%83%90%E3%83%AA%E3%83%BC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6,%E3%81%95%E3%82%8C%E3%82%8B%E3%81%A8%E3%81%84%E3%81%86%E3%82%82%E3%81%AE%E3%81%A7%E3%81%99%E3%80%82


## GitOpsとは？
RedHatから引用します。

>GitOps は、Git リポジトリを信頼できる唯一の情報源として使用し、インフラストラクチャをコードとして提供します。登録されたコードは CI プロセスをチェックし、CD プロセスではセキュリティやコードとしてのインフラストラクチャ (IaC、Infrastructure as Code)、またはアプリケーションフレームワークに設定される境界線に関する要件がチェックし、適用します。コードの変更はすべて追跡されるため、アップデートが容易になると同時に、ロールバックが必要な場合のバージョン管理も可能です。

https://www.redhat.com/ja/topics/devops/what-is-gitops#:~:text=GitOps%20%E3%81%AF%E3%80%81%E3%82%B3%E3%83%A9%E3%83%9C%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%80%81CI%2F,%E3%82%82%E3%81%AE%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%97%E3%81%BE%E3%81%99%E3%80%82

つまりyamlか何かに修正が入り、それをgithubみたいなリポジトリに追加したらArgo CDがそれを検知してKubernetesクラスタに自動で反映してくれるってことでしょうか？
継続的デリバリーって完全にプログラマーとかフロント側の人間の思想だと思うんですけど、それをインフラ側に適用する思想がGitOpsで、それを実現するのがArgo CD？
アプリケーション側の技術思想をインフラ側に組み込もうとしているってことかな？

アプリケーションの継続的デリバリー（CI/CDと呼ばれるもののCD部分？）をイメージにすると恐らく下記のような状態で、開発者がコード（.htmlや.py等）の修正・更新をgithubにアップロード。Jenkinsがそれを発見すると本番環境サーバに自動デプロイ。
この時あくまでも本番環境サーバ上にあるアプリケーションに着目してデプロイしているだけであり、その下にあるサーバに関しては自動デプロイの対象外。なぜならIaCという発想が無くインフラのコード化はなされていなかったから。コード化されていないから継続的デリバリーなんて出来るわけがなかった。
![k8s_3-ページ3.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/27eaa4fe-f519-2e8c-85e5-f54b3755905b.png)

IaCが促進しインフラがコード化されるようになると、上記のアプリケーションの継続デリバリーはアプリケーションの下であるサーバに対してもその思想が流用されるようになった。特にArgo CDはKubernetesに特化している。という事・・・？
![k8s_3-ページ3のコピー.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/cc0033fd-a7bc-7bc9-4b47-eb88c1145344.png)

うーん。。。一旦ここまで。
この辺りは用語は知っているけれど触ったことがない領域の為、なかなかに難しい。。。
構築に入ります。

# 構築
以下の公式サイトに構築手順が書かれているので、基本的にはこれをベースに進めます。

https://argo-cd.readthedocs.io/en/stable/getting_started/?_gl=1*12bljdc*_ga*MTU1Mzg0MjI2OC4xNjg1NzAyODA2*_ga_5Z1VTPDL73*MTY4NTcwMjgwNS4xLjEuMTY4NTcwMjgyNC4wLjAuMA..#getting-started

まずArgo CD用のnamespaceを作成し、yamlよりデプロイしていきます。
```
root@k8s-master:~# kubectl create namespace argocd
root@k8s-master:~# kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
```

デプロイ後、何がデプロイされているかを確認します。
相当量デプロイされていることが分かります。これらの他にSecret等もデプロイされています。
```
root@k8s-master:~# kubectl get all -n argocd
NAME                                                    READY   STATUS    RESTARTS   AGE
pod/argocd-applicationset-controller-7c9cb6785d-fbd4k   1/1     Running   0          2m58s
pod/argocd-notifications-controller-f9d4457df-qfrn5     1/1     Running   0          2m58s
pod/argocd-repo-server-677867cd57-jnl5v                 1/1     Running   0          2m57s
pod/argocd-redis-74cb89f466-h7cm9                       1/1     Running   0          2m57s
pod/argocd-server-74cd6d578d-xvjk7                      1/1     Running   0          2m57s
pod/argocd-application-controller-0                     1/1     Running   0          2m56s
pod/argocd-dex-server-69dbdcbf7d-bnlr9                  1/1     Running   0          2m58s

NAME                                              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/argocd-applicationset-controller          ClusterIP   10.152.183.140   <none>        7000/TCP,8080/TCP            2m59s
service/argocd-dex-server                         ClusterIP   10.152.183.91    <none>        5556/TCP,5557/TCP,5558/TCP   2m59s
service/argocd-metrics                            ClusterIP   10.152.183.188   <none>        8082/TCP                     2m59s
service/argocd-notifications-controller-metrics   ClusterIP   10.152.183.70    <none>        9001/TCP                     2m59s
service/argocd-redis                              ClusterIP   10.152.183.59    <none>        6379/TCP                     2m59s
service/argocd-repo-server                        ClusterIP   10.152.183.187   <none>        8081/TCP,8084/TCP            2m59s
service/argocd-server                             ClusterIP   10.152.183.122   <none>        80/TCP,443/TCP               2m59s
service/argocd-server-metrics                     ClusterIP   10.152.183.242   <none>        8083/TCP                     2m59s

NAME                                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/argocd-applicationset-controller   1/1     1            1           2m58s
deployment.apps/argocd-notifications-controller    1/1     1            1           2m58s
deployment.apps/argocd-repo-server                 1/1     1            1           2m58s
deployment.apps/argocd-redis                       1/1     1            1           2m58s
deployment.apps/argocd-server                      1/1     1            1           2m57s
deployment.apps/argocd-dex-server                  1/1     1            1           2m58s

NAME                                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/argocd-applicationset-controller-7c9cb6785d   1         1         1       2m58s
replicaset.apps/argocd-notifications-controller-f9d4457df     1         1         1       2m58s
replicaset.apps/argocd-repo-server-677867cd57                 1         1         1       2m57s
replicaset.apps/argocd-redis-74cb89f466                       1         1         1       2m58s
replicaset.apps/argocd-server-74cd6d578d                      1         1         1       2m57s
replicaset.apps/argocd-dex-server-69dbdcbf7d                  1         1         1       2m58s

NAME                                             READY   AGE
statefulset.apps/argocd-application-controller   1/1     2m57s
```

次にargo cliをインストールします。
以下が公式サイトとなります。
私はubuntu22.04で構築しておりましたのでcurlベースでインストールしました。

https://argo-cd.readthedocs.io/en/stable/cli_installation/

```
root@k8s-master:~# curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/latest/download/argocd-linux-amd64
root@k8s-master:~# install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
root@k8s-master:~# rm argocd-linux-amd64
```

Argo CDの公式サイトにNodePortでWebUIに接続する為の設定手順が無い為、ここからはオリジナルになります。
argocd-serverという名前のDeploymentがWebUIを提供しているDeployment（≒pod）になるのでdry-runして、yamlを生成。NodePortを30800としてデプロイしました。
```
root@k8s-master:~# kubectl expose deployment argocd-server -n argocd --type=NodePort --dry-run=client -o yaml > kubernetes-argocd-nodeport.yaml
root@k8s-master:~# vi kubernetes-argocd-nodeport.yaml
root@k8s-master:~# kubectl apply -f kubernetes-argocd-nodeport.yaml
service/self-rgocd-server-nodeport created
```
```kubernetes-argocd-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  name: self-rgocd-server-nodeport
  namespace: argocd
spec:
  ports:
  - name: port-1
    port: 8080
    protocol: TCP
    targetPort: 8080
    nodePort: 30800
  selector:
    app.kubernetes.io/name: argocd-server
  type: NodePort
```

Argo CDのWebUIにログインする為にはパスワードが求められます。（ユーザはadminです。）
Secretに"argocd-initial-admin-secret"というものがあり、この中にbase64でエンコードされたパスワードが放り込まれています。デコードして取り出しましょう。その結果"BVMp1vVt-odnyL4b"がパスワードになることが分かりました。
```
root@k8s-master:~# kubectl get secret -n argocd
NAME                          TYPE     DATA   AGE
argocd-notifications-secret   Opaque   0      30m
argocd-initial-admin-secret   Opaque   1      29m
argocd-secret                 Opaque   5      30m
root@k8s-master:~# kubectl describe secret argocd-initial-admin-secret  -n argocd
Name:         argocd-initial-admin-secret
Namespace:    argocd
Labels:       <none>
Annotations:  <none>

Type:  Opaque

Data
====
password:  16 bytes
root@k8s-master:~# kubectl get secret --namespace argocd argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 --decode ; echo
BVMp1vVt-odnyL4b
```

https://(サーバのIPアドレス):30800でWebブラウザを使いアクセスします。
以下のログイン画面が出力されるので、ユーザとパスワードを入力。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/3a56f468-d55b-87e6-34bd-4c3d70cfae45.png)

ログイン出来ることを確認しました。
![image１１１１１１１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/e495cf7c-a727-f623-ba25-f7ace64f74ba.png)