Deploy to Production
Deploy
Section titled “Deploy”-
Run the deploy command
Terminal window uds deploy uds-bundle-my-uds-core-*.tar.zst --confirmIf you are using a
uds-config.yamlfor variables, it is picked up automatically from the current directory. You can also specify it explicitly:Terminal window UDS_CONFIG=uds-config.yaml uds deploy uds-bundle-my-uds-core-*.tar.zst --confirm -
Watch the rollout
In a separate terminal, monitor the deployment as packages come up:
Terminal window watch kubectl get pods -AOr use k9s:
Terminal window uds zarf tools monitorDeployment order follows the package order in your bundle. The
initpackage comes first (Zarf registry, agent), followed bycore.Full deployment time varies based on cluster resources and image pull speed. Expect 10–30 minutes for a first deployment to a fresh cluster.
Verify
Section titled “Verify”-
Check pod health
Terminal window # All pods should be Running or Completedkubectl get pods -A --no-headers | grep -Ev '(Running|Completed)'Any pods stuck in
Pending,CrashLoopBackOff, orErrorstate indicate a problem. See Common Issues below. -
Confirm namespaces
Terminal window kubectl get namespacesExpected namespaces:
Namespace Component istio-systemIstio control plane istio-tenant-gatewayTenant ingress gateway istio-admin-gatewayAdmin ingress gateway keycloakKeycloak identity provider authserviceAuthservice SSO for mission applications monitoringPrometheus, Alertmanager, Blackbox Exporter grafanaGrafana loggingLoki log storage vectorVector log aggregation veleroVelero backup controller falcoFalco runtime security pepr-systemUDS Operator (Pepr) -
Verify Istio gateways
Terminal window kubectl get svc -n istio-tenant-gatewaykubectl get svc -n istio-admin-gatewayBoth
LoadBalancerservices should have anEXTERNAL-IPassigned. If they show<pending>, your load balancer provisioner may not be configured correctly. -
Configure DNS records
Now that the gateways have external IPs, create (or update) your wildcard DNS records to point to them:
Record Type Value *.yourdomain.comA (or CNAME) Tenant gateway EXTERNAL-IP*.admin.yourdomain.comA (or CNAME) Admin gateway EXTERNAL-IP -
Access the admin UIs
Once DNS is resolving to your load balancer, access:
Service URL Keycloak https://keycloak.<your-admin-domain>Grafana https://grafana.<your-admin-domain>The Keycloak admin console login verifies that identity and ingress are working end-to-end.
Common Issues
Section titled “Common Issues”Pods stuck in Pending
Section titled “Pods stuck in Pending”Usually indicates insufficient cluster resources or a missing storage class.
kubectl describe pod <pod-name> -n <namespace>Look for Insufficient cpu, Insufficient memory, or no persistent volumes available in the events.
Loki or Velero failing to start
Section titled “Loki or Velero failing to start”Often caused by incorrect object storage credentials or unreachable storage endpoint. Check the pod logs:
kubectl logs -n logging -l app.kubernetes.io/name=loki --tail=50kubectl logs -n velero -l app.kubernetes.io/name=velero --tail=50Istio gateway EXTERNAL-IP stuck in <pending>
Section titled “Istio gateway EXTERNAL-IP stuck in <pending>”Your load balancer provisioner is not assigning IPs. Verify the provisioner is installed and configured in your cluster. For on-premises deployments, ensure MetalLB or kube-vip is running and has an IP pool configured.
Keycloak not loading
Section titled “Keycloak not loading”Check that:
- The Keycloak pod is
Running:kubectl get pods -n keycloak - DNS resolves to the load balancer IP
- The TLS certificate is valid for your admin domain
Keycloak failing to connect to database
Section titled “Keycloak failing to connect to database”If Keycloak is running but crashing on startup, check the logs for database connection errors:
kubectl logs -n keycloak -l app.kubernetes.io/name=keycloak --tail=50Common causes: incorrect hostname, wrong credentials, database user lacks privileges, or the database server is not reachable from the cluster. Verify the values in your uds-config.yaml match what was provisioned in the Provision External Services step.
You’re Done
Section titled “You’re Done”Congratulations — you’ve completed the UDS Core production deployment tutorial. You’ve provisioned the external services, built a production bundle, and deployed UDS Core to your cluster.
Here’s what you’ve stood up:
- Istio service mesh with admin and tenant ingress gateways, TLS-terminated with your certificates
- Keycloak identity provider backed by an external database
- Authservice providing SSO flows for your mission applications
- Loki log storage with Vector for log aggregation, backed by persistent object storage
- Velero cluster backups configured to your storage backend
- Prometheus, Grafana, Alertmanager for platform observability
- Falco for runtime security
From here, explore the How-To Guides for topics like configuring log retention, setting up SSO, and managing policy exemptions. To configure high availability for UDS Core components, see the High Availability Overview.