ArgoCDをKubernetes環境に導入しCD環境を設定する

[以前の記事](https://qiita.com/rui-watanabe/items/0299e4e063e6f871e40e)では、Centos7にKubernetes環境の構築をして、TLSの外部公開まで行いました。

今回はその環境に**ArgoCDを導入し、実際にマイクロサービスを動作させるまでの流れ**をまとめていきたいと思います。


## ArgoCDとは

ArgoCDとは、KubernetesのためのGitOpsに則ったCDツールです。

Gitのリポジトリの変更を監視し変更を検知した後、Kubernetes環境のクラスターに自動デプロイを行うことができます。

 
## GitOpsとは

GitOpsとは、インフラとアプリケーションの両方を含めたシステム全体のコードをGitで管理するといったような思想です。

例えばGitで管理されたインフラのコードを変更したら自動でデプロイされ、Gitと本番環境のサーバーのコードに差分がないような状態を実現できます。


## CIとCDの分離
CDの方式については、CIPipelineがKubernetes環境にアクセスしてCDを行うのをPush型、CDを分離させKubernetes環境の変更を検知しCDを行うのをPull型と呼びます。

ただサービスの世代管理が困難であったりCIへの権限への問題などから、Pull型が推奨されています。

そのためCIとCDの分離を行い、Gitでソース管理された各マイクロサービスのアプリケーションリポジトリー側では自動テストとコンテナレジストーリーの更新のCI側で行い、Kubernetes環境を構成するマニフェストリポジトリー側ではマニフェストファイル変更検知後の自動デプロイをCD側で行う、といった役割になります。


## ArgoCDリソースの作成

まずArgoCDの導入としてnamespaceを作成を行い、そのnamespaceにリソースの作成を行います。

```
# kubectl create namespace argocd

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


## 外部公開の設定


[以前の記事](https://qiita.com/rui-watanabe/items/0299e4e063e6f871e40e)で外部公開のTLSの設定をcert-managerとNginx Ingress Controllerを使って設定したので、それを活用してargocd-serverを外部公開するためのIngressのマニフェストファイルを作成し、リソースの作成を行います。


``` ingress.yml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: argocd-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/ssl-passthrough: "true"
    cert-manager.io/cluster-issuer: "letsencrypt-issuer"
    ingress.kubernetes.io/ssl-redirect: "false"
spec:
  tls:
  - hosts:
      - example-sub.test.com
    secretName: test-com-tls
  rules:
    - host: example-sub.test.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: argocd-server
              port:
                number: 443

```
```
# kubectl apply -f ingress.yml -n argocd
```

 

これでexample-sub.test.comにアクセスしたら、以下のようなArgoCDにログインページが表示されます。

![demo](https://gyazo.com/0ff367b7056313a3b31c9e27e9a9cb4b/raw)


# ArgoCDのログインページにログイン


初期ログインのアカウントは、作成したArgoCDリソースのSecretに記載されており、Usernameがadmin、Passwordが以下のコマンドで表示できるようになっています。

そして上記のPassword情報を使って、パスワードの再設定を行います。

```

# kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d && echo

# argocd account update-password
*** Enter current password:
*** Enter new password:
*** Confirm new password:
```

上記のログイン情報をArgoCDのログインページで入力後、ログインできるようになります。


## ArgoCD CLIの導入
コマンドでもArgoCDの設定が行えるよう、CLIのインストールと設定を行います。

 
```
# wget https://github.com/argoproj/argo-cd/releases/download/v2.0.5/argocd-linux-amd64

# wget https://github.com/argoproj/argo-cd/releases/download/v2.0.5/argocd-util-linux-amd64

# install argocd-linux-amd64 /usr/local/bin/argocd

# install argocd-util-linux-amd64 /usr/local/bin/argocd-util
```


CLIインストール後、確認のためにバージョンを表示します。

バージョン確認ではArgoCDのバージョンがは表示されますが、ArgoCD serverの項目では、「Argo CD server address unspecified」というエラーが出力されます。

そのエラーについては、CLIのログイン後解消されます。

```
# argocd version
argocd: v2.0.5+3a44d11
  BuildDate: 2021-07-22T20:52:31Z
  GitCommit: 4c9gnapekleodifnajem049c2d1354b88
  GitTreeState: clean
  GoVersion: go1.16
  Compiler: gc
  Platform: linux/amd64
FATA[0000] Argo CD server address unspecified    
       
# argocd login  サーバー名
Username: admin
Password: 設定したパスワード

# argocd version
argocd: v2.0.5+3a44d11
  BuildDate: 2021-07-22T20:52:31Z
  GitCommit: 4c9gnapekleodifnajem049c2d1354b88
  GitTreeState: clean
  GoVersion: go1.16
  Compiler: gc
  Platform: linux/amd64
argocd-server: v2.1.7+afaoamle
```


## ArgoCDとGitリポジトリーの設定

ArgoCDで管理したいマニフェストファイルとGitリポジトリーの同期について行います。

まず現状のクラスター情報を確認し、管理するクラスターを選択し設定します。

```

# argocd cluster add

# argocd cluster add 上記で表示されたNAMEのクラスター名

```


設定が完了したら、ArgoCDの管理下に置きたいGitHubのマニフェストファイルのフォルダーの設定を行います。

 

```
# argocd app create アプリケーション名 --repo 設定したいGitHubの.gitのURL --path GitHubの管理下に置きたいフォルダのパス --dest-server https://kubernetes.default.svc --dest-namespace 設定したい名前空間
```

その後、同期設定を行います。

```
# argocd app sync アプリケーション名
```


同期されているか確認すると、Sync Statusの部分がSyncedとなっています。

```
# argocd app get アプリケーション名
(snip)
Sync Status:        Synced to  (c61b343)
(snip)
```

サンプルアプリケーションで試すと、以下のようになります。

```
# argocd app create guestbook --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-server https://kubernetes.default.svc --dest-namespace default

# argocd app guestbook sync
```

実際に私がポートフォリオとして作成したアプリケーションの[マニフェストリポジトリ](https://github.com/rui-watanabe/k8s-original-covid-app)を設定すると以下のようになり、対象のコンテナバージョンをマニフェストファイルで変更しGitにpushすると、ArgoCDで自動デプロイが行われWebページの方も更新されます。

![demo](https://gyazo.com/ed8b886b2ea2a260c7fcf36ba9486dc3/raw)


これで、GitHubのマニフェストファイルから作成したリソースがArgoCD管理下におかれ、Gitでマニフェストファイルの変更をpushすると自動的に該当するArgoCD管理下に置かれているクラスターのリソースも更新されるようになり、設定の方は完了です。

 

 

 
## 参考URL
 

https://github.com/argoproj/argocd-example-apps

https://dev.classmethod.jp/articles/getting-started-argocd/

https://techstep.hatenablog.com/entry/2020/09/22/113404

https://www.forcia.com/blog/001535.html

https://www.redhat.com/ja/topics/devops/what-is-gitops