Skip to content

Commit 58566f8

Browse files
Merge pull request #18254 from smarterclayton/router_default
Automatic merge from submit-queue (batch tested with PRs 17420, 18254). Prometheus should scrape the router by default Builds on top of #18245 and will scrape the installed router by default. We ensure that the router by default will be using a serving cert to serve metrics, then add new roles, bindings, and a prometheus-scraper service account that has permission to scrape it. For 3.10
2 parents 6e85fcc + 0786dad commit 58566f8

File tree

4 files changed

+281
-46
lines changed

4 files changed

+281
-46
lines changed

examples/prometheus/prometheus.yaml

Lines changed: 85 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,53 @@ objects:
4040
serviceaccounts.openshift.io/oauth-redirectreference.prom: '{"kind":"OAuthRedirectReference","apiVersion":"v1","reference":{"kind":"Route","name":"prometheus"}}'
4141
serviceaccounts.openshift.io/oauth-redirectreference.alerts: '{"kind":"OAuthRedirectReference","apiVersion":"v1","reference":{"kind":"Route","name":"alerts"}}'
4242
serviceaccounts.openshift.io/oauth-redirectreference.alertmanager: '{"kind":"OAuthRedirectReference","apiVersion":"v1","reference":{"kind":"Route","name":"alertmanager"}}'
43+
44+
# Create a service account for accessing prometheus data
45+
- apiVersion: v1
46+
kind: ServiceAccount
47+
metadata:
48+
name: prometheus-reader
49+
namespace: "${NAMESPACE}"
50+
51+
# Create a service account for prometheus to use to scrape other infrastructure components
52+
- apiVersion: v1
53+
kind: ServiceAccount
54+
metadata:
55+
name: prometheus-scraper
56+
namespace: "${NAMESPACE}"
57+
58+
- apiVersion: v1
59+
kind: Secret
60+
metadata:
61+
name: prometheus-scraper
62+
namespace: "${NAMESPACE}"
63+
annotations:
64+
kubernetes.io/service-account.name: prometheus-scraper
65+
type: kubernetes.io/service-account-token
66+
67+
- apiVersion: rbac.authorization.k8s.io/v1
68+
kind: ClusterRole
69+
metadata:
70+
name: prometheus-scraper
71+
rules:
72+
- apiGroups:
73+
- route.openshift.io
74+
resources:
75+
- routers/metrics
76+
verbs:
77+
- get
78+
79+
- apiVersion: authorization.openshift.io/v1
80+
kind: ClusterRoleBinding
81+
metadata:
82+
name: prometheus-scraper
83+
roleRef:
84+
name: prometheus-scraper
85+
subjects:
86+
- kind: ServiceAccount
87+
name: prometheus-scraper
88+
namespace: "${NAMESPACE}"
89+
4390
- apiVersion: authorization.openshift.io/v1
4491
kind: ClusterRoleBinding
4592
metadata:
@@ -51,6 +98,18 @@ objects:
5198
name: prometheus
5299
namespace: "${NAMESPACE}"
53100

101+
- apiVersion: authorization.openshift.io/v1
102+
kind: RoleBinding
103+
metadata:
104+
name: prometheus-reader
105+
namespace: "${NAMESPACE}"
106+
roleRef:
107+
name: view
108+
subjects:
109+
- kind: ServiceAccount
110+
name: prometheus-reader
111+
namespace: "${NAMESPACE}"
112+
54113
# Create a fully end-to-end TLS connection to the prometheus proxy
55114
- apiVersion: route.openshift.io/v1
56115
kind: Route
@@ -229,6 +288,8 @@ objects:
229288
name: prometheus-config
230289
- mountPath: /prometheus
231290
name: prometheus-data
291+
- mountPath: /var/run/secrets/kubernetes.io/scraper
292+
name: prometheus-scraper-secret
232293

233294
# Deploy alertmanager behind prometheus-alert-buffer behind an oauth proxy
234295
# use http port=4190 and https port=9943 to differ from prom-proxy
@@ -320,6 +381,9 @@ objects:
320381
configMap:
321382
defaultMode: 420
322383
name: prometheus
384+
- name: prometheus-scraper-secret
385+
secret:
386+
secretName: prometheus-scraper
323387
- name: prometheus-proxy-secret
324388
secret:
325389
secretName: prometheus-proxy
@@ -603,21 +667,39 @@ objects:
603667
- action: labelmap
604668
regex: __meta_kubernetes_node_label_(.+)
605669
670+
# TODO: auto-generate these sections, or add a dynamic infrastructure scraper
606671
# Scrape config for the template service broker
607672
- job_name: 'openshift-template-service-broker'
608673
scheme: https
609674
tls_config:
610675
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt
611676
server_name: apiserver.openshift-template-service-broker.svc
612-
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
613-
677+
bearer_token_file: /var/run/secrets/kubernetes.io/scraper/token
614678
kubernetes_sd_configs:
615679
- role: endpoints
616-
680+
namespaces:
681+
names:
682+
- openshift-template-service-broker
617683
relabel_configs:
618684
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
619685
action: keep
620686
regex: openshift-template-service-broker;apiserver;https
687+
# Scrape config for the router
688+
- job_name: 'openshift-router'
689+
scheme: https
690+
tls_config:
691+
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt
692+
server_name: router.default.svc
693+
bearer_token_file: /var/run/secrets/kubernetes.io/scraper/token
694+
kubernetes_sd_configs:
695+
- role: endpoints
696+
namespaces:
697+
names:
698+
- default
699+
relabel_configs:
700+
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
701+
action: keep
702+
regex: default;router;1936-tcp
621703
622704
alerting:
623705
alertmanagers:

pkg/oc/admin/router/router.go

Lines changed: 26 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,27 @@ func generateSecretsConfig(cfg *RouterConfig, namespace string, defaultCert []by
391391
secrets = append(secrets, secret)
392392
}
393393

394+
if cfg.Type == "haproxy-router" && cfg.StatsPort != 0 {
395+
metricsCertName := "router-metrics-tls"
396+
if len(defaultCert) == 0 {
397+
// when we are generating a serving cert, we need to reuse the existing cert
398+
metricsCertName = certName
399+
}
400+
volumes = append(volumes, kapi.Volume{
401+
Name: "metrics-server-certificate",
402+
VolumeSource: kapi.VolumeSource{
403+
Secret: &kapi.SecretVolumeSource{
404+
SecretName: metricsCertName,
405+
},
406+
},
407+
})
408+
mounts = append(mounts, kapi.VolumeMount{
409+
Name: "metrics-server-certificate",
410+
ReadOnly: true,
411+
MountPath: "/etc/pki/tls/metrics/",
412+
})
413+
}
414+
394415
// The secret in this volume is either the one created for the
395416
// user supplied default cert (pem format) or the secret generated
396417
// by the service anotation (cert only format).
@@ -460,36 +481,6 @@ func generateReadinessProbeConfig(cfg *RouterConfig, ports []kapi.ContainerPort)
460481
return probe
461482
}
462483

463-
func generateMetricsExporterContainer(cfg *RouterConfig, env app.Environment) *kapi.Container {
464-
containerName := "metrics-exporter"
465-
if len(cfg.MetricsImage) > 0 {
466-
return &kapi.Container{
467-
Name: containerName,
468-
Image: cfg.MetricsImage,
469-
Env: env.List(),
470-
}
471-
}
472-
switch cfg.Type {
473-
case "haproxy-router":
474-
return &kapi.Container{
475-
Name: containerName,
476-
Image: "prom/haproxy-exporter:latest",
477-
Env: env.List(),
478-
Args: []string{
479-
fmt.Sprintf("--haproxy.scrape-uri=http://$(STATS_USERNAME):$(STATS_PASSWORD)@localhost:$(STATS_PORT)/haproxy?stats;csv"),
480-
},
481-
Ports: []kapi.ContainerPort{
482-
{
483-
Name: "http",
484-
ContainerPort: 9101,
485-
},
486-
},
487-
}
488-
default:
489-
return nil
490-
}
491-
}
492-
493484
// RunCmdRouter contains all the necessary functionality for the
494485
// OpenShift CLI router command.
495486
func RunCmdRouter(f *clientcmd.Factory, cmd *cobra.Command, out, errout io.Writer, cfg *RouterConfig, args []string) error {
@@ -696,6 +687,8 @@ func RunCmdRouter(f *clientcmd.Factory, cmd *cobra.Command, out, errout io.Write
696687
if cfg.Type == "haproxy-router" && cfg.StatsPort != 0 {
697688
env["ROUTER_LISTEN_ADDR"] = fmt.Sprintf("0.0.0.0:%d", cfg.StatsPort)
698689
env["ROUTER_METRICS_TYPE"] = "haproxy"
690+
env["ROUTER_METRICS_TLS_CERT_FILE"] = "/etc/pki/tls/metrics/tls.crt"
691+
env["ROUTER_METRICS_TLS_KEY_FILE"] = "/etc/pki/tls/metrics/tls.key"
699692
}
700693
env.Add(secretEnv)
701694
if len(defaultCert) > 0 {
@@ -741,13 +734,6 @@ func RunCmdRouter(f *clientcmd.Factory, cmd *cobra.Command, out, errout io.Write
741734
},
742735
}
743736

744-
if cfg.StatsPort > 0 && cfg.ExposeMetrics {
745-
pc := generateMetricsExporterContainer(cfg, env)
746-
if pc != nil {
747-
containers = append(containers, *pc)
748-
}
749-
}
750-
751737
objects := []runtime.Object{}
752738
for _, s := range secrets {
753739
objects = append(objects, s)
@@ -826,6 +812,9 @@ func RunCmdRouter(f *clientcmd.Factory, cmd *cobra.Command, out, errout io.Write
826812
// The secret generated by the service annotaion contains a tls.crt and tls.key
827813
// which ultimately need to be combined into a pem
828814
t.Annotations["service.alpha.openshift.io/serving-cert-secret-name"] = certName
815+
} else if cfg.Type == "haproxy-router" && cfg.StatsPort != 0 {
816+
// Generate a serving cert for metrics only
817+
t.Annotations["service.alpha.openshift.io/serving-cert-secret-name"] = "router-metrics-tls"
829818
}
830819
}
831820
}

pkg/oc/bootstrap/bindata.go

Lines changed: 85 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)