Using ArgoCD
ArgoCD is a GitOps tool that enables automated continuous delivery for Kubernetes. It monitors the Git repository and automatically syncs changes to your cluster. While this section demonstrates ArgoCD as an example, other GitOps tools such as Flux, Jenkins X, or your preferred CI/CD platform can be used to achieve similar outcomes.
- Git repository structure
- For ArgoCD to work effectively, organize your Git repository with a clear structure:
via-config/ ├── README.md ├── production/ │ ├── values.yaml │ └── ibmvia-autoconf.yaml ├── staging/ │ ├── values.yaml │ └── ibmvia-autoconf.yaml └── development/ ├── values.yaml └── ibmvia-autoconf.yaml
- ArgoCD application setup
- To set up ArgoCD:
- Create an ArgoCD application manifest:
# argocd-application.yaml apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: ivia-production namespace: argocd spec: project: default source: # Git repository containing your configuration repoURL: https://github.com/your-org/ivia-config.git targetRevision: main path: production # Helm-specific configuration helm: # Reference to values file in the repository valueFiles: - values.yaml # Set the autoconf content from file fileParameters: - name: autoconf.content path: ibmvia-autoconf.yaml # Additional parameters (optional) parameters: - name: global.namespace value: ivia-production destination: server: https://kubernetes.default.svc namespace: ivia-production syncPolicy: # Automated sync configuration automated: prune: true # Remove resources not in Git selfHeal: true # Automatically sync when cluster state drifts allowEmpty: false # Sync options syncOptions: - CreateNamespace=true - PrunePropagationPolicy=foreground - PruneLast=true # Retry configuration retry: limit: 5 backoff: duration: 5s factor: 2 maxDuration: 3m - Deploy the application:
kubectl apply -f argocd-application.yaml
- Create an ArgoCD application manifest:
- Automated sync
- If
syncPolicy.automatedis enabled, ArgoCD performs the following actions:- Monitors Git repository: ArgoCD checks the Git repository every 3 minutes. The poll time is configurable.
- Detects drift: It compares the git state with the current state in the cluster.
- Auto-sync: It automatically applies changes on detecting any differences.
- Self-heal: Reverts any manual changes in the cluster to match the Git-defined state.
- Manual Sync
-
For greater control, disable automated sync and sync manually as needed.
To disable automated sync, execute the following command:syncPolicy: automated: null # Disable automated syncTo trigger manual sync, execute the following command:# Using ArgoCD CLI argocd app sync ivia-production # Using ArgoCD UI # Navigate to the application and click "Sync" # Using kubectl kubectl patch application ivia-production -n argocd \ --type merge \ --patch '{"operation": {"initiatedBy": {"username": "admin"}, "sync": {}}}'
- ArgoCD Best Practices
-
- Use Git branches: Maintain separate branches for different environments such as development, staging, and production.
- Enable notifications: Configure Slack or email notifications to track sync events.
- Health checks: ArgoCD automatically monitors the health of managed resources.
- Rollbacks: Perform easy rollbacks by reverting the changes in Git.
- Role-based access control (RBAC): Configure ArgoCD RBAC to manage user permissions for syncing application.
Deployment example
This example demonstrates a WebSEAL reverse proxy deployment with external LDAP integration. The configuration uses IBM Security Verify Directory (ISVD) as the external LDAP server and includes certificate management via cert-manager.
The main two configuration files are:
- values.yaml:
# IBM Confidential # PID 5725-V89 5725-V90 5737-F02 # # Copyright IBM Corp. 2026, 2026 # Global settings global: namespace: "ivia-autoconf" # Auto-configuration file content autoconf: content: "" # Service account configuration serviceAccount: create: true name: ivia annotations: {} # Certificate management configuration certificates: # Enable cert-manager certificate generation enabled: true # Issuer configuration issuer: create: true name: ivia-selfsigned-issuer kind: Issuer # Certificate duration and renewal settings duration: 8760h # 1 year renewBefore: 720h # 30 days before expiry # PKCS12 passwords for cert-manager keystore output pkcs12Passwords: config: secretName: ivia-passwords secretKey: config_pkcs12_password runtime: secretName: ivia-passwords secretKey: runtime_pkcs12_password wrp: secretName: ivia-passwords secretKey: wrp_pkcs12_password # Administrator password secret configuration adminPassword: secretName: ivia-passwords secretKey: cfgsvc # Configuration service CA certificate configCaCertificate: verify: true secretName: ivia-config-certificate-secret key: ca.crt # Configuration container settings config: image: repository: icr.io/ivia/ivia-config tag: "11.0.3.0" pullPolicy: Always loggingFormat: basic probes: liveness: initialDelaySeconds: 5 periodSeconds: 10 timeoutSeconds: 1 failureThreshold: 3 readiness: initialDelaySeconds: 5 periodSeconds: 10 timeoutSeconds: 1 failureThreshold: 3 startup: initialDelaySeconds: 30 periodSeconds: 10 timeoutSeconds: 1 failureThreshold: 30 resources: {} tolerations: [] affinity: {} podAnnotations: {} # Web Reverse Proxy container settings wrp: replicaCount: 1 image: repository: icr.io/ivia/ivia-wrp tag: "11.0.3.0" pullPolicy: Always loggingFormat: basic probes: liveness: initialDelaySeconds: 0 periodSeconds: 10 timeoutSeconds: 3 failureThreshold: 3 readiness: initialDelaySeconds: 0 periodSeconds: 10 timeoutSeconds: 3 failureThreshold: 3 startup: initialDelaySeconds: 60 periodSeconds: 10 timeoutSeconds: 20 failureThreshold: 30 service: type: ClusterIP port: 443 nodePort: "" ingress: enabled: false className: "" annotations: {} hosts: - host: ivia-wrp.example.com paths: - path: / pathType: Prefix tls: [] resources: {} tolerations: [] affinity: {} podAnnotations: {} # Runtime container settings (disabled for this example) runtime: enabled: false - ibmvia-autoconf.yaml:
# IBM Confidential # PID 5725-V89 5725-V90 5737-F02 # # Copyright IBM Corp. 2026, 2026 version: 1 container: ssl_certificates: - name: pdsrv personal_certificates: - p12_file: !secret:tofile ivia-wrp-certificate-secret:keystore.p12 secret: !secret ivia-passwords:wrp_pkcs12_password name: server - name: isvd signer_certificates: - !secret:tofile ivia-isvd-certificate-secret:ca.crt activation: webseal: !secret ivia-passwords:webseal_activation lmi_certificate: p12: !secret:tofile ivia-config-certificate-secret:keystore.p12 password: !secret ivia-passwords:config_pkcs12_password webseal: runtime: policy_server: "ldap" user_registry: "ldap" ldap: host: "ivia-isvd" port: 636 dn: "cn=root" dn_password: !secret ivia-passwords:isvd_admin key_file: "isvd" override_config: True domain: "Default" admin_user: "sec_master" admin_password: !secret ivia-passwords:runtime_admin admin_cert_lifetime: 1460 ssl_compliance: "fips" reverse_proxy: - name: "default" host: "sample.wrp.ibm.com" http: enabled: "no" https: enabled: "yes" port: "9443" domain: "Default" ldap: ssl: "yes" port: 636 key_file: "isvd" stanza_configuration: - stanza: "ssl" entry_id: "webseal-cert-keyfile-label" value: "server" operation: "update"
The key configuration notes are:
certificates.enabled: true: Enables the use of cert-manager for automatic certificate generation.onfigCaCertificate.verify: true: Enables verification of the CA certificate.- External LDAP: Configured to use IBM Security Verify Directory (ISVD) as the user registry.
- SSL certificates: Multiple certificate keystores are configured for different components.
version: 1: Indicates the configuration version; increment this value when secrets change.- Image tags:
11.0.3.0: Specifies the container images sourced fromicr.io/ivia. runtime.enabled: false: Indicates that the runtime service is not deployed in this configuration.
- Deployment steps
- You must deploy an external LDAP server such as ISVD before the deployment. To deploy Verify Identity Access:
- Create a new namespace:
kubectl create namespace ivia-autoconf - Create the required secrets:
kubectl create secret generic ivia-passwords \ --namespace ivia-autoconf \ --from-literal=cfgsvc=Passw0rd \ --from-literal=config_pkcs12_password=Passw0rd \ --from-literal=wrp_pkcs12_password=Passw0rd \ --from-literal=runtime_admin=Passw0rd \ --from-literal=isvd_admin=Passw0rd \ --from-literal=webseal_activation=<activation-code> - Install the cert-manager:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml # Wait for cert-manager to be ready kubectl wait --for=condition=Available --timeout=300s \ deployment/cert-manager -n cert-manager - Deploy with Helm chart:
helm install ivia-deployment oci://icr.io/ivia/ivia-autoconf-helm \ --version 11.0.3.0 \ --namespace ivia-autoconf \ --values values.yaml \ --set-file autoconf.content=ibmvia-autoconf.yaml - Verify the deployment:
# Check all pods kubectl get pods -n ivia-autoconf # Expected output: # NAME READY STATUS RESTARTS AGE # ivia-config-xxxxxxxxxx-xxxxx 1/1 Running 0 2m # ivia-isvd-xxxxxxxxxx-xxxxx 1/1 Running 0 5m # ivia-wrp-xxxxxxxxxx-xxxxx 1/1 Running 0 2m # Check certificates were generated kubectl get certificate -n ivia-autoconf # Check services kubectl get svc -n ivia-autoconf # View WRP logs to verify LDAP connection kubectl logs -n ivia-autoconf -l app=ivia-wrp -f # Access the WRP (port-forward for testing) kubectl port-forward -n ivia-autoconf svc/ivia-wrp 9443:443 # Open browser to https://localhost:9443 - Update the configuration:
# Example: Update LDAP connection settings vim ibmvia-autoconf.yaml # Increment version number (important!) # Change: version: 2 # To: version: 3 # Upgrade deployment helm upgrade ivia-deployment oci://icr.io/ivia/ivia-autoconf-helm \ --namespace ivia-autoconf \ --values values.yaml \ --set-file autoconf.content=ibmvia-autoconf.yaml # Watch pods restart with new configuration kubectl get pods -n ivia-autoconf -w - To cleanup after the deployment:
# Uninstall Helm release helm uninstall ivia-deployment -n ivia-autoconf # Delete namespace (removes all resources) kubectl delete namespace ivia-autoconf
- Create a new namespace: