# prometheus-secure-metrics.yaml # # Standalone replacement for samples/addons/prometheus.yaml with mTLS metrics # scraping pre-configured using Istio workload certificates. # # Usage: # kubectl apply -n istio-system -f samples/addons/extras/prometheus-secure-metrics.yaml # # Do NOT apply both this file and samples/addons/prometheus.yaml - they define # the same resource names. # # What this adds over samples/addons/prometheus.yaml: # - Injects an Istio sidecar into Prometheus to provision a workload certificate. # The certificate is written to /etc/istio-certs via OUTPUT_CERTS and mounted # into the prometheus-server container for mTLS client authentication. # - Disables inbound traffic interception (INBOUND_CAPTURE_PORTS: "") so the # sidecar is used solely for certificate provisioning. # - Adds two pre-configured mTLS scrape jobs: # istio-secure-merged-metrics: scrapes the port from the # prometheus.istio.io/secure-port annotation (auto-set by the injector # when ENVOY_SECURE_MERGED_METRICS_PORT is configured on the workload). # istio-secure-envoy-metrics: scrapes the port from the # prometheus.istio.io/secure-envoy-port annotation (must be set manually # on workloads that configure ENVOY_SECURE_METRICS_PORT). # # See: https://istio.io/latest/docs/tasks/observability/metrics/secure-metrics/ --- apiVersion: v1 kind: ServiceAccount metadata: labels: app.kubernetes.io/component: server app.kubernetes.io/name: prometheus app.kubernetes.io/instance: prometheus app.kubernetes.io/version: v3.10.0 helm.sh/chart: prometheus-28.13.0 app.kubernetes.io/part-of: prometheus name: prometheus namespace: istio-system annotations: {} --- apiVersion: v1 kind: ConfigMap metadata: labels: app.kubernetes.io/component: server app.kubernetes.io/name: prometheus app.kubernetes.io/instance: prometheus app.kubernetes.io/version: v3.10.0 helm.sh/chart: prometheus-28.13.0 app.kubernetes.io/part-of: prometheus name: prometheus namespace: istio-system data: allow-snippet-annotations: "false" alerting_rules.yml: | {} alerts: | {} prometheus.yml: | global: evaluation_interval: 1m scrape_interval: 15s scrape_timeout: 10s scrape_configs: - job_name: istio-secure-merged-metrics # Discovers pods annotated with prometheus.istio.io/secure-port. # This annotation is automatically set by the sidecar injector when # ENVOY_SECURE_MERGED_METRICS_PORT is configured on the workload. kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__meta_kubernetes_pod_annotation_prometheus_istio_io_secure_port] action: keep regex: .+ - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] action: replace target_label: __metrics_path__ regex: (.+) - source_labels: [__meta_kubernetes_pod_ip, __meta_kubernetes_pod_annotation_prometheus_istio_io_secure_port] action: replace target_label: __address__ regex: (.+);(.+) replacement: $1:$2 scheme: https tls_config: ca_file: /etc/istio-certs/root-cert.pem cert_file: /etc/istio-certs/cert-chain.pem key_file: /etc/istio-certs/key.pem insecure_skip_verify: true - job_name: istio-secure-envoy-metrics # Discovers pods annotated with prometheus.istio.io/secure-envoy-port. # This annotation is NOT automatically set; add it manually to workloads # that configure ENVOY_SECURE_METRICS_PORT. kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__meta_kubernetes_pod_annotation_prometheus_istio_io_secure_envoy_port] action: keep regex: .+ - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] action: replace target_label: __metrics_path__ regex: (.+) - source_labels: [__meta_kubernetes_pod_ip, __meta_kubernetes_pod_annotation_prometheus_istio_io_secure_envoy_port] action: replace target_label: __address__ regex: (.+);(.+) replacement: $1:$2 scheme: https tls_config: ca_file: /etc/istio-certs/root-cert.pem cert_file: /etc/istio-certs/cert-chain.pem key_file: /etc/istio-certs/key.pem insecure_skip_verify: true - job_name: kubernetes-api-servers bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: endpoints relabel_configs: - action: keep regex: default;kubernetes;https source_labels: - __meta_kubernetes_namespace - __meta_kubernetes_service_name - __meta_kubernetes_endpoint_port_name scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt - job_name: kubernetes-nodes bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: node relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true - job_name: kubernetes-nodes-cadvisor bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: node metrics_path: /metrics/cadvisor relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) - source_labels: - __metrics_path__ target_label: metrics_path scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true - job_name: kubernetes-pods honor_labels: true kubernetes_sd_configs: - role: pod relabel_configs: - action: keep regex: true source_labels: - __meta_kubernetes_pod_annotation_prometheus_io_scrape - action: drop regex: true source_labels: - __meta_kubernetes_pod_annotation_prometheus_io_scrape_slow - action: replace regex: (https?) source_labels: - __meta_kubernetes_pod_annotation_prometheus_io_scheme target_label: __scheme__ - action: replace regex: (.+) source_labels: - __meta_kubernetes_pod_annotation_prometheus_io_path target_label: __metrics_path__ - action: replace regex: (\d+);(([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}) replacement: '[$2]:$1' source_labels: - __meta_kubernetes_pod_annotation_prometheus_io_port - __meta_kubernetes_pod_ip target_label: __address__ - action: replace regex: (\d+);((([0-9]+?)(\.|$)){4}) replacement: $2:$1 source_labels: - __meta_kubernetes_pod_annotation_prometheus_io_port - __meta_kubernetes_pod_ip target_label: __address__ - action: labelmap regex: __meta_kubernetes_pod_annotation_prometheus_io_param_(.+) replacement: __param_$1 - action: labelmap regex: __meta_kubernetes_pod_label_(.+) - action: replace source_labels: - __meta_kubernetes_namespace target_label: namespace - action: replace source_labels: - __meta_kubernetes_pod_name target_label: pod - action: drop regex: Pending|Succeeded|Failed|Completed source_labels: - __meta_kubernetes_pod_phase - action: replace source_labels: - __meta_kubernetes_pod_node_name target_label: node - job_name: kubernetes-pods-slow honor_labels: true kubernetes_sd_configs: - role: pod relabel_configs: - action: keep regex: true source_labels: - __meta_kubernetes_pod_annotation_prometheus_io_scrape_slow - action: replace regex: (https?) source_labels: - __meta_kubernetes_pod_annotation_prometheus_io_scheme target_label: __scheme__ - action: replace regex: (.+) source_labels: - __meta_kubernetes_pod_annotation_prometheus_io_path target_label: __metrics_path__ - action: replace regex: (\d+);(([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}) replacement: '[$2]:$1' source_labels: - __meta_kubernetes_pod_annotation_prometheus_io_port - __meta_kubernetes_pod_ip target_label: __address__ - action: replace regex: (\d+);((([0-9]+?)(\.|$)){4}) replacement: $2:$1 source_labels: - __meta_kubernetes_pod_annotation_prometheus_io_port - __meta_kubernetes_pod_ip target_label: __address__ - action: labelmap regex: __meta_kubernetes_pod_annotation_prometheus_io_param_(.+) replacement: __param_$1 - action: labelmap regex: __meta_kubernetes_pod_label_(.+) - action: replace source_labels: - __meta_kubernetes_namespace target_label: namespace - action: replace source_labels: - __meta_kubernetes_pod_name target_label: pod - action: drop regex: Pending|Succeeded|Failed|Completed source_labels: - __meta_kubernetes_pod_phase - action: replace source_labels: - __meta_kubernetes_pod_node_name target_label: node scrape_interval: 5m scrape_timeout: 30s - job_name: kubernetes-service-endpoints honor_labels: true kubernetes_sd_configs: - role: endpoints relabel_configs: - action: keep regex: true source_labels: - __meta_kubernetes_service_annotation_prometheus_io_scrape - action: drop regex: true source_labels: - __meta_kubernetes_service_annotation_prometheus_io_scrape_slow - action: replace regex: (https?) source_labels: - __meta_kubernetes_service_annotation_prometheus_io_scheme target_label: __scheme__ - action: replace regex: (.+) source_labels: - __meta_kubernetes_service_annotation_prometheus_io_path target_label: __metrics_path__ - action: replace regex: (.+?)(?::\d+)?;(\d+) replacement: $1:$2 source_labels: - __address__ - __meta_kubernetes_service_annotation_prometheus_io_port target_label: __address__ - action: labelmap regex: __meta_kubernetes_service_annotation_prometheus_io_param_(.+) replacement: __param_$1 - action: labelmap regex: __meta_kubernetes_service_label_(.+) - action: replace source_labels: - __meta_kubernetes_namespace target_label: namespace - action: replace source_labels: - __meta_kubernetes_service_name target_label: service - action: replace source_labels: - __meta_kubernetes_pod_node_name target_label: node - job_name: kubernetes-service-endpoints-slow honor_labels: true kubernetes_sd_configs: - role: endpoints relabel_configs: - action: keep regex: true source_labels: - __meta_kubernetes_service_annotation_prometheus_io_scrape_slow - action: replace regex: (https?) source_labels: - __meta_kubernetes_service_annotation_prometheus_io_scheme target_label: __scheme__ - action: replace regex: (.+) source_labels: - __meta_kubernetes_service_annotation_prometheus_io_path target_label: __metrics_path__ - action: replace regex: (.+?)(?::\d+)?;(\d+) replacement: $1:$2 source_labels: - __address__ - __meta_kubernetes_service_annotation_prometheus_io_port target_label: __address__ - action: labelmap regex: __meta_kubernetes_service_annotation_prometheus_io_param_(.+) replacement: __param_$1 - action: labelmap regex: __meta_kubernetes_service_label_(.+) - action: replace source_labels: - __meta_kubernetes_namespace target_label: namespace - action: replace source_labels: - __meta_kubernetes_service_name target_label: service - action: replace source_labels: - __meta_kubernetes_pod_node_name target_label: node scrape_interval: 5m scrape_timeout: 30s - job_name: kubernetes-services honor_labels: true kubernetes_sd_configs: - role: service metrics_path: /probe params: module: - http_2xx relabel_configs: - action: keep regex: true source_labels: - __meta_kubernetes_service_annotation_prometheus_io_probe - source_labels: - __address__ target_label: __param_target - replacement: blackbox target_label: __address__ - source_labels: - __param_target target_label: instance - action: labelmap regex: __meta_kubernetes_service_label_(.+) - source_labels: - __meta_kubernetes_namespace target_label: namespace - source_labels: - __meta_kubernetes_service_name target_label: service - job_name: prometheus static_configs: - targets: - localhost:9090 - job_name: prometheus-pushgateway honor_labels: true kubernetes_sd_configs: - role: service relabel_configs: - action: keep regex: pushgateway source_labels: - __meta_kubernetes_service_annotation_prometheus_io_probe rule_files: - /etc/config/recording_rules.yml - /etc/config/alerting_rules.yml - /etc/config/rules - /etc/config/alerts recording_rules.yml: | {} rules: | {} --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: labels: app.kubernetes.io/component: server app.kubernetes.io/name: prometheus app.kubernetes.io/instance: prometheus app.kubernetes.io/version: v3.10.0 helm.sh/chart: prometheus-28.13.0 app.kubernetes.io/part-of: prometheus name: prometheus rules: - apiGroups: - "" resources: - nodes - nodes/metrics - services - endpoints - pods - ingresses - configmaps verbs: - get - list - watch - apiGroups: - "networking.k8s.io" resources: - ingresses/status - ingresses verbs: - get - list - watch - apiGroups: - "discovery.k8s.io" resources: - endpointslices verbs: - get - list - watch - nonResourceURLs: - "/metrics" verbs: - get --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: labels: app.kubernetes.io/component: server app.kubernetes.io/name: prometheus app.kubernetes.io/instance: prometheus app.kubernetes.io/version: v3.10.0 helm.sh/chart: prometheus-28.13.0 app.kubernetes.io/part-of: prometheus name: prometheus subjects: - kind: ServiceAccount name: prometheus namespace: istio-system # Update if deploying to a different namespace roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheus --- apiVersion: v1 kind: Service metadata: labels: app.kubernetes.io/component: server app.kubernetes.io/name: prometheus app.kubernetes.io/instance: prometheus app.kubernetes.io/version: v3.10.0 helm.sh/chart: prometheus-28.13.0 app.kubernetes.io/part-of: prometheus name: prometheus namespace: istio-system spec: ports: - name: http port: 9090 protocol: TCP targetPort: 9090 selector: app.kubernetes.io/component: server app.kubernetes.io/name: prometheus app.kubernetes.io/instance: prometheus sessionAffinity: None type: "ClusterIP" --- apiVersion: apps/v1 kind: Deployment metadata: labels: app.kubernetes.io/component: server app.kubernetes.io/name: prometheus app.kubernetes.io/instance: prometheus app.kubernetes.io/version: v3.10.0 helm.sh/chart: prometheus-28.13.0 app.kubernetes.io/part-of: prometheus name: prometheus namespace: istio-system spec: strategy: type: Recreate rollingUpdate: null selector: matchLabels: app.kubernetes.io/component: server app.kubernetes.io/name: prometheus app.kubernetes.io/instance: prometheus replicas: 1 revisionHistoryLimit: 10 template: metadata: labels: app.kubernetes.io/component: server app.kubernetes.io/name: prometheus app.kubernetes.io/instance: prometheus app.kubernetes.io/version: v3.10.0 helm.sh/chart: prometheus-28.13.0 app.kubernetes.io/part-of: prometheus sidecar.istio.io/inject: "true" # overrides the "false" label set by the Prometheus chart annotations: sidecar.istio.io/userVolumeMount: '[{"name": "istio-certs", "mountPath": "/etc/istio-certs"}]' proxy.istio.io/config: | proxyMetadata: OUTPUT_CERTS: /etc/istio-certs INBOUND_CAPTURE_PORTS: "" spec: enableServiceLinks: true serviceAccountName: prometheus containers: - name: prometheus-server-configmap-reload image: "ghcr.io/prometheus-operator/prometheus-config-reloader:v0.89.0" imagePullPolicy: "IfNotPresent" args: - --watched-dir=/etc/config - --listen-address=0.0.0.0:8080 - --reload-url=http://127.0.0.1:9090/-/reload ports: - containerPort: 8080 name: metrics livenessProbe: httpGet: path: /healthz port: metrics scheme: HTTP initialDelaySeconds: 2 periodSeconds: 10 readinessProbe: httpGet: path: /healthz port: metrics scheme: HTTP periodSeconds: 10 volumeMounts: - name: config-volume mountPath: /etc/config readOnly: true - name: prometheus-server image: "docker.io/prom/prometheus:v3.10.0" imagePullPolicy: "IfNotPresent" args: - --storage.tsdb.retention.time=15d - --config.file=/etc/config/prometheus.yml - --storage.tsdb.path=/data - --web.console.libraries=/etc/prometheus/console_libraries - --web.console.templates=/etc/prometheus/consoles - --web.enable-lifecycle ports: - containerPort: 9090 readinessProbe: httpGet: path: /-/ready port: 9090 scheme: HTTP initialDelaySeconds: 0 periodSeconds: 5 timeoutSeconds: 4 failureThreshold: 3 successThreshold: 1 livenessProbe: httpGet: path: /-/healthy port: 9090 scheme: HTTP initialDelaySeconds: 30 periodSeconds: 15 timeoutSeconds: 10 failureThreshold: 3 successThreshold: 1 volumeMounts: - name: config-volume mountPath: /etc/config - name: storage-volume mountPath: /data subPath: "" - name: istio-certs mountPath: /etc/istio-certs dnsPolicy: ClusterFirst terminationGracePeriodSeconds: 300 volumes: - name: config-volume configMap: name: prometheus - name: storage-volume emptyDir: {} - name: istio-certs emptyDir: {}