This guide provides comprehensive instructions for deploying the ESDDNS Operator using ArgoCD with both Helm and Kustomize options.
ArgoCD (in argocd namespace)
├── AppProject: esddns
├── Application: esddns-operator-helm → Helm deployment
├── Application: esddns-operator-kustomize → Kustomize deployment
├── Application: esddns-operator-helm-dev → Development environment
└── Application: esddns-operator-helm-prod → Production environment
kubectl configuredhelm (optional, for manual Helm operations)# Create namespace
kubectl create namespace argocd
# Install ArgoCD
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
helm install argocd argo/argo-cd -n argocd \
--set configs.params."application.instanceLabelKey"="argocd.argoproj.io/instance"
Option A: Deploy with Bootstrap Script
cd argocd/bootstrap
./argocd-setup.sh
Option B: Manual Deployment
# Deploy AppProject and all applications
kubectl apply -k argocd/
# Or deploy specific applications
kubectl apply -f argocd/argocd-appproject.yaml
kubectl apply -f argocd/applications/esddns-operator-helm.yaml
Option C: Deploy with Environment Overlay
# For development
kubectl apply -k argocd/overlays/dev/
# For production
kubectl apply -k argocd/overlays/prod/
Use this if you prefer Helm for all deployments.
kubectl apply -f argocd/applications/esddns-operator-helm.yaml
# Monitor the application
argocd app get esddns-operator-helm
argocd app wait esddns-operator-helm --sync
Pros:
Cons:
Use this if you have complex overlays and patches.
kubectl apply -f argocd/applications/esddns-operator-kustomize.yaml
# Monitor the application
argocd app get esddns-operator-kustomize
argocd app wait esddns-operator-kustomize --sync
Pros:
Cons:
Deploy different versions to different environments.
# Production with Helm
kubectl apply -f argocd/applications/esddns-operator-helm-prod.yaml
# Development with Kustomize
kubectl apply -f argocd/applications/esddns-operator-kustomize.yaml
# Monitor both
argocd app get esddns-operator-helm-prod
argocd app get esddns-operator-kustomize
Update values in helm/esddns-operator/values.yaml:
replicaCount: 2
image:
repository: sqe/esddns
tag: latest
resources:
limits:
cpu: 500m
memory: 512Mi
For environment-specific values, use:
values-development.yaml - Development overridesvalues-production.yaml - Production overridesUpdate k8s/overlays/production/kustomization.yaml:
resources:
- ../../base
images:
- name: esddns-operator
newTag: v1.0.0
replicas:
- name: esddns-operator-service
count: 3
commonLabels:
environment: production
syncPolicy:
syncOptions:
- CreateNamespace=true
automated: null
retry:
limit: 5
Manual sync keeps you in control:
# Sync the application
argocd app sync esddns-operator-helm
# Sync with prune (delete removed resources)
argocd app sync esddns-operator-helm --prune
# Force sync
argocd app sync esddns-operator-helm --force
syncPolicy:
automated:
prune: true
selfHeal: true
Once enabled, every Git commit automatically deploys to the cluster.
Sync only specific resources:
argocd app sync esddns-operator-helm --resource apps:Deployment:esddns-operator-service
# Get application status
kubectl get application -n argocd
kubectl get application esddns-operator-helm -n argocd -o yaml
# Using ArgoCD CLI
argocd app list
argocd app get esddns-operator-helm
argocd app logs esddns-operator-helm
# Check deployed resources
kubectl get all -n esddns-operator
kubectl describe deployment esddns-operator-service -n esddns-operator
# Check for errors
kubectl logs -n esddns-operator -l app=esddns-operator-service
Application stuck in “Progressing”
# Sync manually
argocd app sync esddns-operator-helm --force
# Check resource conditions
kubectl describe pod -n esddns-operator
Resources not being created
# Check AppProject permissions
kubectl get appproject esddns -n argocd -o yaml
# Check application source is valid
argocd app get esddns-operator-helm --refresh
Sync failure
# Get detailed error information
argocd app get esddns-operator-helm --hard-refresh
kubectl describe application esddns-operator-helm -n argocd
# Check Git repository access
argocd repo list
kubectl port-forward svc/argocd-server -n argocd 8080:443
# Open: https://localhost:8080
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath='{.data.password}' | base64 -d
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argocd-server
namespace: argocd
spec:
ingressClassName: nginx
rules:
- host: argocd.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argocd-server
port:
number: 443
Deploy to different clusters:
# For cluster 1 (dev)
kubectl apply -k argocd/overlays/dev/ --context dev-cluster
# For cluster 2 (prod)
kubectl apply -k argocd/overlays/prod/ --context prod-cluster
Enable automatic image tag updates with ArgoCD Image Updater:
helm install argocd-image-updater argo/argocd-image-updater -n argocd
Update Application with annotation:
metadata:
annotations:
argocd-image-updater.argoproj.io/image-list: esddns=sqe/esddns
argocd-image-updater.argoproj.io/esddns.update-strategy: semver~1.0
argocd-image-updater.argoproj.io/esddns.pull-secret: github
Setup Slack/Teams notifications for sync events:
# Install ArgoCD Notifications
helm install argocd-notifications argo/argocd-notifications -n argocd
kubectl delete application esddns-operator-helm -n argocd
kubectl delete -k argocd/
kubectl delete namespace argocd
kubectl delete namespace esddns-operator