GitOps: Automating Application Deployment with ArgoCD, Jenkins, Kustomize, and K3d
Here, we’ll explore how to set up a GitOps workflow using ArgoCD, Jenkins, Kustomize and K3d. This setup enables automated application deployment to Kubernetes environments with seamless management of multiple environments like dev and prod.
The accompanying repository can be found here: argocd-app.
Repository Structure
The repository is organized as follows:
- app-ci-image/: Contains Dockerfile and Jenkins pipeline (
Jenkinsfile) to build and push the application image to DockerHub. - k8s-app-kustomize/: Contains Kustomize configurations for managing Kubernetes resources.
- common/: Base resources shared across environments.
- environments/: Overlays for specific environments (
dev,prod).
- argocd-application-dev.yaml: Defines the ArgoCD application configuration for the development environment.
- argocd-application-prod.yaml: Defines the ArgoCD application configuration for the production environment.
Prerequisites
To follow along, ensure you have the following:
- A Kubernetes cluster (e.g., K3d for local development).
- ArgoCD installed in the cluster.
kubectlCLI installed locally.
Setting Up the Environment
1. Clone the Repository
Start by cloning the repository:
1
2
git clone https://github.com/OpsMo/argocd-app.git
cd argocd-app
2. Build and Push the Application Image
Option 1: Manual Build
Navigate to the app-ci-image directory:
1
cd app-ci-image
Build and push the Docker image:
1
2
3
docker build -t your-repo/your-app:latest .
docker push your-repo/your-app:latest
Option 2: Jenkins Pipeline
Use the provided Jenkins pipeline to automate the process. The Jenkinsfile in the app-ci-image directory is preconfigured for this purpose:
- Configure Jenkins to use the pipeline script from SCM.
- Trigger the pipeline to build and push the image to DockerHub.
Kustomize: Managing Multiple Environments
Common Directory (k8s-app-kustomize/common)
The common directory contains base resources that are shared across environments:
- deployment.yaml: Defines the base deployment for Nginx.
- nginx-service.yaml: ClusterIP service for Nginx.
- nginx-ingress.yaml: Configures ingress for routing traffic.
- kustomization.yaml: Lists the resources included in the base configuration.
Example kustomization.yaml:
1
2
3
4
5
6
7
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- nginx-service.yaml
- nginx-ingress.yaml
Environment-Specific Overlays (k8s-app-kustomize/environments)
Each environment (e.g., dev, prod) contains specific configurations:
Dev Directory
- kustomization.yaml: Includes the base resources and applies patches.
- deployment-dev.yaml: Adds environment variables for
dev. - ingress-dev.yaml: Customizes ingress paths for
dev.
Example kustomization.yaml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../common
patches:
- target:
kind: Ingress
name: nginx-ingress
path: ingress-dev.yaml
- target:
kind: Deployment
name: nginx
path: deployment-dev.yaml
namespace: dev
Configuring ArgoCD Application
The repository includes ArgoCD application manifests for dev and prod environments. Below is an example configuration for dev:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app-dev
namespace: argocd
spec:
destination:
namespace: dev
server: https://kubernetes.default.svc
project: default
source:
repoURL: https://github.com/OpsMo/argocd-app.git
targetRevision: main
path: k8s-app-kustomize/environments/dev
syncPolicy:
automated:
prune: true
selfHeal: true
To deploy :
1
kubectl apply -f argocd-application-dev.yaml -n argocd
Access the Application:
Use ArgoCD’s UI or ku to monitor the deployment. 
Once deployed, access the application via exposed service or configured ingress (K3d comes with Traefik controller)
for argocd-application-prod.yaml as well 
Rollback with ArgoCD
Rollback to a previous version using ArgoCD CLI:
View the application history:
1
argocd app history my-app-devRollback to a specific revision:
1
argocd app rollback my-app-dev --revision <revision-number>Verify the rollback:
1
argocd app get my-app-dev
Best Practices
- GitOps Principles: Store all configurations in version control (Git) and use ArgoCD for syncing changes.
- Separate Environments: Manage
devandprodusing Kustomize overlays. - Automate CI/CD: Leverage Jenkins (or any other CI tools like Github actions) for consistent and automated image/artifact builds.
Explore the Repository
Follow the repository to explore the complete project structure and configurations: argocd-app.
Goodluck😊


