【やってみた】KubernetesにArgo CDを入れてみた
はじめに
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作成
アプリケーションのデプロイ先として、yohe
namespaceを作成します。
[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 Policy
がManual
からAutomated
に変更されたことが確認できます。
2. 自動自己修復
Gitで定義された状態から逸脱した場合の自動同期を有効にする。
[vagrant@controller-0 cicd-study]$ argocd app set test-yohe --self-heal
これで、github上の資材を修正したことArgo CDが検知し、自動でPodを更新するはずです。
3. 自動更新を確認する
今回作成したアプリケーションを使って、自動更新の挙動を見てみましょう。
- アクセス用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 ~]$
- アプリケーション確認
アプリケーションを確認してみます。
[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
に変更してみます。
- 確認
資材を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