Skip to content

Commit a62b02f

Browse files
joelanfordanik120
authored andcommitted
Secure metrics endpoint with cntrlr-runtime metrics authz mechanics
Signed-off-by: Joe Lanford <[email protected]> Signed-off-by: Anik Bhattacharjee <[email protected]>
1 parent ccf0c4c commit a62b02f

File tree

11 files changed

+304
-48
lines changed

11 files changed

+304
-48
lines changed

Makefile

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ GINKGO := $(TOOL_EXEC) github.com/onsi/ginkgo/v2/ginkgo
4848

4949
# Target environment and Dependencies #
5050

51+
# Cert-manager version - update this for new releases
52+
CERT_MANAGER_VERSION ?= v1.18.2
53+
54+
# Cert-manager deployment timeout
55+
CERT_MANAGER_TIMEOUT ?= 120s
56+
5157
# Minor Kubernetes version to build against derived from the client-go dependency version
5258
KUBE_MINOR ?= $(shell go list -m k8s.io/client-go | cut -d" " -f2 | sed 's/^v0\.\([[:digit:]]\{1,\}\)\.[[:digit:]]\{1,\}$$/1.\1/')
5359

@@ -157,7 +163,29 @@ local-build: IMAGE_TAG = local
157163
local-build: image
158164

159165
.PHONY: run-local
160-
run-local: local-build kind-create deploy
166+
run-local: local-build kind-create cert-manager-install deploy
167+
168+
.PHONY: cert-manager-install
169+
cert-manager-install: #HELP Install cert-manager $(CERT_MANAGER_VERSION)
170+
@echo "Installing cert-manager $(CERT_MANAGER_VERSION)"
171+
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/$(CERT_MANAGER_VERSION)/cert-manager.yaml
172+
@echo "Waiting for cert-manager to be ready..."
173+
kubectl wait --for=condition=Available --namespace=cert-manager deployment/cert-manager --timeout=$(CERT_MANAGER_TIMEOUT)
174+
kubectl wait --for=condition=Available --namespace=cert-manager deployment/cert-manager-cainjector --timeout=$(CERT_MANAGER_TIMEOUT)
175+
kubectl wait --for=condition=Available --namespace=cert-manager deployment/cert-manager-webhook --timeout=$(CERT_MANAGER_TIMEOUT)
176+
@echo "Waiting for cert-manager webhook to be ready..."
177+
kubectl wait --for=condition=Ready --namespace=cert-manager pod -l app=webhook --timeout=$(CERT_MANAGER_TIMEOUT)
178+
@echo "Waiting for cert-manager CRDs to be available..."
179+
kubectl wait --for condition=established --timeout=$(CERT_MANAGER_TIMEOUT) crd/certificates.cert-manager.io
180+
kubectl wait --for condition=established --timeout=$(CERT_MANAGER_TIMEOUT) crd/issuers.cert-manager.io
181+
@echo "cert-manager $(CERT_MANAGER_VERSION) installed successfully"
182+
183+
.PHONY: cert-manager-uninstall
184+
cert-manager-uninstall: #HELP Uninstall cert-manager
185+
@echo "Uninstalling cert-manager..."
186+
kubectl delete -f https://github.com/cert-manager/cert-manager/releases/download/$(CERT_MANAGER_VERSION)/cert-manager.yaml --ignore-not-found=true
187+
@echo "cert-manager uninstalled"
188+
161189

162190
.PHONY: clean
163191
clean: #HELP Clean up build artifacts
@@ -231,6 +259,7 @@ deploy: $(KIND) $(HELM) #HELP Deploy OLM to kind cluster $KIND_CLUSTER_NAME (def
231259
$(KIND) load docker-image $(OLM_IMAGE) --name $(KIND_CLUSTER_NAME); \
232260
$(HELM) upgrade --install olm deploy/chart \
233261
--set debug=true \
262+
--set certManager.enabled=true \
234263
--set olm.image.ref=$(OLM_IMAGE) \
235264
--set olm.image.pullPolicy=IfNotPresent \
236265
--set catalog.image.ref=$(OLM_IMAGE) \
@@ -254,6 +283,9 @@ undeploy: $(KIND) $(HELM) #HELP Uninstall OLM from kind cluster $KIND_CLUSTER_NA
254283
$(HELM) uninstall olm
255284
kubectl delete -f deploy/chart/crds
256285

286+
# Uninstall cert-manager
287+
$(MAKE) cert-manager-uninstall
288+
257289
#SECTION e2e
258290

259291
# E2E test configuration

cmd/catalog/main.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,16 @@ func (o *options) run(ctx context.Context, logger *logrus.Logger) error {
5757
o.catalogNamespace = catalogNamespaceEnvVarValue
5858
}
5959

60+
// create a config client for operator status
61+
config, err := clientcmd.BuildConfigFromFlags("", o.kubeconfig)
62+
if err != nil {
63+
return fmt.Errorf("error configuring client: %s", err.Error())
64+
}
65+
6066
listenAndServe, err := server.GetListenAndServeFunc(
6167
server.WithLogger(logger),
6268
server.WithTLS(&o.tlsCertPath, &o.tlsKeyPath, &o.clientCAPath),
69+
server.WithKubeConfig(config),
6370
server.WithDebug(o.debug),
6471
)
6572
if err != nil {
@@ -72,11 +79,6 @@ func (o *options) run(ctx context.Context, logger *logrus.Logger) error {
7279
}
7380
}()
7481

75-
// create a config client for operator status
76-
config, err := clientcmd.BuildConfigFromFlags("", o.kubeconfig)
77-
if err != nil {
78-
return fmt.Errorf("error configuring client: %s", err.Error())
79-
}
8082
configClient, err := configv1client.NewForConfig(config)
8183
if err != nil {
8284
return fmt.Errorf("error configuring client: %s", err.Error())

cmd/olm/main.go

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,18 @@ func main() {
123123
}
124124
logger.Infof("log level %s", logger.Level)
125125

126-
listenAndServe, err := server.GetListenAndServeFunc(server.WithLogger(logger), server.WithTLS(tlsCertPath, tlsKeyPath, clientCAPath), server.WithDebug(*debug))
126+
mgr, err := Manager(ctx, *debug)
127+
if err != nil {
128+
logger.WithError(err).Fatal("error configuring controller manager")
129+
}
130+
config := mgr.GetConfig()
131+
132+
listenAndServe, err := server.GetListenAndServeFunc(
133+
server.WithLogger(logger),
134+
server.WithTLS(tlsCertPath, tlsKeyPath, clientCAPath),
135+
server.WithKubeConfig(config),
136+
server.WithDebug(*debug),
137+
)
127138
if err != nil {
128139
logger.Fatalf("Error setting up health/metric/pprof service: %v", err)
129140
}
@@ -134,12 +145,6 @@ func main() {
134145
}
135146
}()
136147

137-
mgr, err := Manager(ctx, *debug)
138-
if err != nil {
139-
logger.WithError(err).Fatal("error configuring controller manager")
140-
}
141-
config := mgr.GetConfig()
142-
143148
// create a config that validates we're creating objects with labels
144149
validatingConfig := validatingroundtripper.Wrap(config, mgr.GetScheme())
145150

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
{{- if .Values.certManager.enabled }}
2+
---
3+
apiVersion: cert-manager.io/v1
4+
kind: Issuer
5+
metadata:
6+
name: {{ .Values.certManager.issuer.name }}
7+
namespace: {{ .Values.namespace }}
8+
spec:
9+
{{- if .Values.certManager.issuer.selfSigned }}
10+
selfSigned: {}
11+
{{- else if .Values.certManager.issuer.ca }}
12+
ca:
13+
secretName: {{ .Values.certManager.issuer.ca.secretName }}
14+
{{- end }}
15+
---
16+
apiVersion: cert-manager.io/v1
17+
kind: Certificate
18+
metadata:
19+
name: {{ .Values.certManager.certificate.name }}
20+
namespace: {{ .Values.namespace }}
21+
spec:
22+
secretName: {{ .Values.certManager.certificate.secretName }}
23+
isCA: false
24+
usages:
25+
- server auth
26+
- client auth
27+
dnsNames:
28+
- localhost
29+
- catalog-operator.{{ .Values.namespace }}.svc
30+
- catalog-operator.{{ .Values.namespace }}.svc.cluster.local
31+
- olm-operator.{{ .Values.namespace }}.svc
32+
- olm-operator.{{ .Values.namespace }}.svc.cluster.local
33+
{{- range .Values.certManager.certificate.extraDnsNames }}
34+
- {{ . }}
35+
{{- end }}
36+
ipAddresses:
37+
- 127.0.0.1
38+
{{- range .Values.certManager.certificate.extraIpAddresses }}
39+
- {{ . }}
40+
{{- end }}
41+
issuerRef:
42+
name: {{ .Values.certManager.issuer.name }}
43+
kind: Issuer
44+
group: cert-manager.io
45+
{{- end }}
46+

deploy/chart/templates/0000_50_olm_07-olm-operator.deployment.yaml

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,14 @@ spec:
2222
seccompProfile:
2323
type: RuntimeDefault
2424
serviceAccountName: olm-operator-serviceaccount
25-
volumes:
26-
{{- if .Values.olm.tlsSecret }}
25+
volumes:
26+
{{- if .Values.certManager.enabled }}
2727
- name: srv-cert
2828
secret:
29-
secretName: {{ .Values.olm.tlsSecret }}
30-
{{- end }}
31-
{{- if .Values.olm.clientCASecret }}
29+
secretName: {{ .Values.certManager.certificate.secretName }}
3230
- name: profile-collector-cert
3331
secret:
34-
secretName: {{ .Values.olm.clientCASecret }}
32+
secretName: {{ .Values.certManager.certificate.secretName }}
3533
{{- end }}
3634
- name: tmpfs
3735
emptyDir: {}
@@ -43,12 +41,10 @@ spec:
4341
capabilities:
4442
drop: [ "ALL" ]
4543
volumeMounts:
46-
{{- if .Values.olm.tlsSecret }}
44+
{{- if .Values.certManager.enabled }}
4745
- name: srv-cert
4846
mountPath: "/srv-cert"
4947
readOnly: true
50-
{{- end }}
51-
{{- if .Values.olm.clientCASecret }}
5248
- name: profile-collector-cert
5349
mountPath: "/profile-collector-cert"
5450
readOnly: true
@@ -78,13 +74,11 @@ spec:
7874
- --writePackageServerStatusName
7975
- {{ .Values.writePackageServerStatusName }}
8076
{{- end }}
81-
{{- if .Values.olm.tlsSecret }}
77+
{{- if .Values.certManager.enabled }}
8278
- --tls-cert
8379
- /srv-cert/tls.crt
8480
- --tls-key
8581
- /srv-cert/tls.key
86-
{{- end }}
87-
{{- if .Values.olm.clientCASecret }}
8882
- --client-ca
8983
- /profile-collector-cert/tls.crt
9084
{{- end }}
@@ -97,12 +91,12 @@ spec:
9791
httpGet:
9892
path: /healthz
9993
port: {{ .Values.olm.service.internalPort }}
100-
scheme: {{ if .Values.olm.tlsSecret }}HTTPS{{ else }}HTTP{{end}}
94+
scheme: {{ if .Values.certManager.enabled }}HTTPS{{ else }}HTTP{{end}}
10195
readinessProbe:
10296
httpGet:
10397
path: /healthz
10498
port: {{ .Values.olm.service.internalPort }}
105-
scheme: {{ if .Values.olm.tlsSecret }}HTTPS{{ else }}HTTP{{end}}
99+
scheme: {{ if .Values.certManager.enabled }}HTTPS{{ else }}HTTP{{end}}
106100
terminationMessagePolicy: FallbackToLogsOnError
107101
env:
108102
- name: OPERATOR_NAMESPACE

deploy/chart/templates/0000_50_olm_08-catalog-operator.deployment.yaml

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,13 @@ spec:
2323
type: RuntimeDefault
2424
serviceAccountName: olm-operator-serviceaccount
2525
volumes:
26-
{{- if .Values.catalog.tlsSecret }}
26+
{{- if .Values.certManager.enabled }}
2727
- name: srv-cert
2828
secret:
29-
secretName: {{ .Values.catalog.tlsSecret }}
30-
{{- end }}
31-
{{- if .Values.catalog.clientCASecret }}
29+
secretName: {{ .Values.certManager.certificate.secretName }}
3230
- name: profile-collector-cert
3331
secret:
34-
secretName: {{ .Values.catalog.clientCASecret }}
32+
secretName: {{ .Values.certManager.certificate.secretName }}
3533
{{- end }}
3634
- name: tmpfs
3735
emptyDir: {}
@@ -43,12 +41,10 @@ spec:
4341
capabilities:
4442
drop: [ "ALL" ]
4543
volumeMounts:
46-
{{- if .Values.catalog.tlsSecret }}
44+
{{- if .Values.certManager.enabled }}
4745
- name: srv-cert
4846
mountPath: "/srv-cert"
4947
readOnly: true
50-
{{- end }}
51-
{{- if .Values.catalog.clientCASecret }}
5248
- name: profile-collector-cert
5349
mountPath: "/profile-collector-cert"
5450
readOnly: true
@@ -75,13 +71,11 @@ spec:
7571
- --writeStatusName
7672
- {{ .Values.writeStatusNameCatalog }}
7773
{{- end }}
78-
{{- if .Values.catalog.tlsSecret }}
74+
{{- if .Values.certManager.enabled }}
7975
- --tls-cert
8076
- /srv-cert/tls.crt
8177
- --tls-key
8278
- /srv-cert/tls.key
83-
{{- end }}
84-
{{- if .Values.catalog.clientCASecret }}
8579
- --client-ca
8680
- /profile-collector-cert/tls.crt
8781
{{- end }}
@@ -104,12 +98,12 @@ spec:
10498
httpGet:
10599
path: /healthz
106100
port: {{ .Values.catalog.service.internalPort }}
107-
scheme: {{ if .Values.catalog.tlsSecret }}HTTPS{{ else }}HTTP{{end}}
101+
scheme: {{ if .Values.certManager.enabled }}HTTPS{{ else }}HTTP{{end}}
108102
readinessProbe:
109103
httpGet:
110104
path: /healthz
111105
port: {{ .Values.catalog.service.internalPort }}
112-
scheme: {{ if .Values.catalog.tlsSecret }}HTTPS{{ else }}HTTP{{end}}
106+
scheme: {{ if .Values.certManager.enabled }}HTTPS{{ else }}HTTP{{end}}
113107
terminationMessagePolicy: FallbackToLogsOnError
114108
{{- if .Values.catalog.resources }}
115109
resources:

deploy/chart/templates/_helpers.tpl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ We truncate at 63 chars because some Kubernetes name fields are limited to this
1313
{{- define "fullname" -}}
1414
{{- $name := default .Chart.Name .Values.nameOverride -}}
1515
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
16-
{{- end -}}
16+
{{- end -}}
17+

deploy/chart/values.yaml

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,8 @@ olm:
2727
ref: quay.io/operator-framework/olm:master
2828
pullPolicy: Always
2929
service:
30-
internalPort: 8080
30+
internalPort: 8443
3131
externalPort: metrics
32-
# tlsSecret: olm-operator-serving-cert
33-
# clientCASecret: pprof-serving-cert
3432
nodeSelector:
3533
kubernetes.io/os: linux
3634
resources:
@@ -47,10 +45,8 @@ catalog:
4745
ref: quay.io/operator-framework/olm:master
4846
pullPolicy: Always
4947
service:
50-
internalPort: 8080
48+
internalPort: 8443
5149
externalPort: metrics
52-
# tlsSecret: catalog-operator-serving-cert
53-
# clientCASecret: pprof-serving-cert
5450
nodeSelector:
5551
kubernetes.io/os: linux
5652
resources:
@@ -78,6 +74,19 @@ monitoring:
7874
enabled: false
7975
namespace: monitoring
8076

77+
certManager:
78+
enabled: true
79+
issuer:
80+
name: olm-ca-issuer
81+
selfSigned: true
82+
ca:
83+
secretName: ""
84+
certificate:
85+
name: olm-cert
86+
secretName: olm-cert
87+
extraDnsNames: []
88+
extraIpAddresses: []
89+
8190
networkPolicy:
8291
dns:
8392
ports:

0 commit comments

Comments
 (0)