Skip to content

Deploy Applications

This guide focuses on the workload side of application delivery. Use it when your Argo CD setup already exists and you want to make sure the Kubernetes resources you hand to Argo are ready for a clean rollout on Kupe Cloud.

For the Argo CD wiring itself, see Create Argo CD Applications.

Before a workload is promoted beyond a first test environment, it should usually have:

  • health probes
  • resource requests and limits
  • a Service for in-cluster traffic
  • an HTTPRoute if the app needs external traffic
  • structured logs and metrics where possible
  • everything defined in Git

This example shows a small web service with sensible runtime defaults:

apiVersion: apps/v1
kind: Deployment
metadata:
name: web
namespace: web
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
annotations:
k8s.grafana.com/scrape: "true"
k8s.grafana.com/metrics.path: "/metrics"
k8s.grafana.com/metrics.portNumber: "8080"
spec:
containers:
- name: web
image: ghcr.io/your-org/web:1.2.3
ports:
- containerPort: 8080
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
readinessProbe:
httpGet:
path: /readyz
port: 8080
livenessProbe:
httpGet:
path: /healthz
port: 8080
---
apiVersion: v1
kind: Service
metadata:
name: web
namespace: web
spec:
selector:
app: web
ports:
- port: 80
targetPort: 8080

Add an HTTPRoute that attaches to the shared public gateway:

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: web
namespace: web
spec:
parentRefs:
- name: external-gateway
namespace: kube-system
hostnames:
- web.<tenant>.kupe.cloud
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: web
port: 80

For custom domains, keep the same route model and follow Custom Domains.

Once Argo CD syncs the application, check the basics in order:

  1. Argo CD shows the app as Synced and Healthy.
  2. The workload reaches the expected replica count.
  3. Service endpoints are ready.
  4. The route is accepted if the app is exposed externally.
  5. Logs and metrics look normal after the rollout.

Useful cluster-side checks:

Terminal window
kubectl get deploy,pods,svc -n <namespace>
kubectl rollout status deploy/<name> -n <namespace>
kubectl get httproute -n <namespace>
  • the container is not listening on the port the Service expects
  • readiness or liveness probes point at the wrong path
  • resource limits are missing or too low for the workload
  • the application is deployed to the wrong namespace
  • the HTTPRoute points at the wrong Service or port
  • image pull credentials or image tags are wrong