# kube-state-metrics — exposes cluster object state (pods, deployments, # services, etc.) as Prometheus metrics. vmagent scrapes it via the api # group defined in vmagent-config; Grafana panels that count pods, # replicas, etc. consume the `kube_*` metrics this produces. # # Lives in kube-system because it watches resources cluster-wide. # RBAC is cluster-scoped (ClusterRole + ClusterRoleBinding). # # Image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.13.0 # (latest stable as of authoring; bump when a newer minor is released) --- apiVersion: v1 kind: ServiceAccount metadata: name: kube-state-metrics namespace: kube-system labels: app.kubernetes.io/name: kube-state-metrics app.kubernetes.io/part-of: honeydue-observability --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: kube-state-metrics labels: app.kubernetes.io/name: kube-state-metrics app.kubernetes.io/part-of: honeydue-observability rules: # Core resources - apiGroups: [""] resources: - configmaps - secrets - nodes - pods - services - serviceaccounts - resourcequotas - replicationcontrollers - limitranges - persistentvolumeclaims - persistentvolumes - namespaces - endpoints verbs: [list, watch] # Apps - apiGroups: ["apps"] resources: - statefulsets - daemonsets - deployments - replicasets verbs: [list, watch] # Batch - apiGroups: ["batch"] resources: - cronjobs - jobs verbs: [list, watch] # Autoscaling - apiGroups: ["autoscaling"] resources: - horizontalpodautoscalers verbs: [list, watch] # Authentication / authorization (used by some ksm collectors) - apiGroups: ["authentication.k8s.io"] resources: [tokenreviews] verbs: [create] - apiGroups: ["authorization.k8s.io"] resources: [subjectaccessreviews] verbs: [create] # Policy - apiGroups: ["policy"] resources: [poddisruptionbudgets] verbs: [list, watch] # Certificate signing - apiGroups: ["certificates.k8s.io"] resources: [certificatesigningrequests] verbs: [list, watch] # Discovery - apiGroups: ["discovery.k8s.io"] resources: [endpointslices] verbs: [list, watch] # Storage - apiGroups: ["storage.k8s.io"] resources: - storageclasses - volumeattachments verbs: [list, watch] # Admission policy - apiGroups: ["admissionregistration.k8s.io"] resources: - mutatingwebhookconfigurations - validatingwebhookconfigurations verbs: [list, watch] # Networking - apiGroups: ["networking.k8s.io"] resources: - networkpolicies - ingressclasses - ingresses verbs: [list, watch] # Coordination (leader election) - apiGroups: ["coordination.k8s.io"] resources: [leases] verbs: [list, watch] # RBAC - apiGroups: ["rbac.authorization.k8s.io"] resources: - clusterrolebindings - clusterroles - rolebindings - roles verbs: [list, watch] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: kube-state-metrics labels: app.kubernetes.io/name: kube-state-metrics app.kubernetes.io/part-of: honeydue-observability roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: kube-state-metrics subjects: - kind: ServiceAccount name: kube-state-metrics namespace: kube-system --- apiVersion: v1 kind: Service metadata: name: kube-state-metrics namespace: kube-system labels: app.kubernetes.io/name: kube-state-metrics app.kubernetes.io/part-of: honeydue-observability spec: type: ClusterIP selector: app.kubernetes.io/name: kube-state-metrics ports: - name: http-metrics port: 8080 targetPort: http-metrics protocol: TCP - name: telemetry port: 8081 targetPort: telemetry protocol: TCP --- apiVersion: apps/v1 kind: Deployment metadata: name: kube-state-metrics namespace: kube-system labels: app.kubernetes.io/name: kube-state-metrics app.kubernetes.io/part-of: honeydue-observability spec: replicas: 1 strategy: type: Recreate selector: matchLabels: app.kubernetes.io/name: kube-state-metrics template: metadata: labels: app.kubernetes.io/name: kube-state-metrics app.kubernetes.io/part-of: honeydue-observability spec: serviceAccountName: kube-state-metrics automountServiceAccountToken: true securityContext: runAsNonRoot: true runAsUser: 65534 fsGroup: 65534 seccompProfile: type: RuntimeDefault containers: - name: kube-state-metrics image: registry.k8s.io/kube-state-metrics/kube-state-metrics:v2.13.0 imagePullPolicy: IfNotPresent ports: - containerPort: 8080 name: http-metrics - containerPort: 8081 name: telemetry args: - --port=8080 - --telemetry-port=8081 resources: requests: cpu: 25m memory: 64Mi limits: cpu: 200m memory: 256Mi securityContext: allowPrivilegeEscalation: false capabilities: drop: [ALL] readOnlyRootFilesystem: true livenessProbe: httpGet: path: /livez port: http-metrics initialDelaySeconds: 5 periodSeconds: 30 readinessProbe: httpGet: path: /readyz port: http-metrics initialDelaySeconds: 5 periodSeconds: 10