diff --git a/jsonnet/kube-prometheus/jsonnetfile.json b/jsonnet/kube-prometheus/jsonnetfile.json
index 6fabeb583b0dc4a38f74c206dee9e7f7bfe59596..44e7f7fd890b78b42603fb7de0fe74e10d0bf610 100644
--- a/jsonnet/kube-prometheus/jsonnetfile.json
+++ b/jsonnet/kube-prometheus/jsonnetfile.json
@@ -69,6 +69,26 @@
                 }
             },
             "version": "master"
+        },
+        {
+            "name": "kube-state-metrics",
+            "source": {
+                "git": {
+                    "remote": "https://github.com/kubernetes/kube-state-metrics",
+                    "subdir": "jsonnet/kube-state-metrics"
+                }
+            },
+            "version": "master"
+        },
+        {
+            "name": "kube-state-metrics-mixin",
+            "source": {
+                "git": {
+                    "remote": "https://github.com/kubernetes/kube-state-metrics",
+                    "subdir": "jsonnet/kube-state-metrics-mixin"
+                }
+            },
+            "version": "master"
         }
     ]
 }
diff --git a/jsonnet/kube-prometheus/kube-prometheus.libsonnet b/jsonnet/kube-prometheus/kube-prometheus.libsonnet
index 0f3c5980143624f35e1951875cb6d3ee71f4e35f..00067dac4952285d83dbda584f22ef1e8edc17fd 100644
--- a/jsonnet/kube-prometheus/kube-prometheus.libsonnet
+++ b/jsonnet/kube-prometheus/kube-prometheus.libsonnet
@@ -4,6 +4,7 @@ local configMapList = k3.core.v1.configMapList;
 
 (import 'grafana/grafana.libsonnet') +
 (import 'kube-state-metrics/kube-state-metrics.libsonnet') +
+(import 'kube-state-metrics-mixin/mixin.libsonnet') +
 (import 'node-exporter/node-exporter.libsonnet') +
 (import 'node-mixin/mixin.libsonnet') +
 (import 'alertmanager/alertmanager.libsonnet') +
diff --git a/jsonnet/kube-prometheus/kube-state-metrics/kube-state-metrics.libsonnet b/jsonnet/kube-prometheus/kube-state-metrics/kube-state-metrics.libsonnet
index d7a4cd51674713966d9ede373f19a946adbc8861..3cde3aa15bc9e5117fcd71406dd6f358d706fc65 100644
--- a/jsonnet/kube-prometheus/kube-state-metrics/kube-state-metrics.libsonnet
+++ b/jsonnet/kube-prometheus/kube-state-metrics/kube-state-metrics.libsonnet
@@ -1,316 +1,43 @@
-local k = import 'ksonnet/ksonnet.beta.4/k.libsonnet';
-
 {
-  _config+:: {
-    namespace: 'default',
-
-    kubeStateMetrics+:: {
-      collectors: '',  // empty string gets a default set
-      scrapeInterval: '30s',
-      scrapeTimeout: '30s',
-    },
-
-    versions+:: {
-      kubeStateMetrics: 'v1.9.3',
-      kubeRbacProxy: 'v0.4.1',
-    },
-
-    imageRepos+:: {
-      kubeStateMetrics: 'quay.io/coreos/kube-state-metrics',
-      kubeRbacProxy: 'quay.io/coreos/kube-rbac-proxy',
-    },
-  },
-
-  kubeStateMetrics+:: {
-    clusterRoleBinding:
-      local clusterRoleBinding = k.rbac.v1.clusterRoleBinding;
-
-      clusterRoleBinding.new() +
-      clusterRoleBinding.mixin.metadata.withName('kube-state-metrics') +
-      clusterRoleBinding.mixin.roleRef.withApiGroup('rbac.authorization.k8s.io') +
-      clusterRoleBinding.mixin.roleRef.withName('kube-state-metrics') +
-      clusterRoleBinding.mixin.roleRef.mixinInstance({ kind: 'ClusterRole' }) +
-      clusterRoleBinding.withSubjects([{ kind: 'ServiceAccount', name: 'kube-state-metrics', namespace: $._config.namespace }]),
-
-    clusterRole:
-      local clusterRole = k.rbac.v1.clusterRole;
-      local rulesType = clusterRole.rulesType;
-
-      local rules = [
-        rulesType.new() +
-        rulesType.withApiGroups(['']) +
-        rulesType.withResources([
-          'configmaps',
-          'secrets',
-          'nodes',
-          'pods',
-          'services',
-          'resourcequotas',
-          'replicationcontrollers',
-          'limitranges',
-          'persistentvolumeclaims',
-          'persistentvolumes',
-          'namespaces',
-          'endpoints',
-        ]) +
-        rulesType.withVerbs(['list', 'watch']),
-
-        rulesType.new() +
-        rulesType.withApiGroups(['extensions']) +
-        rulesType.withResources([
-          'daemonsets',
-          'deployments',
-          'replicasets',
-          'ingresses',
-        ]) +
-        rulesType.withVerbs(['list', 'watch']),
-
-        rulesType.new() +
-        rulesType.withApiGroups(['apps']) +
-        rulesType.withResources([
-          'statefulsets',
-          'daemonsets',
-          'deployments',
-          'replicasets',
-        ]) +
-        rulesType.withVerbs(['list', 'watch']),
-
-        rulesType.new() +
-        rulesType.withApiGroups(['batch']) +
-        rulesType.withResources([
-          'cronjobs',
-          'jobs',
-        ]) +
-        rulesType.withVerbs(['list', 'watch']),
-
-        rulesType.new() +
-        rulesType.withApiGroups(['autoscaling']) +
-        rulesType.withResources([
-          'horizontalpodautoscalers',
-        ]) +
-        rulesType.withVerbs(['list', 'watch']),
-
-        rulesType.new() +
-        rulesType.withApiGroups(['authentication.k8s.io']) +
-        rulesType.withResources([
-          'tokenreviews',
-        ]) +
-        rulesType.withVerbs(['create']),
-
-        rulesType.new() +
-        rulesType.withApiGroups(['authorization.k8s.io']) +
-        rulesType.withResources([
-          'subjectaccessreviews',
-        ]) +
-        rulesType.withVerbs(['create']),
-
-        rulesType.new() +
-        rulesType.withApiGroups(['policy']) +
-        rulesType.withResources([
-          'poddisruptionbudgets',
-        ]) +
-        rulesType.withVerbs(['list', 'watch']),
-
-        rulesType.new() +
-        rulesType.withApiGroups(['certificates.k8s.io']) +
-        rulesType.withResources([
-          'certificatesigningrequests',
-        ]) +
-        rulesType.withVerbs(['list', 'watch']),
-
-        rulesType.new() +
-        rulesType.withApiGroups(['storage.k8s.io']) +
-        rulesType.withResources([
-          'storageclasses',
-          'volumeattachments',
-        ]) +
-        rulesType.withVerbs(['list', 'watch']),
-
-        rulesType.new() +
-        rulesType.withApiGroups(['admissionregistration.k8s.io']) +
-        rulesType.withResources([
-          'validatingwebhookconfigurations',
-          'mutatingwebhookconfigurations',
-        ]) +
-        rulesType.withVerbs(['list', 'watch']),
-
-        rulesType.new() +
-        rulesType.withApiGroups(['networking.k8s.io']) +
-        rulesType.withResources([
-          'networkpolicies',
-        ]) +
-        rulesType.withVerbs(['list', 'watch']),
-      ];
-
-      clusterRole.new() +
-      clusterRole.mixin.metadata.withName('kube-state-metrics') +
-      clusterRole.withRules(rules),
-    deployment:
-      local deployment = k.apps.v1.deployment;
-      local container = deployment.mixin.spec.template.spec.containersType;
-      local volume = deployment.mixin.spec.template.spec.volumesType;
-      local containerPort = container.portsType;
-      local containerVolumeMount = container.volumeMountsType;
-      local podSelector = deployment.mixin.spec.template.spec.selectorType;
-
-      local podLabels = { app: 'kube-state-metrics' };
-
-      local proxyClusterMetrics =
-        container.new('kube-rbac-proxy-main', $._config.imageRepos.kubeRbacProxy + ':' + $._config.versions.kubeRbacProxy) +
-        container.withArgs([
-          '--logtostderr',
-          '--secure-listen-address=:8443',
-          '--tls-cipher-suites=' + std.join(',', $._config.tlsCipherSuites),
-          '--upstream=http://127.0.0.1:8081/',
-        ]) +
-        container.withPorts(containerPort.newNamed(8443, 'https-main',)) +
-        container.mixin.resources.withRequests($._config.resources['kube-rbac-proxy'].requests) +
-        container.mixin.resources.withLimits($._config.resources['kube-rbac-proxy'].limits);
-
-      local proxySelfMetrics =
-        container.new('kube-rbac-proxy-self', $._config.imageRepos.kubeRbacProxy + ':' + $._config.versions.kubeRbacProxy) +
-        container.withArgs([
-          '--logtostderr',
-          '--secure-listen-address=:9443',
-          '--tls-cipher-suites=' + std.join(',', $._config.tlsCipherSuites),
-          '--upstream=http://127.0.0.1:8082/',
-        ]) +
-        container.withPorts(containerPort.newNamed(9443, 'https-self',)) +
-        container.mixin.resources.withRequests($._config.resources['kube-rbac-proxy'].requests) +
-        container.mixin.resources.withLimits($._config.resources['kube-rbac-proxy'].limits);
-
-      local kubeStateMetrics =
-        container.new('kube-state-metrics', $._config.imageRepos.kubeStateMetrics + ':' + $._config.versions.kubeStateMetrics) +
-        container.withArgs([
-          '--host=127.0.0.1',
-          '--port=8081',
-          '--telemetry-host=127.0.0.1',
-          '--telemetry-port=8082',
-        ] + if $._config.kubeStateMetrics.collectors != '' then ['--collectors=' + $._config.kubeStateMetrics.collectors] else []) +
-        container.mixin.resources.withRequests($._config.resources['kube-state-metrics'].requests) +
-        container.mixin.resources.withLimits($._config.resources['kube-state-metrics'].limits);
-
-      local c = [proxyClusterMetrics, proxySelfMetrics, kubeStateMetrics];
-
-      deployment.new('kube-state-metrics', 1, c, podLabels) +
-      deployment.mixin.metadata.withNamespace($._config.namespace) +
-      deployment.mixin.metadata.withLabels(podLabels) +
-      deployment.mixin.spec.selector.withMatchLabels(podLabels) +
-      deployment.mixin.spec.template.spec.withNodeSelector({ 'kubernetes.io/os': 'linux' }) +
-      deployment.mixin.spec.template.spec.securityContext.withRunAsNonRoot(true) +
-      deployment.mixin.spec.template.spec.securityContext.withRunAsUser(65534) +
-      deployment.mixin.spec.template.spec.withServiceAccountName('kube-state-metrics'),
-
-    roleBinding:
-      local roleBinding = k.rbac.v1.roleBinding;
-
-      roleBinding.new() +
-      roleBinding.mixin.metadata.withName('kube-state-metrics') +
-      roleBinding.mixin.metadata.withNamespace($._config.namespace) +
-      roleBinding.mixin.roleRef.withApiGroup('rbac.authorization.k8s.io') +
-      roleBinding.mixin.roleRef.withName('kube-state-metrics') +
-      roleBinding.mixin.roleRef.mixinInstance({ kind: 'Role' }) +
-      roleBinding.withSubjects([{ kind: 'ServiceAccount', name: 'kube-state-metrics' }]),
-
-    role:
-      local role = k.rbac.v1.role;
-      local rulesType = role.rulesType;
-
-      local coreRule = rulesType.new() +
-                       rulesType.withApiGroups(['']) +
-                       rulesType.withResources([
-                         'pods',
-                       ]) +
-                       rulesType.withVerbs(['get']);
-
-      local extensionsRule = rulesType.new() +
-                             rulesType.withApiGroups(['extensions']) +
-                             rulesType.withResources([
-                               'deployments',
-                             ]) +
-                             rulesType.withVerbs(['get', 'update']) +
-                             rulesType.withResourceNames(['kube-state-metrics']);
-
-      local appsRule = rulesType.new() +
-                       rulesType.withApiGroups(['apps']) +
-                       rulesType.withResources([
-                         'deployments',
-                       ]) +
-                       rulesType.withVerbs(['get', 'update']) +
-                       rulesType.withResourceNames(['kube-state-metrics']);
-
-      local rules = [coreRule, extensionsRule, appsRule];
-
-      role.new() +
-      role.mixin.metadata.withName('kube-state-metrics') +
-      role.mixin.metadata.withNamespace($._config.namespace) +
-      role.withRules(rules),
-
-    serviceAccount:
-      local serviceAccount = k.core.v1.serviceAccount;
-
-      serviceAccount.new('kube-state-metrics') +
-      serviceAccount.mixin.metadata.withNamespace($._config.namespace),
-
-    service:
-      local service = k.core.v1.service;
-      local servicePort = service.mixin.spec.portsType;
-
-      local ksmServicePortMain = servicePort.newNamed('https-main', 8443, 'https-main');
-      local ksmServicePortSelf = servicePort.newNamed('https-self', 9443, 'https-self');
-
-      service.new('kube-state-metrics', $.kubeStateMetrics.deployment.spec.selector.matchLabels, [ksmServicePortMain, ksmServicePortSelf]) +
-      service.mixin.metadata.withNamespace($._config.namespace) +
-      service.mixin.metadata.withLabels({ 'k8s-app': 'kube-state-metrics' }) +
-      service.mixin.spec.withClusterIp('None'),
-
-    serviceMonitor:
-      {
-        apiVersion: 'monitoring.coreos.com/v1',
-        kind: 'ServiceMonitor',
-        metadata: {
-          name: 'kube-state-metrics',
-          namespace: $._config.namespace,
-          labels: {
-            'k8s-app': 'kube-state-metrics',
-          },
-        },
-        spec: {
-          jobLabel: 'k8s-app',
-          selector: {
-            matchLabels: {
-              'k8s-app': 'kube-state-metrics',
-            },
-          },
-          endpoints: [
-            {
-              port: 'https-main',
-              scheme: 'https',
-              interval: $._config.kubeStateMetrics.scrapeInterval,
-              scrapeTimeout: $._config.kubeStateMetrics.scrapeTimeout,
-              honorLabels: true,
-              bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
-              relabelings: [
-                {
-                  regex: '(pod|service|endpoint|namespace)',
-                  action: 'labeldrop',
-                },
-              ],
-              tlsConfig: {
-                insecureSkipVerify: true,
-              },
-            },
-            {
-              port: 'https-self',
-              scheme: 'https',
-              interval: '30s',
-              bearerTokenFile: '/var/run/secrets/kubernetes.io/serviceaccount/token',
-              tlsConfig: {
-                insecureSkipVerify: true,
-              },
-            },
-          ],
-        },
-      },
-  },
+  kubeStateMetrics+:: (import 'kube-state-metrics/kube-state-metrics.libsonnet') +
+                      {
+                        local ksm = self,
+                        name:: 'kube-state-metrics',
+                        namespace:: 'monitoring',
+                        version:: '1.9.4',  //$._config.versions.kubeStateMetrics,
+                        image:: 'quay.io/coreos/kube-state-metrics:v' + ksm.version,
+                        serviceMonitor: {
+                          apiVersion: 'monitoring.coreos.com/v1',
+                          kind: 'ServiceMonitor',
+                          metadata: {
+                            name: ksm.name,
+                            namespace: ksm.namespace,
+                            labels: ksm.commonLabels,
+                          },
+                          spec: {
+                            jobLabel: 'app.kubernetes.io/name',
+                            selector: {
+                              matchLabels: ksm.commonLabels,
+                            },
+                            endpoints: [
+                              {
+                                port: 'http-metrics',
+                                interval: '30s',
+                                scrapeTimeout: '30s',
+                                honorLabels: true,
+                                relabelings: [
+                                  {
+                                    regex: '(pod|service|endpoint|namespace)',
+                                    action: 'labeldrop',
+                                  },
+                                ],
+                              },
+                              {
+                                port: 'telemetry',
+                                interval: '30s',
+                              },
+                            ],
+                          },
+                        },
+                      },
 }
diff --git a/jsonnetfile.lock.json b/jsonnetfile.lock.json
index c7ffc0388f0ddfd421b9095823ec024c0d63fd6e..851e3520fbada1de86cab2a7bbfbb8f3b9d6347f 100644
--- a/jsonnetfile.lock.json
+++ b/jsonnetfile.lock.json
@@ -64,6 +64,28 @@
       },
       "version": ""
     },
+    {
+      "name": "kube-state-metrics",
+      "source": {
+        "git": {
+          "remote": "https://github.com/kubernetes/kube-state-metrics",
+          "subdir": "jsonnet/kube-state-metrics"
+        }
+      },
+      "version": "2148cb9bd5ba51d3911a93c4d61ddf084999f8c7",
+      "sum": "a+rigolTUlmpxlwu2hxnPvZ50Cg5WYuuC7irTma5Xbo="
+    },
+    {
+      "name": "kube-state-metrics-mixin",
+      "source": {
+        "git": {
+          "remote": "https://github.com/kubernetes/kube-state-metrics",
+          "subdir": "jsonnet/kube-state-metrics-mixin"
+        }
+      },
+      "version": "2148cb9bd5ba51d3911a93c4d61ddf084999f8c7",
+      "sum": "E1GGavnf9PCWBm4WVrxWnc0FIj72UcbcweqGioWrOdU="
+    },
     {
       "name": "kubernetes-mixin",
       "source": {
diff --git a/kustomization.yaml b/kustomization.yaml
index bd03a83e0008b4dc8340f71f5c1963a05b381f17..1e215b05a7dad87177b4558ac9e6eef81a089025 100644
--- a/kustomization.yaml
+++ b/kustomization.yaml
@@ -16,8 +16,6 @@ resources:
 - ./manifests/kube-state-metrics-clusterRole.yaml
 - ./manifests/kube-state-metrics-clusterRoleBinding.yaml
 - ./manifests/kube-state-metrics-deployment.yaml
-- ./manifests/kube-state-metrics-role.yaml
-- ./manifests/kube-state-metrics-roleBinding.yaml
 - ./manifests/kube-state-metrics-service.yaml
 - ./manifests/kube-state-metrics-serviceAccount.yaml
 - ./manifests/kube-state-metrics-serviceMonitor.yaml
diff --git a/manifests/kube-state-metrics-clusterRole.yaml b/manifests/kube-state-metrics-clusterRole.yaml
index 6b3918f441fa40e8ef97ce8373a08ec239960729..e35169570e5e64a9d0f53f716926a4434e81ed44 100644
--- a/manifests/kube-state-metrics-clusterRole.yaml
+++ b/manifests/kube-state-metrics-clusterRole.yaml
@@ -1,6 +1,9 @@
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRole
 metadata:
+  labels:
+    app.kubernetes.io/name: kube-state-metrics
+    app.kubernetes.io/version: v1.9.4
   name: kube-state-metrics
 rules:
 - apiGroups:
@@ -93,8 +96,8 @@ rules:
 - apiGroups:
   - admissionregistration.k8s.io
   resources:
-  - validatingwebhookconfigurations
   - mutatingwebhookconfigurations
+  - validatingwebhookconfigurations
   verbs:
   - list
   - watch
@@ -105,3 +108,10 @@ rules:
   verbs:
   - list
   - watch
+- apiGroups:
+  - coordination.k8s.io
+  resources:
+  - leases
+  verbs:
+  - list
+  - watch
diff --git a/manifests/kube-state-metrics-clusterRoleBinding.yaml b/manifests/kube-state-metrics-clusterRoleBinding.yaml
index 9a8f3111abb8f0f418960ff0cdd56aaf95037076..f1bbef8537b0667ab0426f4889ed1a4f9cde9a26 100644
--- a/manifests/kube-state-metrics-clusterRoleBinding.yaml
+++ b/manifests/kube-state-metrics-clusterRoleBinding.yaml
@@ -1,6 +1,9 @@
 apiVersion: rbac.authorization.k8s.io/v1
 kind: ClusterRoleBinding
 metadata:
+  labels:
+    app.kubernetes.io/name: kube-state-metrics
+    app.kubernetes.io/version: v1.9.4
   name: kube-state-metrics
 roleRef:
   apiGroup: rbac.authorization.k8s.io
diff --git a/manifests/kube-state-metrics-deployment.yaml b/manifests/kube-state-metrics-deployment.yaml
index 24c1e0c537bfebb181cdaaba0b4a9b21c8289fe3..7477545e6c52f66f284bd28d01ed26cf1d1dfd04 100644
--- a/manifests/kube-state-metrics-deployment.yaml
+++ b/manifests/kube-state-metrics-deployment.yaml
@@ -2,71 +2,43 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   labels:
-    app: kube-state-metrics
+    app.kubernetes.io/name: kube-state-metrics
+    app.kubernetes.io/version: v1.9.4
   name: kube-state-metrics
   namespace: monitoring
 spec:
   replicas: 1
   selector:
     matchLabels:
-      app: kube-state-metrics
+      app.kubernetes.io/name: kube-state-metrics
   template:
     metadata:
       labels:
-        app: kube-state-metrics
+        app.kubernetes.io/name: kube-state-metrics
+        app.kubernetes.io/version: v1.9.4
     spec:
       containers:
-      - args:
-        - --logtostderr
-        - --secure-listen-address=:8443
-        - --tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
-        - --upstream=http://127.0.0.1:8081/
-        image: quay.io/coreos/kube-rbac-proxy:v0.4.1
-        name: kube-rbac-proxy-main
-        ports:
-        - containerPort: 8443
-          name: https-main
-        resources:
-          limits:
-            cpu: 20m
-            memory: 40Mi
-          requests:
-            cpu: 10m
-            memory: 20Mi
-      - args:
-        - --logtostderr
-        - --secure-listen-address=:9443
-        - --tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
-        - --upstream=http://127.0.0.1:8082/
-        image: quay.io/coreos/kube-rbac-proxy:v0.4.1
-        name: kube-rbac-proxy-self
-        ports:
-        - containerPort: 9443
-          name: https-self
-        resources:
-          limits:
-            cpu: 20m
-            memory: 40Mi
-          requests:
-            cpu: 10m
-            memory: 20Mi
-      - args:
-        - --host=127.0.0.1
-        - --port=8081
-        - --telemetry-host=127.0.0.1
-        - --telemetry-port=8082
-        image: quay.io/coreos/kube-state-metrics:v1.9.3
+      - image: quay.io/coreos/kube-state-metrics:v1.9.4
+        livenessProbe:
+          httpGet:
+            path: /healthz
+            port: 8080
+          initialDelaySeconds: 5
+          timeoutSeconds: 5
         name: kube-state-metrics
-        resources:
-          limits:
-            cpu: 100m
-            memory: 150Mi
-          requests:
-            cpu: 100m
-            memory: 150Mi
+        ports:
+        - containerPort: 8080
+          name: http-metrics
+        - containerPort: 8081
+          name: telemetry
+        readinessProbe:
+          httpGet:
+            path: /
+            port: 8081
+          initialDelaySeconds: 5
+          timeoutSeconds: 5
+        securityContext:
+          runAsUser: 65534
       nodeSelector:
         kubernetes.io/os: linux
-      securityContext:
-        runAsNonRoot: true
-        runAsUser: 65534
       serviceAccountName: kube-state-metrics
diff --git a/manifests/kube-state-metrics-role.yaml b/manifests/kube-state-metrics-role.yaml
deleted file mode 100644
index e03d889881fd2b0792e1a394d479e2c60c5a4cc2..0000000000000000000000000000000000000000
--- a/manifests/kube-state-metrics-role.yaml
+++ /dev/null
@@ -1,30 +0,0 @@
-apiVersion: rbac.authorization.k8s.io/v1
-kind: Role
-metadata:
-  name: kube-state-metrics
-  namespace: monitoring
-rules:
-- apiGroups:
-  - ""
-  resources:
-  - pods
-  verbs:
-  - get
-- apiGroups:
-  - extensions
-  resourceNames:
-  - kube-state-metrics
-  resources:
-  - deployments
-  verbs:
-  - get
-  - update
-- apiGroups:
-  - apps
-  resourceNames:
-  - kube-state-metrics
-  resources:
-  - deployments
-  verbs:
-  - get
-  - update
diff --git a/manifests/kube-state-metrics-roleBinding.yaml b/manifests/kube-state-metrics-roleBinding.yaml
deleted file mode 100644
index 9c61143c24186d69d48af9a74171720de6e502cc..0000000000000000000000000000000000000000
--- a/manifests/kube-state-metrics-roleBinding.yaml
+++ /dev/null
@@ -1,12 +0,0 @@
-apiVersion: rbac.authorization.k8s.io/v1
-kind: RoleBinding
-metadata:
-  name: kube-state-metrics
-  namespace: monitoring
-roleRef:
-  apiGroup: rbac.authorization.k8s.io
-  kind: Role
-  name: kube-state-metrics
-subjects:
-- kind: ServiceAccount
-  name: kube-state-metrics
diff --git a/manifests/kube-state-metrics-service.yaml b/manifests/kube-state-metrics-service.yaml
index 84927af32351b71e0deddfaf19ba0c575c449cb0..fd4b655c603f4dce0237de14f6fa3ed7a9ffa408 100644
--- a/manifests/kube-state-metrics-service.yaml
+++ b/manifests/kube-state-metrics-service.yaml
@@ -2,17 +2,18 @@ apiVersion: v1
 kind: Service
 metadata:
   labels:
-    k8s-app: kube-state-metrics
+    app.kubernetes.io/name: kube-state-metrics
+    app.kubernetes.io/version: v1.9.4
   name: kube-state-metrics
   namespace: monitoring
 spec:
   clusterIP: None
   ports:
-  - name: https-main
-    port: 8443
-    targetPort: https-main
-  - name: https-self
-    port: 9443
-    targetPort: https-self
+  - name: http-metrics
+    port: 8080
+    targetPort: http-metrics
+  - name: telemetry
+    port: 8081
+    targetPort: telemetry
   selector:
-    app: kube-state-metrics
+    app.kubernetes.io/name: kube-state-metrics
diff --git a/manifests/kube-state-metrics-serviceAccount.yaml b/manifests/kube-state-metrics-serviceAccount.yaml
index fff1028b442c69109cb8fa8e5f808f2a856838f8..98a4f81df368bd96180b95be406bd7a044bb0dac 100644
--- a/manifests/kube-state-metrics-serviceAccount.yaml
+++ b/manifests/kube-state-metrics-serviceAccount.yaml
@@ -1,5 +1,8 @@
 apiVersion: v1
 kind: ServiceAccount
 metadata:
+  labels:
+    app.kubernetes.io/name: kube-state-metrics
+    app.kubernetes.io/version: v1.9.4
   name: kube-state-metrics
   namespace: monitoring
diff --git a/manifests/kube-state-metrics-serviceMonitor.yaml b/manifests/kube-state-metrics-serviceMonitor.yaml
index 4df66c090d293c668d2b0ea77df19a01d3d9519e..b396ddcd2816551a8f586da188955e80ffcf7728 100644
--- a/manifests/kube-state-metrics-serviceMonitor.yaml
+++ b/manifests/kube-state-metrics-serviceMonitor.yaml
@@ -2,29 +2,23 @@ apiVersion: monitoring.coreos.com/v1
 kind: ServiceMonitor
 metadata:
   labels:
-    k8s-app: kube-state-metrics
+    app.kubernetes.io/name: kube-state-metrics
+    app.kubernetes.io/version: v1.9.4
   name: kube-state-metrics
   namespace: monitoring
 spec:
   endpoints:
-  - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
-    honorLabels: true
+  - honorLabels: true
     interval: 30s
-    port: https-main
+    port: http-metrics
     relabelings:
     - action: labeldrop
       regex: (pod|service|endpoint|namespace)
-    scheme: https
     scrapeTimeout: 30s
-    tlsConfig:
-      insecureSkipVerify: true
-  - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
-    interval: 30s
-    port: https-self
-    scheme: https
-    tlsConfig:
-      insecureSkipVerify: true
-  jobLabel: k8s-app
+  - interval: 30s
+    port: telemetry
+  jobLabel: app.kubernetes.io/name
   selector:
     matchLabels:
-      k8s-app: kube-state-metrics
+      app.kubernetes.io/name: kube-state-metrics
+      app.kubernetes.io/version: v1.9.4
diff --git a/manifests/prometheus-rules.yaml b/manifests/prometheus-rules.yaml
index 0428ebbb26849dbda846de38f9a52f9850a10d0f..a2344bde6f3ce686a46b6adf5385b8c8f8158867 100644
--- a/manifests/prometheus-rules.yaml
+++ b/manifests/prometheus-rules.yaml
@@ -271,6 +271,36 @@ spec:
       record: count:up1
     - expr: count without(instance, pod, node) (up == 0)
       record: count:up0
+  - name: kube-state-metrics
+    rules:
+    - alert: KubeStateMetricsListErrors
+      annotations:
+        message: kube-state-metrics is experiencing errors at an elevated rate in
+          list operations. This is likely causing it to not be able to expose metrics
+          about Kubernetes objects correctly or at all.
+        runbook_url: https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubestatemetricslisterrors
+      expr: |
+        (sum(rate(kube_state_metrics_list_total{job="kube-state-metrics",result="error"}[5m]))
+          /
+        sum(rate(kube_state_metrics_list_total{job="kube-state-metrics"}[5m])))
+        > 0.01
+      for: 15m
+      labels:
+        severity: critical
+    - alert: KubeStateMetricsWatchErrors
+      annotations:
+        message: kube-state-metrics is experiencing errors at an elevated rate in
+          watch operations. This is likely causing it to not be able to expose metrics
+          about Kubernetes objects correctly or at all.
+        runbook_url: https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-kubestatemetricswatcherrors
+      expr: |
+        (sum(rate(kube_state_metrics_watch_total{job="kube-state-metrics",result="error"}[5m]))
+          /
+        sum(rate(kube_state_metrics_watch_total{job="kube-state-metrics"}[5m])))
+        > 0.01
+      for: 15m
+      labels:
+        severity: critical
   - name: node-exporter
     rules:
     - alert: NodeFilesystemSpaceFillingUp