LoginSignup
9
3

More than 1 year has passed since last update.

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

Posted at

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

demo

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ページの方も更新されます。

demo

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

参考URL

9
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3