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


以前の記事では、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

外部公開の設定

以前の記事で外部公開の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にログインページが表示されます。

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

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

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

参考URL