diff --git a/jsonnet/kube-prometheus/kube-prometheus-insecure-kubelet.libsonnet b/jsonnet/kube-prometheus/kube-prometheus-insecure-kubelet.libsonnet
index ab5dceae5c3e9330ba8799a5fad242bfb532db8b..73d0b9d741e9413425d56ee643f754af6039279d 100644
--- a/jsonnet/kube-prometheus/kube-prometheus-insecure-kubelet.libsonnet
+++ b/jsonnet/kube-prometheus/kube-prometheus-insecure-kubelet.libsonnet
@@ -10,10 +10,7 @@
               interval: '30s',
               bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
               relabelings: [
-                {
-                  sourceLabels: ['__metrics_path__'],
-                  targetLabel: 'metrics_path'
-                },
+                { sourceLabels: ['__metrics_path__'], targetLabel: 'metrics_path' },
               ],
             },
             {
@@ -24,10 +21,7 @@
               honorLabels: true,
               bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
               relabelings: [
-                {
-                  sourceLabels: ['__metrics_path__'],
-                  targetLabel: 'metrics_path'
-                },
+                { sourceLabels: ['__metrics_path__'], targetLabel: 'metrics_path' },
               ],
               metricRelabelings: [
                 // Drop a bunch of metrics which are disabled but still sent, see
diff --git a/jsonnet/kube-prometheus/kube-prometheus-kops-coredns.libsonnet b/jsonnet/kube-prometheus/kube-prometheus-kops-coredns.libsonnet
index 37760404511b502fe96488ae267d3ab6aff28d82..7311c366d555bdae094899bc0ad1a03686008a8d 100644
--- a/jsonnet/kube-prometheus/kube-prometheus-kops-coredns.libsonnet
+++ b/jsonnet/kube-prometheus/kube-prometheus-kops-coredns.libsonnet
@@ -1,13 +1,20 @@
-local k = import 'github.com/ksonnet/ksonnet-lib/ksonnet.beta.4/k.libsonnet';
-local service = k.core.v1.service;
-local servicePort = k.core.v1.service.mixin.spec.portsType;
-
 {
   prometheus+:: {
-      kubeDnsPrometheusDiscoveryService:
-      service.new('kube-dns-prometheus-discovery', { 'k8s-app': 'kube-dns' }, [servicePort.newNamed('metrics', 9153, 9153)]) +
-      service.mixin.metadata.withNamespace('kube-system') +
-      service.mixin.metadata.withLabels({ 'k8s-app': 'kube-dns' }) +
-      service.mixin.spec.withClusterIp('None'),
+    kubeDnsPrometheusDiscoveryService: {
+      apiVersion: 'v1',
+      kind: 'Service',
+      metadata: {
+        name: 'kube-dns-prometheus-discovery',
+        namespace: 'kube-system',
+        labels: { 'k8s-app': 'kube-dns' },
+      },
+      spec: {
+        ports: [
+          { name: 'metrics', port: 9153, targetPort: 9153 },
+        ],
+        selector: { 'k8s-app': 'kube-dns' },
+        cluserAPI: 'None',
+      },
+    },
   },
 }
diff --git a/jsonnet/kube-prometheus/kube-prometheus-kops.libsonnet b/jsonnet/kube-prometheus/kube-prometheus-kops.libsonnet
index 9f9bb9503c0c6f0480ea9ae25431f1a7d5e1aa86..8db8c2990e139dae27b7e8d46f02ed875018c421 100644
--- a/jsonnet/kube-prometheus/kube-prometheus-kops.libsonnet
+++ b/jsonnet/kube-prometheus/kube-prometheus-kops.libsonnet
@@ -1,23 +1,40 @@
-local k = import 'github.com/ksonnet/ksonnet-lib/ksonnet.beta.4/k.libsonnet';
-local service = k.core.v1.service;
-local servicePort = k.core.v1.service.mixin.spec.portsType;
+local service(name, namespace, labels, selector, ports) = {
+  apiVersion: 'v1',
+  kind: 'Service',
+  metadata: {
+    name: name,
+    namespace: namespace,
+    labels: labels,
+  },
+  spec: {
+    ports+: ports,
+    selector: selector,
+    clusterIP: 'None',
+  },
+};
 
 {
   prometheus+:: {
-    kubeControllerManagerPrometheusDiscoveryService:
-      service.new('kube-controller-manager-prometheus-discovery', { 'k8s-app': 'kube-controller-manager' }, servicePort.newNamed('https-metrics', 10257, 10257)) +
-      service.mixin.metadata.withNamespace('kube-system') +
-      service.mixin.metadata.withLabels({ 'k8s-app': 'kube-controller-manager' }) +
-      service.mixin.spec.withClusterIp('None'),
-    kubeSchedulerPrometheusDiscoveryService:
-      service.new('kube-scheduler-prometheus-discovery', { 'k8s-app': 'kube-scheduler' }, servicePort.newNamed('https-metrics', 10259, 10259)) +
-      service.mixin.metadata.withNamespace('kube-system') +
-      service.mixin.metadata.withLabels({ 'k8s-app': 'kube-scheduler' }) +
-      service.mixin.spec.withClusterIp('None'),
-    kubeDnsPrometheusDiscoveryService:
-      service.new('kube-dns-prometheus-discovery', { 'k8s-app': 'kube-dns' }, [servicePort.newNamed('metrics', 10055, 10055), servicePort.newNamed('http-metrics-dnsmasq', 10054, 10054)]) +
-      service.mixin.metadata.withNamespace('kube-system') +
-      service.mixin.metadata.withLabels({ 'k8s-app': 'kube-dns' }) +
-      service.mixin.spec.withClusterIp('None'),
+    kubeControllerManagerPrometheusDiscoveryService: service(
+      'kube-controller-manager-prometheus-discovery',
+      'kube-system',
+      { 'k8s-app': 'kube-controller-manager' },
+      { 'k8s-app': 'kube-controller-manager' },
+      [{ name: 'https-metrics', port: 10257, targetPort: 10257 }]
+    ),
+    kubeSchedulerPrometheusDiscoveryService: service(
+      'kube-controller-manager-prometheus-discovery',
+      'kube-system',
+      { 'k8s-app': 'kube-scheduler' },
+      { 'k8s-app': 'kube-scheduler' },
+      [{ name: 'https-metrics', port: 10259, targetPort: 10259 }]
+    ),
+    kubeDnsPrometheusDiscoveryService: service(
+      'kube-controller-manager-prometheus-discovery',
+      'kube-system',
+      { 'k8s-app': 'kube-dns' },
+      { 'k8s-app': 'kube-dns' },
+      [{ name: 'metrics', port: 10055, targetPort: 10055 }, { name: 'http-metrics-dnsmasq', port: 10054, targetPort: 10054 }]
+    ),
   },
 }
diff --git a/jsonnet/kube-prometheus/kube-prometheus-kube-aws.libsonnet b/jsonnet/kube-prometheus/kube-prometheus-kube-aws.libsonnet
index bd7ea6caa845d8fe7170503cde85277f71d3d0af..ae8d364d2492cf6a05037430ff925187913d3b6b 100644
--- a/jsonnet/kube-prometheus/kube-prometheus-kube-aws.libsonnet
+++ b/jsonnet/kube-prometheus/kube-prometheus-kube-aws.libsonnet
@@ -1,18 +1,33 @@
-local k = import 'github.com/ksonnet/ksonnet-lib/ksonnet.beta.4/k.libsonnet';
-local service = k.core.v1.service;
-local servicePort = k.core.v1.service.mixin.spec.portsType;
+local service(name, namespace, labels, selector, ports) = {
+  apiVersion: 'v1',
+  kind: 'Service',
+  metadata: {
+    name: name,
+    namespace: namespace,
+    labels: labels,
+  },
+  spec: {
+    ports+: ports,
+    selector: selector,
+    clusterIP: 'None',
+  },
+};
 
 {
   prometheus+: {
-    kubeControllerManagerPrometheusDiscoveryService:
-      service.new('kube-controller-manager-prometheus-discovery', { 'k8s-app': 'kube-controller-manager' }, servicePort.newNamed('https-metrics', 10257, 10257)) +
-      service.mixin.metadata.withNamespace('kube-system') +
-      service.mixin.metadata.withLabels({ 'k8s-app': 'kube-controller-manager' }) +
-      service.mixin.spec.withClusterIp('None'),
-    kubeSchedulerPrometheusDiscoveryService:
-      service.new('kube-scheduler-prometheus-discovery', { 'k8s-app': 'kube-scheduler' }, servicePort.newNamed('https-metrics', 10259, 10259)) +
-      service.mixin.metadata.withNamespace('kube-system') +
-      service.mixin.metadata.withLabels({ 'k8s-app': 'kube-scheduler' }) +
-      service.mixin.spec.withClusterIp('None'),
+    kubeControllerManagerPrometheusDiscoveryService: service(
+      'kube-controller-manager-prometheus-discovery',
+      'kube-system',
+      { 'k8s-app': 'kube-controller-manager' },
+      { 'k8s-app': 'kube-controller-manager' },
+      [{ name: 'https-metrics', port: 10257, targetPort: 10257 }],
+    ),
+    kubeSchedulerPrometheusDiscoveryService: service(
+      'kube-scheduler-prometheus-discovery',
+      'kube-system',
+      { 'k8s-app': 'kube-scheduler' },
+      { 'k8s-app': 'kube-scheduler' },
+      [{ name: 'https-metrics', port: 10259, targetPort: 10259 }],
+    ),
   },
 }
diff --git a/jsonnet/kube-prometheus/kube-prometheus-kubeadm.libsonnet b/jsonnet/kube-prometheus/kube-prometheus-kubeadm.libsonnet
index 1481c596842b2a29a9189584b95c8b6bb04de481..0eccc939c2f3e5a6ef395cf6e40ed2bb0ec0f58d 100644
--- a/jsonnet/kube-prometheus/kube-prometheus-kubeadm.libsonnet
+++ b/jsonnet/kube-prometheus/kube-prometheus-kubeadm.libsonnet
@@ -1,18 +1,33 @@
-local k = import 'github.com/ksonnet/ksonnet-lib/ksonnet.beta.4/k.libsonnet';
-local service = k.core.v1.service;
-local servicePort = k.core.v1.service.mixin.spec.portsType;
+local service(name, namespace, labels, selector, ports) = {
+  apiVersion: 'v1',
+  kind: 'Service',
+  metadata: {
+    name: name,
+    namespace: namespace,
+    labels: labels,
+  },
+  spec: {
+    ports+: ports,
+    selector: selector,
+    clusterIP: 'None',
+  },
+};
 
 {
   prometheus+: {
-    kubeControllerManagerPrometheusDiscoveryService:
-      service.new('kube-controller-manager-prometheus-discovery', { component: 'kube-controller-manager' }, servicePort.newNamed('https-metrics', 10257, 10257)) +
-      service.mixin.metadata.withNamespace('kube-system') +
-      service.mixin.metadata.withLabels({ 'k8s-app': 'kube-controller-manager' }) +
-      service.mixin.spec.withClusterIp('None'),
-    kubeSchedulerPrometheusDiscoveryService:
-      service.new('kube-scheduler-prometheus-discovery', { component: 'kube-scheduler' }, servicePort.newNamed('https-metrics', 10259, 10259)) +
-      service.mixin.metadata.withNamespace('kube-system') +
-      service.mixin.metadata.withLabels({ 'k8s-app': 'kube-scheduler' }) +
-      service.mixin.spec.withClusterIp('None'),
+    kubeControllerManagerPrometheusDiscoveryService: service(
+      'kube-controller-manager-prometheus-discovery',
+      'kube-system',
+      { 'k8s-app': 'kube-controller-manager' },
+      { 'k8s-app': 'kube-controller-manager' },
+      [{ name: 'https-metrics', port: 10257, targetPort: 10257 }]
+    ),
+    kubeSchedulerPrometheusDiscoveryService: service(
+      'kube-scheduler-prometheus-discovery',
+      'kube-system',
+      { 'k8s-app': 'kube-scheduler' },
+      { 'k8s-app': 'kube-scheduler' },
+      [{ name: 'https-metrics', port: 10259, targetPort: 10259 }],
+    ),
   },
 }
diff --git a/jsonnet/kube-prometheus/kube-prometheus-kubespray.libsonnet b/jsonnet/kube-prometheus/kube-prometheus-kubespray.libsonnet
index fbda4a9eb432b2dfc98417f15d73220e7882b300..c1e7682d57842bfa039cec4bf20c6cca11e93849 100644
--- a/jsonnet/kube-prometheus/kube-prometheus-kubespray.libsonnet
+++ b/jsonnet/kube-prometheus/kube-prometheus-kubespray.libsonnet
@@ -1,20 +1,36 @@
-local k = import 'github.com/ksonnet/ksonnet-lib/ksonnet.beta.4/k.libsonnet';
-local service = k.core.v1.service;
-local servicePort = k.core.v1.service.mixin.spec.portsType;
+local service(name, namespace, labels, selector, ports) = {
+  apiVersion: 'v1',
+  kind: 'Service',
+  metadata: {
+    name: name,
+    namespace: namespace,
+    labels: labels,
+  },
+  spec: {
+    ports+: ports,
+    selector: selector,
+    clusterIP: 'None',
+  },
+};
 
 {
 
   prometheus+: {
-    kubeControllerManagerPrometheusDiscoveryService:
-      service.new('kube-controller-manager-prometheus-discovery', { 'component': 'kube-controller-manager' }, servicePort.newNamed('https-metrics', 10257, 10257)) +
-      service.mixin.metadata.withNamespace('kube-system') +
-      service.mixin.metadata.withLabels({ 'k8s-app': 'kube-controller-manager' }) +
-      service.mixin.spec.withClusterIp('None'),
-    kubeSchedulerPrometheusDiscoveryService:
-      service.new('kube-scheduler-prometheus-discovery', { 'component': 'kube-scheduler' }, servicePort.newNamed('https-metrics', 10259, 10259)) +
-      service.mixin.metadata.withNamespace('kube-system') +
-      service.mixin.metadata.withLabels({ 'k8s-app': 'kube-scheduler' }) +
-      service.mixin.spec.withClusterIp('None'),
+    kubeControllerManagerPrometheusDiscoveryService: service(
+      'kube-controller-manager-prometheus-discovery',
+      'kube-system',
+      { 'k8s-app': 'kube-controller-manager' },
+      { 'k8s-app': 'kube-controller-manager' },
+      [{ name: 'https-metrics', port: 10257, targetPort: 10257 }]
+    ),
+
+    kubeSchedulerPrometheusDiscoveryService: service(
+      'kube-scheduler-prometheus-discovery',
+      'kube-system',
+      { 'k8s-app': 'kube-scheduler' },
+      { 'k8s-app': 'kube-scheduler' },
+      [{ name: 'https-metrics', port: 10259, targetPort: 10259 }],
+    ),
 
     serviceMonitorKubeScheduler+: {
       spec+: {
diff --git a/jsonnet/kube-prometheus/kube-prometheus-node-ports.libsonnet b/jsonnet/kube-prometheus/kube-prometheus-node-ports.libsonnet
index 13901307363277b123474be706422cbf7c9f2a77..b936901111317466acc54e19b73dee337a1771f8 100644
--- a/jsonnet/kube-prometheus/kube-prometheus-node-ports.libsonnet
+++ b/jsonnet/kube-prometheus/kube-prometheus-node-ports.libsonnet
@@ -1,21 +1,18 @@
-local k = import 'github.com/ksonnet/ksonnet-lib/ksonnet.beta.4/k.libsonnet';
-local service = k.core.v1.service;
-local servicePort = k.core.v1.service.mixin.spec.portsType;
+local patch(ports) = {
+  spec+: {
+    ports+: ports,
+    type: 'NodePort',
+  },
+};
 
 {
   prometheus+: {
-    service+:
-      service.mixin.spec.withPorts(servicePort.newNamed('web', 9090, 'web') + servicePort.withNodePort(30900)) +
-      service.mixin.spec.withType('NodePort'),
+    service+: patch([{ name: 'web', port: 9090, targetPort: 'web', nodePort: 30900 }]),
   },
   alertmanager+: {
-    service+:
-      service.mixin.spec.withPorts(servicePort.newNamed('web', 9093, 'web') + servicePort.withNodePort(30903)) +
-      service.mixin.spec.withType('NodePort'),
+    service+: patch([{ name: 'web', port: 9093, targetPort: 'web', nodePort: 30903 }]),
   },
   grafana+: {
-    service+:
-      service.mixin.spec.withPorts(servicePort.newNamed('http', 3000, 'http') + servicePort.withNodePort(30902)) +
-      service.mixin.spec.withType('NodePort'),
+    service+: patch([{ name: 'http', port: 3000, targetPort: 'http', nodePort: 30902 }]),
   },
 }