Deploy to Production
Deploy
Section titled “Deploy”Deploy the bundle you built in the previous step and verify that all components come up healthy.
-
Run the deploy command
Terminal window uds deploy uds-bundle-my-uds-core-*.tar.zst --confirmIf you are using a
uds-config.yamlfor variables, UDS CLI picks it 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”Confirm that all UDS Core components deployed successfully.
-
Check pod health
Terminal window # All pods should be Running or Completeduds zarf tools kubectl 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 uds zarf tools 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 uds zarf tools kubectl get svc -n istio-tenant-gatewayuds zarf tools kubectl 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”This usually indicates insufficient cluster resources or a missing storage class.
uds zarf tools kubectl describe pod <pod-name> -n <namespace>Look for Insufficient cpu, Insufficient memory, or no persistent volumes available in the events.
Loki or Velero fails to start
Section titled “Loki or Velero fails to start”Incorrect object storage credentials or an unreachable storage endpoint often cause this. Check the pod logs:
uds zarf tools kubectl logs -n logging -l app.kubernetes.io/name=loki --tail=50uds zarf tools kubectl 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 does not load
Section titled “Keycloak does not load”Verify the following:
- The Keycloak pod is
Running:uds zarf tools kubectl get pods -n keycloak - DNS resolves to the load balancer IP
- The TLS certificate is valid for your admin domain
Keycloak fails to connect to database
Section titled “Keycloak fails to connect to database”If Keycloak is running but crashing on startup, check the logs for database connection errors:
uds zarf tools 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”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.