argo-events
Event-driven workflow automation for Kubernetes
Component Information
| Property | Value |
|---|---|
| Chart Version | 2.4.12 |
| Chart Type | application |
| Upstream Project | argo-events |
| Maintainers | Platform Engineering Team (repo) |
Why Argo Events?
Argo Events is the shared nervous system of the IDP Blueprint. It listens to Kubernetes, Git,
and external systems, then fans out triggers to Argo Workflows, ArgoCD, or any HTTP target.
The stack is deployed from K8s/events/* and synchronized through task stacks:events, so
every environment boots the same event bus, governance objects, and controller configuration.
The event-driven model decouples producers from consumers. Event sources emit events to a bus, sensors listen to the bus and trigger actions. This pattern enables reactive automation: Git pushes trigger CI/CD workflows, certificate renewals trigger application restarts, and SLO breaches trigger remediation workflows.
Argo Events integrates with the Argo ecosystem (Workflows and ArgoCD), making it a natural fit for GitOps-based platforms. Event sources and sensors are Kubernetes resources, so they’re versioned in Git and deployed declaratively.
Architecture Role
Argo Events operates at Layer 2 of the platform, the Automation & Governance layer. It provides event-driven orchestration across all platform components.
Key integration points:
- Argo Workflows: Sensors trigger workflow templates based on events
- ArgoCD: Events can trigger intelligent application syncs
- Git Providers: Webhook event sources listen to repository events
- Prometheus/Alertmanager: Alert events trigger remediation workflows
- NATS EventBus: Internal message bus for event distribution
The configuration uses a three-node NATS cluster as the default EventBus. All event sources publish to this bus, and all sensors subscribe to it. This provides reliable event delivery with at-least-once semantics.
See CI/CD Model for how Argo Events integrates into the platform automation.
Scheduling & Reliability
- Both controller and webhook use the
platform-eventsPriorityClass and pin to control-plane nodes through node affinity and tolerations so automation continues even if worker nodes are under pressure (values.yaml). - Rolling updates use
maxUnavailable: 0/maxSurge: 1to enforce zero-downtime restarts for the controller. - The EventBus (
eventbus.yaml) provisions a three-node NATS cluster with token auth; it is the single default bus referenced by all Sensors.
Building Sensors and Event Sources
- Create a folder under
K8s/events/<source>-<purpose>/. - Add
EventSourceandSensormanifests that point to thedefaultEventBus. - Label everything with the canonical metadata (
app.kubernetes.io/part-of: idp,owner: platform-team, etc.) and include governance files if the folder introduces its own namespace. - Commit and let the ApplicationSet reconcile it—no manual registration is required.
Common recipes:
- Git webhooks → trigger Argo Workflows templates or invoke the ArgoCD API for intelligent syncs.
- Alertmanager or Prometheus burn-rate alerts → Sensor that dispatches remediation workflows.
- Cron-style schedules →
Calendartrigger to fan out maintenance jobs.
Event Source Types
Argo Events supports multiple event source types:
| Type | Use Case | Example |
|---|---|---|
| Webhook | HTTP endpoints for external systems | GitHub push events |
| Calendar | Cron-like scheduled events | Periodic backups |
| Resource | Kubernetes resource changes | ConfigMap updates |
| AMQP | Message queue events | RabbitMQ, Azure Service Bus |
| Kafka | Stream processing | High-throughput event streams |
| NATS | Pub/sub messaging | Inter-service communication |
| Redis | Cache and pub/sub | Session events |
| AWS SNS/SQS | Cloud events | AWS service notifications |
| GCP Pub/Sub | Cloud events | GCP service notifications |
Sensor Patterns
Sensors define what happens when events occur:
Trigger Argo Workflow
apiVersion: argoproj.io/v1alpha1kind: Sensormetadata: name: git-push-workflowspec: dependencies: - name: github-push eventSourceName: github-webhook eventName: push triggers: - template: name: build-workflow argoWorkflow: operation: submit source: resource: apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: build- spec: workflowTemplateRef: name: docker-build-pushTrigger ArgoCD Sync
triggers: - template: name: argocd-sync http: url: http://argocd-server.argocd/api/v1/applications/my-app/sync method: POST headers: Authorization: Bearer <token>```text
### Fan-Out Pattern
```yamltriggers: - template: name: workflow-1 argoWorkflow: {...} - template: name: workflow-2 argoWorkflow: {...} - template: name: notification http: {...}Observability & Operations
- Metrics: the controller exposes
/metricson port7777; aServiceMonitorwith selectorprometheus: kube-prometheusis created automatically so Prometheus scrapes it. - Health:
kubectl -n argo-events get podsverifies controller/webhook readiness;kubectl -n argo-events get eventbusshows NATS replicas. - Event Sources:
kubectl -n argo-events get eventsourcelists configured event sources - Sensors:
kubectl -n argo-events get sensorlists active sensors - EventBus Status:
kubectl -n argo-events get eventbus default -o yamlshows NATS cluster health - Redeploy:
task stacks:eventsreapplies the ApplicationSet and Helm release; use it after changing values or adding new sources. - Cleanup/testing:
task deployalready includes the Events stack;task destroyremoves it with the rest of the platform.
Extending to Other Stacks
Treat Events as a cross-cutting concern:
- CI/CD: Workflows triggered by Sensor payloads instead of manual submissions.
- Security: Stream Trivy or Kyverno reports into Sensors for auto-ticketing or rollback automation.
- SRE automation: Watch Gateway/Certificate events and run recovery flows.
Design Sensors so they emit structured CloudEvents (or JSON payloads) that downstream tasks can parse consistently.
Security Considerations
- EventBus Authentication: The NATS EventBus uses token-based authentication to prevent unauthorized event publishing
- RBAC: Event sources and sensors require specific ServiceAccounts with minimal RBAC permissions
- Network Policies: Cilium network policies restrict event source webhook endpoints to authorized sources
- Secret Management: Webhook tokens and API keys are stored in Vault and synced via External Secrets Operator
Common Use Cases
Continuous Deployment Pipeline
GitHub Push Event → EventSource (webhook) → Sensor (filters by branch) → Argo Workflow (build + test + push image) → ArgoCD Sync (deploy to cluster)Automated Incident Response
Prometheus Alert → Alertmanager webhook → EventSource → Sensor (filters by severity) → Argo Workflow (remediation script) → Slack notificationScheduled Maintenance
Calendar EventSource (cron: 0 2 * * *) → Sensor → Argo Workflow (database backup) → Argo Workflow (cleanup old resources) → Notification on completionConfiguration Values
argo-events
Component Information
| Property | Value |
|---|---|
| Chart Version | 2.4.12 |
| Chart Type | `` |
| Upstream Project | N/A |
Configuration Values
The following table lists the configurable parameters:
Values
| Key | Type | Default | Description |
|---|---|---|---|
| controller.affinity | object | {"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-role.kubernetes.io/control-plane","operator":"Exists"}]}]}}} |
Node affinity for controller (schedule on control-plane for stability) |
| controller.deploymentStrategy | object | {"rollingUpdate":{"maxSurge":1,"maxUnavailable":0},"type":"RollingUpdate"} |
Rolling update strategy for zero-downtime updates |
| controller.deploymentStrategy.rollingUpdate.maxSurge | int | 1 |
Maximum surge pods during update |
| controller.deploymentStrategy.rollingUpdate.maxUnavailable | int | 0 |
Maximum unavailable pods during update (0 for zero-downtime) |
| controller.metrics | object | {"enabled":true,"path":"/metrics","port":7777,"serviceMonitor":{"additionalLabels":{"prometheus":"kube-prometheus"},"enabled":true}} |
Metrics configuration for the controller |
| controller.metrics.enabled | bool | true |
Enable Prometheus metrics endpoint |
| controller.metrics.path | string | "/metrics" |
Path for metrics endpoint |
| controller.metrics.port | int | 7777 |
Port for metrics endpoint |
| controller.metrics.serviceMonitor.additionalLabels | object | {"prometheus":"kube-prometheus"} |
Additional labels for ServiceMonitor |
| controller.metrics.serviceMonitor.additionalLabels.prometheus | string | "kube-prometheus" |
Prometheus selector label |
| controller.metrics.serviceMonitor.enabled | bool | true |
Create ServiceMonitor for controller metrics |
| controller.priorityClassName | string | "platform-events" |
Priority class for controller pods |
| controller.replicas | int | 1 |
Number of controller replicas |
| controller.resources | object | {"limits":{"cpu":"200m","memory":"256Mi"},"requests":{"cpu":"50m","memory":"64Mi"}} |
Resource requests and limits for the controller |
| controller.resources.limits.cpu | string | "200m" |
CPU limit for the controller |
| controller.resources.limits.memory | string | "256Mi" |
Memory limit for the controller |
| controller.resources.requests.cpu | string | "50m" |
CPU request for the controller |
| controller.resources.requests.memory | string | "64Mi" |
Memory request for the controller |
| controller.tolerations | list | [{"effect":"NoSchedule","key":"node-role.kubernetes.io/control-plane","operator":"Exists"}] |
Tolerations for controller to run on control-plane node |
| crds.install | bool | true |
Install Argo Events CRDs |
| crds.keep | bool | true |
Keep CRDs on chart uninstall |
| global.image | object | {"pullPolicy":"IfNotPresent"} |
Image pull policy for all components |
| webhook.affinity | object | {"nodeAffinity":{"requiredDuringSchedulingIgnoredDuringExecution":{"nodeSelectorTerms":[{"matchExpressions":[{"key":"node-role.kubernetes.io/control-plane","operator":"Exists"}]}]}}} |
Node affinity for webhook (schedule on control-plane for stability) |
| webhook.enabled | bool | true |
Enable the validating admission webhook |
| webhook.priorityClassName | string | "platform-events" |
Priority class for webhook pods |
| webhook.resources | object | {"limits":{"cpu":"100m","memory":"128Mi"},"requests":{"cpu":"25m","memory":"32Mi"}} |
Resource requests and limits for the webhook |
| webhook.resources.limits.cpu | string | "100m" |
CPU limit for the webhook |
| webhook.resources.limits.memory | string | "128Mi" |
Memory limit for the webhook |
| webhook.resources.requests.cpu | string | "25m" |
CPU request for the webhook |
| webhook.resources.requests.memory | string | "32Mi" |
Memory request for the webhook |
| webhook.tolerations | list | [{"effect":"NoSchedule","key":"node-role.kubernetes.io/control-plane","operator":"Exists"}] |
Tolerations for webhook to run on control-plane node |