diff --git a/hack/cluster-monitoring/deploy b/hack/cluster-monitoring/deploy
index 25220dd8aff9080c5922a30470b338207df76711..9620872abdc96a571fe84234d31d057a3c77d0c7 100755
--- a/hack/cluster-monitoring/deploy
+++ b/hack/cluster-monitoring/deploy
@@ -14,14 +14,26 @@ kctl() {
     kubectl --namespace "$NAMESPACE" "$@"
 }
 
-kctl create -f manifests/prometheus-operator.yaml
+kctl apply -f manifests/prometheus-operator.yaml
 
 # Wait for TPRs to be ready.
 until kctl get servicemonitor; do sleep 1; done
 until kctl get prometheus; do sleep 1; done
 until kctl get alertmanager; do sleep 1; done
 
-kctl create -f manifests/exporters
-kctl create -f manifests/grafana
-kctl create -f manifests/prometheus
-kctl create -f manifests/alertmanager
+kctl apply -f manifests/exporters
+kctl apply -f manifests/grafana
+
+kctl apply -f manifests/prometheus/prometheus-k8s-cm.yaml
+kctl apply -f manifests/prometheus/prometheus-k8s-rules.yaml
+kctl apply -f manifests/prometheus/prometheus-k8s-svc.yaml
+
+kctl apply -f manifests/alertmanager/alertmanager-config.yaml
+kctl apply -f manifests/alertmanager/alertmanager-service.yaml
+
+# `kubectl apply` is currently not working for third party resources so we are
+# using `kubectl create` here for the time being.
+# (https://github.com/kubernetes/kubernetes/issues/29542)
+kctl create -f manifests/prometheus/prometheus-k8s.yaml
+kctl create -f manifests/alertmanager/alertmanager.yaml
+
diff --git a/hack/cluster-monitoring/teardown b/hack/cluster-monitoring/teardown
index c8a60c9b421c5b30818f910f2fe79af1bda6b055..45ae61ed3dff044b9019806486d6cc1338bdccbc 100755
--- a/hack/cluster-monitoring/teardown
+++ b/hack/cluster-monitoring/teardown
@@ -21,3 +21,4 @@ kctl delete -f manifests/alertmanager
 sleep 5
 
 kctl delete -f manifests/prometheus-operator.yaml
+
diff --git a/hack/example-service-monitoring/deploy b/hack/example-service-monitoring/deploy
index 36b727544d3ddaa73c6275b2e12021a9d03358e3..9b359d2de14c91b94af615d743a9abf9bd5ac626 100755
--- a/hack/example-service-monitoring/deploy
+++ b/hack/example-service-monitoring/deploy
@@ -4,4 +4,8 @@ if [ -z "${KUBECONFIG}" ]; then
     KUBECONFIG=~/.kube/config
 fi
 
-kubectl --kubeconfig="$KUBECONFIG" create -f manifests/examples/example-app
\ No newline at end of file
+kubectl --kubeconfig="$KUBECONFIG" apply -f manifests/examples/example-app/prometheus-frontend-svc.yaml
+kubectl --kubeconfig="$KUBECONFIG" apply -f manifests/examples/example-app/example-app.yaml
+kubectl --kubeconfig="$KUBECONFIG" create -f manifests/examples/example-app/prometheus-frontend.yaml
+kubectl --kubeconfig="$KUBECONFIG" create -f manifests/examples/example-app/servicemonitor-frontend.yaml
+
diff --git a/hack/example-service-monitoring/teardown b/hack/example-service-monitoring/teardown
index 448ff8a826a986c51aef796b01a657b5b7b540a3..a7362eabcd4493c9dde8c958742b638efcf05f18 100755
--- a/hack/example-service-monitoring/teardown
+++ b/hack/example-service-monitoring/teardown
@@ -4,4 +4,5 @@ if [ -z "${KUBECONFIG}" ]; then
     KUBECONFIG=~/.kube/config
 fi
 
-kubectl --kubeconfig="$KUBECONFIG" delete -f manifests/examples/example-app
\ No newline at end of file
+kubectl --kubeconfig="$KUBECONFIG" delete -f manifests/examples/example-app
+
diff --git a/hack/scripts/generate-configmaps.sh b/hack/scripts/generate-configmaps.sh
index 50f3c9033ec05921b8475cc9517fd1926b76e8bd..6fb7b6e3801a7ea7169693fb0e952e825de1156c 100755
--- a/hack/scripts/generate-configmaps.sh
+++ b/hack/scripts/generate-configmaps.sh
@@ -8,3 +8,4 @@ kubectl create configmap --dry-run=true prometheus-k8s-rules --from-file=assets/
 
 # Generate Dashboard ConfigMap
 kubectl create configmap --dry-run=true grafana-dashboards --from-file=assets/grafana/ -oyaml > manifests/grafana/grafana-cm.yaml
+