🔥

【やってみた】KubernetesにArgo CDを入れてみた

2024/10/31に公開

はじめに

kubernetesを触り始めてはや2年...
CKA、CKADを取得したが、恥ずかしながら、自身でCICDパイプラインを構築したことがなかった。
そのため、自宅環境でやってみた際の内容を備忘として記載する。
※Argo CDの深堀は本記事では記載しません。

環境

  • windows10
  • vagrant - 2.4.1
  • virtualbox - 7.0.20
  • kubernetes - v1.31 by kubeadm
    • controleplane:1台
    • worker:1台
  • argocd - v2.12.3

Argo CDをインストールする

基本的に公式マニュアル通りに実施すれば、インストールできます。

1. namespaceを作成

arog cd用コンポーネントをデプロイするnamespaceを作成する。

[vagrant@controller-0 ~]$ kubectl create namespace argocd
namespace/argocd created

2. Argo CDをインストール

先ほど作成したnamespaceにArgo CDをインストールする。

[vagrant@controller-0 ~]$ kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
customresourcedefinition.apiextensions.k8s.io/applications.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/applicationsets.argoproj.io created
<中略>
networkpolicy.networking.k8s.io/argocd-repo-server-network-policy created
networkpolicy.networking.k8s.io/argocd-server-network-policy created
[vagrant@controller-0 ~]$

デプロイされたPodを確認してみる。

[vagrant@controller-0 ~]$ kubectl get pod -n argocd
NAME                                                READY   STATUS    RESTARTS   AGE
argocd-application-controller-0                     1/1     Running   0          2m57s
argocd-applicationset-controller-5b866bf4f7-8vcnv   1/1     Running   0          2m57s
argocd-dex-server-7b6987df7-z44zr                   1/1     Running   0          2m57s
argocd-notifications-controller-5ddc4fdfb9-jsr27    1/1     Running   0          2m57s
argocd-redis-ffccd77b9-bfnq8                        1/1     Running   0          2m57s
argocd-repo-server-55bb7b784-n7nnr                  1/1     Running   0          2m57s
argocd-server-7c746df554-ntxkw                      1/1     Running   0          2m57s
[vagrant@controller-0 ~]$

Argo CD CLIをダウンロードする

Argo CDをCLIで操作する際のコマンドをインストールする。

[vagrant@controller-0 ~]$ brew install argocd

Argo CD APIサーバーにアクセスする

1. サービスを公開する。

マニュアルでは、LoadBalancerを公開しているが、本環境はLoadBalancerが連携された環境ではないので、NodePortで代用する。metalLBやクラウド上であれば、LoadBalancerで対応可能

[vagrant@controller-0 ~]$ kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'
service/argocd-server patched
[vagrant@controller-0 ~]$

該当Serviceを確認する。

[vagrant@controller-0 ~]$ k -n argocd get svc argocd-server
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
argocd-server   NodePort   10.103.83.88   <none>        80:32736/TCP,443:32202/TCP   11m
[vagrant@controller-0 ~]$

これで外部からAPIサーバにアクセスできるようになった。

CLIを使用してログインする

argo cdにログインおよびパスワード変更を行う。
loginユーザはadminとなる。

1. 初期パスワードを確認する。

[vagrant@controller-0 ~]$ argocd admin initial-password -n argocd

2. ログインする

NodePortを作成したので、<ARGOCD_SERVER><ホストIP>:<NodePortのPort>に置き換える。

[vagrant@controller-0 ~]$ argocd login 10.240.0.10:32736
WARNING: server certificate had error: tls: failed to verify certificate: x509: cannot validate certificate for 10.240.0.10 because it doesn't contain any IP SANs. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully
Context '10.240.0.10:32736' updated
[vagrant@controller-0 ~]$

3. パスワード変更を行う。

検証環境なので、初期パスワードは変更する必要はないが、マニュアルに記載された通り行う。

[vagrant@controller-0 ~]$ argocd account update-password
*** Enter password of currently logged in user (admin):
*** Enter new password for user admin:
*** Confirm new password for user admin:
Password updated
Context '10.240.0.10:32736' updated
[vagrant@controller-0 ~]$

アプリをデプロイするクラスターを登録する

今回は内部クラスタにArgo CDをデプロイしたので、本手順はskip

Gitリポジトリからアプリケーションを作成する

デプロイが完了したので、実際にアプリケーションを作成していきます。
アプリケーションを作成はCLIとGUIからの2パターンありますが、今回は作成はCLI、確認はCLIとGUIで実施していこうと思います。

また、マニュアルに記載があるサンプルアプリケーションを用いてもよかったのですが、個人gitlab上の資材を利用してアプリケーションを作成したいと思います。デプロイ先のnamespaceも新規作成したnamespaceに変更したいと思います。

1. 資材を準備する。

今回はDeploymentおよびServiceをデプロイする資材を準備します。

2. コンテキスト変更

[vagrant@controller-0 ~]$ kubectl config set-context --current --namespace=argocd
Context "kubernetes-admin@kubernetes" modified.
[vagrant@controller-0 ~]$

3. アプリケーションデプロイ用のnamespace作成

アプリケーションのデプロイ先として、yohenamespaceを作成します。

[vagrant@controller-0 ~]$ k create ns yohe
namespace/yohe created

4. アプリケーションを作成

実際にデプロイしていきましょう。

[vagrant@controller-0 ~]$ argocd app create test-yohe --repo https://github.com/yohe-lab/cicd-study.git --path test-deployment --dest-server https://kubernetes.default.svc --dest-namespace yohe
application 'test-yohe' created
[vagrant@controller-0 ~]$

確認していきましょう。

[vagrant@controller-0 ~]$ argocd app get test-yohe
Name:               argocd/test-yohe
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          yohe
URL:                https://10.240.0.10:32736/applications/test-yohe
Source:
- Repo:             https://github.com/yohe-lab/cicd-study.git
  Target:
  Path:             test-deployment
SyncWindow:         Sync Allowed
Sync Policy:        Manual
Sync Status:        OutOfSync from  (4abb063)
Health Status:      Missing

GROUP  KIND        NAMESPACE  NAME       STATUS     HEALTH   HOOK  MESSAGE
       Service     yohe       test-yohe  OutOfSync  Missing
apps   Deployment  yohe       test-yohe  OutOfSync  Missing
[vagrant@controller-0 ~]$
[vagrant@controller-0 ~]$ k get app
NAME        SYNC STATUS   HEALTH STATUS
test-yohe   OutOfSync     Missing
[vagrant@controller-0 ~]$
[vagrant@controller-0 ~]$ k -n yohe get pod
No resources found in yohe namespace.
[vagrant@controller-0 ~]$

Sync Status: OutOfSyncとなっているため、まだ同期がされていない状態です。
そのため、appリソースは作成されていますが、Podは作成されていません。

アプリケーションを同期(デプロイ)する

アプリケーションをデプロイするには同期する必要があります。
では、先ほどのappを同期し、デプロイしていきます。

[vagrant@controller-0 ~]$ argocd app sync test-yohe
TIMESTAMP                  GROUP        KIND   NAMESPACE                  NAME    STATUS    HEALTH        HOOK  MESSAGE
2024-10-17T15:52:57+00:00            Service        yohe             test-yohe  OutOfSync  Missing
2024-10-17T15:52:57+00:00   apps  Deployment        yohe             test-yohe  OutOfSync  Missing
2024-10-17T15:52:58+00:00            Service        yohe             test-yohe    Synced  Healthy
2024-10-17T15:52:58+00:00            Service        yohe             test-yohe    Synced   Healthy              service/test-yohe created
2024-10-17T15:52:58+00:00   apps  Deployment        yohe             test-yohe  OutOfSync  Missing              deployment.apps/test-yohe created
2024-10-17T15:52:58+00:00   apps  Deployment        yohe             test-yohe    Synced  Progressing              deployment.apps/test-yohe created

Name:               argocd/test-yohe
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          yohe
URL:                https://10.240.0.10:32736/applications/test-yohe
Source:
- Repo:             https://github.com/yohe-lab/cicd-study.git
  Target:
  Path:             test-deployment
SyncWindow:         Sync Allowed
Sync Policy:        Manual
Sync Status:        Synced to  (4abb063)
Health Status:      Progressing

Operation:          Sync
Sync Revision:      4abb063e2e72d80b4408b96c5746fc0dd66847c0
Phase:              Succeeded
Start:              2024-10-17 15:52:57 +0000 UTC
Finished:           2024-10-17 15:52:58 +0000 UTC
Duration:           1s
Message:            successfully synced (all tasks run)

GROUP  KIND        NAMESPACE  NAME       STATUS  HEALTH       HOOK  MESSAGE
       Service     yohe       test-yohe  Synced  Healthy            service/test-yohe created
apps   Deployment  yohe       test-yohe  Synced  Progressing        deployment.apps/test-yohe created
[vagrant@controller-0 ~]$

では、確認していきます。

[vagrant@controller-0 ~]$ argocd app get test-yohe
Name:               argocd/test-yohe
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          yohe
URL:                https://10.240.0.10:32736/applications/test-yohe
Source:
- Repo:             https://github.com/yohe-lab/cicd-study.git
  Target:
  Path:             test-deployment
SyncWindow:         Sync Allowed
Sync Policy:        Manual
Sync Status:        Synced to  (4abb063)
Health Status:      Healthy

GROUP  KIND        NAMESPACE  NAME       STATUS  HEALTH   HOOK  MESSAGE
       Service     yohe       test-yohe  Synced  Healthy        service/test-yohe created
apps   Deployment  yohe       test-yohe  Synced  Healthy        deployment.apps/test-yohe created
[vagrant@controller-0 ~]$
[vagrant@controller-0 ~]$
[vagrant@controller-0 ~]$ k get app
NAME        SYNC STATUS   HEALTH STATUS
test-yohe   Synced        Healthy
[vagrant@controller-0 ~]$
[vagrant@controller-0 ~]$ k -n yohe get pod,svc
NAME                             READY   STATUS    RESTARTS   AGE
pod/test-yohe-57cd69d78b-zqk4k   1/1     Running   0          49s

NAME                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/test-yohe   ClusterIP   10.106.249.251   <none>        80/TCP    49s
[vagrant@controller-0 ~]$


Sync Status: Syncedとなり、アプリケーションがデプロイされていることを確認できます。

自動更新を実施する。

アプリケーションをデプロイすることまで確認しました。
次に資材を修正したタイミングで、自動でアプリケーションを更新するように変更してみます。
公式マニュアルを参考に自動同期ポリシーを設定していきます。

1. 自動同期ポリシーを設定する

[vagrant@controller-0 ~]$  argocd app set test-yohe --sync-policy automated

ポリシーが変更されたか確認します。

[vagrant@controller-0 ~]$ argocd app get test-yohe
Name:               argocd/test-yohe
Project:            default
Server:             https://kubernetes.default.svc
Namespace:          yohe
URL:                https://10.240.0.10:32736/applications/test-yohe
Source:
- Repo:             https://github.com/yohe-lab/cicd-study.git
  Target:
  Path:             test-deployment
SyncWindow:         Sync Allowed
Sync Policy:        Automated
Sync Status:        Synced to  (4abb063)
Health Status:      Healthy

GROUP  KIND        NAMESPACE  NAME       STATUS  HEALTH   HOOK  MESSAGE
       Service     yohe       test-yohe  Synced  Healthy        service/test-yohe created
apps   Deployment  yohe       test-yohe  Synced  Healthy        deployment.apps/test-yohe created
[vagrant@controller-0 ~]$

Sync PolicyManualからAutomatedに変更されたことが確認できます。

2. 自動自己修復

Gitで定義された状態から逸脱した場合の自動同期を有効にする。

[vagrant@controller-0 cicd-study]$ argocd app set test-yohe --self-heal

これで、github上の資材を修正したことArgo CDが検知し、自動でPodを更新するはずです。

3. 自動更新を確認する

今回作成したアプリケーションを使って、自動更新の挙動を見てみましょう。

  1. アクセス用Podを作成する。
    アプリケーションアクセス用のPodを用意しておきます。
[vagrant@controller-0 ~]$ k -n yohe run nginx --image nginx --port 80
pod/nginx created
[vagrant@controller-0 ~]$
[vagrant@controller-0 ~]$ k -n yohe get pod
NAME                         READY   STATUS    RESTARTS   AGE
nginx                        1/1     Running   0          7s
test-yohe-57cd69d78b-zqk4k   1/1     Running   0          12m
[vagrant@controller-0 ~]$
  1. アプリケーション確認
    アプリケーションを確認してみます。
[vagrant@controller-0 ~]$ k -n yohe get deployments.apps test-yohe -o yaml | grep image:
      - image: sitaramiyer/green
[vagrant@controller-0 ~]$
[vagrant@controller-0 ~]$ k -n yohe exec -it nginx -- curl test-yohe
<!DOCTYPE html>
<html>
    <body style="background-color:green;">

        <h1>Hello Green</h1>

    </body>
</html>

[vagrant@controller-0 ~]$

imageはsitaramiyer/green
本文はHello GreenとなるPodがデプロイされていることがわかります。
3. 資材変更
今回はimageをsitaramiyer/blueに変更してみます。

  1. 確認
    資材をcommitしたら、実際のPodを確認してみましょう。(同期には最大約3mほどかかります。)
[vagrant@controller-0 cicd-study]$ k -n yohe get pod
NAME                        READY   STATUS    RESTARTS   AGE
nginx                       1/1     Running   0          30m
test-yohe-54c465d7c-jc58v   1/1     Running   0          2m33s
[vagrant@controller-0 cicd-study]$
[vagrant@controller-0 cicd-study]$  k -n yohe get deployments.apps test-yohe -o yaml | grep image:
      - image: sitaramiyer/blue
[vagrant@controller-0 cicd-study]$
[vagrant@controller-0 cicd-study]$ k -n yohe exec -it nginx -- curl test-yohe
<!DOCTYPE html>
<html>
    <body style="background-color:blue;">

        <h1>Hello Blueeeeeeeeeee</h1>

    </body>
</html>

[vagrant@controller-0 cicd-study]$

imageはsitaramiyer/blue
本文はHello BlueeeeeeeeeeとなるPodがデプロイが再デプロイされていることがわかります。

GUIからも変更されていることが確認できました。

まとめ

今回の検証は以上となります。
次はCIの実装を行い、CICDパイプラインができたら...と考えています。

Discussion