Skip to content

Commit d74ee1f

Browse files
committed
Implement secure metrics serving
Signed-off-by: Stefan Büringer [email protected]
1 parent c074408 commit d74ee1f

File tree

23 files changed

+233
-47
lines changed

23 files changed

+233
-47
lines changed

bootstrap/kubeadm/config/manager/manager.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ spec:
2020
- /manager
2121
args:
2222
- "--leader-elect"
23-
- "--metrics-bind-addr=localhost:8080"
23+
- "--metrics-bind-addr=:8443"
2424
- "--feature-gates=MachinePool=${EXP_MACHINE_POOL:=false},KubeadmBootstrapFormatIgnition=${EXP_KUBEADM_BOOTSTRAP_FORMAT_IGNITION:=false}"
2525
- "--bootstrap-token-ttl=${KUBEADM_BOOTSTRAP_TOKEN_TTL:=15m}"
2626
image: controller:latest
@@ -29,6 +29,9 @@ spec:
2929
- containerPort: 9440
3030
name: healthz
3131
protocol: TCP
32+
- containerPort: 8443
33+
name: metrics
34+
protocol: TCP
3235
readinessProbe:
3336
httpGet:
3437
path: /readyz

bootstrap/kubeadm/config/rbac/role.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@ kind: ClusterRole
44
metadata:
55
name: manager-role
66
rules:
7+
- apiGroups:
8+
- authentication.k8s.io
9+
resources:
10+
- tokenreviews
11+
verbs:
12+
- create
13+
- apiGroups:
14+
- authorization.k8s.io
15+
resources:
16+
- subjectaccessreviews
17+
verbs:
18+
- create
719
- apiGroups:
820
- ""
921
resources:

bootstrap/kubeadm/main.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"context"
2222
"flag"
2323
"fmt"
24+
"net/http"
2425
"os"
2526
goruntime "runtime"
2627
"time"
@@ -31,6 +32,7 @@ import (
3132
"k8s.io/apimachinery/pkg/labels"
3233
"k8s.io/apimachinery/pkg/runtime"
3334
"k8s.io/apimachinery/pkg/selection"
35+
"k8s.io/apiserver/pkg/server/routes"
3436
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
3537
"k8s.io/client-go/tools/leaderelection/resourcelock"
3638
cliflag "k8s.io/component-base/cli/flag"
@@ -42,6 +44,7 @@ import (
4244
"sigs.k8s.io/controller-runtime/pkg/cache"
4345
"sigs.k8s.io/controller-runtime/pkg/client"
4446
"sigs.k8s.io/controller-runtime/pkg/controller"
47+
"sigs.k8s.io/controller-runtime/pkg/metrics/filters"
4548
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
4649
"sigs.k8s.io/controller-runtime/pkg/webhook"
4750

@@ -103,7 +106,7 @@ var (
103106
func InitFlags(fs *pflag.FlagSet) {
104107
logsv1.AddFlags(logOptions, fs)
105108

106-
fs.StringVar(&metricsBindAddr, "metrics-bind-addr", "localhost:8080",
109+
fs.StringVar(&metricsBindAddr, "metrics-bind-addr", ":8443",
107110
"The address the metric endpoint binds to.")
108111

109112
fs.BoolVar(&enableLeaderElection, "leader-elect", false,
@@ -221,7 +224,12 @@ func main() {
221224
HealthProbeBindAddress: healthAddr,
222225
PprofBindAddress: profilerAddress,
223226
Metrics: metricsserver.Options{
224-
BindAddress: metricsBindAddr,
227+
BindAddress: metricsBindAddr,
228+
SecureServing: true,
229+
FilterProvider: filters.WithAuthenticationAndAuthorization,
230+
ExtraHandlers: map[string]http.Handler{
231+
"/debug/flags/v": routes.StringFlagPutHandler(logs.GlogSetter),
232+
},
225233
},
226234
Cache: cache.Options{
227235
DefaultNamespaces: watchNamespaces,

config/manager/manager.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ spec:
2121
- /manager
2222
args:
2323
- "--leader-elect"
24-
- "--metrics-bind-addr=localhost:8080"
24+
- "--metrics-bind-addr=:8443"
2525
- "--feature-gates=MachinePool=${EXP_MACHINE_POOL:=false},ClusterResourceSet=${EXP_CLUSTER_RESOURCE_SET:=false},ClusterTopology=${CLUSTER_TOPOLOGY:=false},RuntimeSDK=${EXP_RUNTIME_SDK:=false},MachineSetPreflightChecks=${EXP_MACHINE_SET_PREFLIGHT_CHECKS:=false}"
2626
image: controller:latest
2727
name: manager
@@ -42,6 +42,9 @@ spec:
4242
- containerPort: 9440
4343
name: healthz
4444
protocol: TCP
45+
- containerPort: 8443
46+
name: metrics
47+
protocol: TCP
4548
readinessProbe:
4649
httpGet:
4750
path: /readyz

config/rbac/role.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@ kind: ClusterRole
44
metadata:
55
name: manager-role
66
rules:
7+
- apiGroups:
8+
- authentication.k8s.io
9+
resources:
10+
- tokenreviews
11+
verbs:
12+
- create
13+
- apiGroups:
14+
- authorization.k8s.io
15+
resources:
16+
- subjectaccessreviews
17+
verbs:
18+
- create
719
- apiGroups:
820
- ""
921
resources:

controlplane/kubeadm/config/manager/manager.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ spec:
2020
- /manager
2121
args:
2222
- "--leader-elect"
23-
- "--metrics-bind-addr=localhost:8080"
23+
- "--metrics-bind-addr=:8443"
2424
- "--feature-gates=ClusterTopology=${CLUSTER_TOPOLOGY:=false},KubeadmBootstrapFormatIgnition=${EXP_KUBEADM_BOOTSTRAP_FORMAT_IGNITION:=false}"
2525
image: controller:latest
2626
name: manager
@@ -41,6 +41,9 @@ spec:
4141
- containerPort: 9440
4242
name: healthz
4343
protocol: TCP
44+
- containerPort: 8443
45+
name: metrics
46+
protocol: TCP
4447
readinessProbe:
4548
httpGet:
4649
path: /readyz

controlplane/kubeadm/config/rbac/role.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,18 @@ kind: ClusterRole
44
metadata:
55
name: manager-role
66
rules:
7+
- apiGroups:
8+
- authentication.k8s.io
9+
resources:
10+
- tokenreviews
11+
verbs:
12+
- create
13+
- apiGroups:
14+
- authorization.k8s.io
15+
resources:
16+
- subjectaccessreviews
17+
verbs:
18+
- create
719
- apiGroups:
820
- apiextensions.k8s.io
921
resources:

controlplane/kubeadm/main.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"context"
2222
"flag"
2323
"fmt"
24+
"net/http"
2425
"os"
2526
goruntime "runtime"
2627
"time"
@@ -33,6 +34,7 @@ import (
3334
"k8s.io/apimachinery/pkg/labels"
3435
"k8s.io/apimachinery/pkg/runtime"
3536
"k8s.io/apimachinery/pkg/selection"
37+
"k8s.io/apiserver/pkg/server/routes"
3638
clientgoscheme "k8s.io/client-go/kubernetes/scheme"
3739
"k8s.io/client-go/tools/leaderelection/resourcelock"
3840
cliflag "k8s.io/component-base/cli/flag"
@@ -44,6 +46,7 @@ import (
4446
"sigs.k8s.io/controller-runtime/pkg/cache"
4547
"sigs.k8s.io/controller-runtime/pkg/client"
4648
"sigs.k8s.io/controller-runtime/pkg/controller"
49+
"sigs.k8s.io/controller-runtime/pkg/metrics/filters"
4750
metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
4851
"sigs.k8s.io/controller-runtime/pkg/webhook"
4952

@@ -108,7 +111,7 @@ var (
108111
func InitFlags(fs *pflag.FlagSet) {
109112
logsv1.AddFlags(logOptions, fs)
110113

111-
fs.StringVar(&metricsBindAddr, "metrics-bind-addr", "localhost:8080",
114+
fs.StringVar(&metricsBindAddr, "metrics-bind-addr", ":8443",
112115
"The address the metric endpoint binds to.")
113116

114117
fs.BoolVar(&enableLeaderElection, "leader-elect", false,
@@ -224,7 +227,12 @@ func main() {
224227
HealthProbeBindAddress: healthAddr,
225228
PprofBindAddress: profilerAddress,
226229
Metrics: metricsserver.Options{
227-
BindAddress: metricsBindAddr,
230+
BindAddress: metricsBindAddr,
231+
SecureServing: true,
232+
FilterProvider: filters.WithAuthenticationAndAuthorization,
233+
ExtraHandlers: map[string]http.Handler{
234+
"/debug/flags/v": routes.StringFlagPutHandler(logs.GlogSetter),
235+
},
228236
},
229237
Cache: cache.Options{
230238
DefaultNamespaces: watchNamespaces,

docs/book/src/developer/providers/migrations/v1.5-to-v1.6.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,4 @@ maintainers of providers and consumers of our Go API.
3838
### Suggested changes for providers
3939

4040
- In order to reduce dependencies for API package consumers, CAPI has diverged from the default kubebuilder scheme builder. This new pattern may also be useful for reducing dependencies in provider API packages. For more information [see the implementers guide.](../implementers-guide/create_api.md#registering-apis-in-the-scheme)
41+
- FIXME(sbueringer): Add something about secure metrics

go.mod

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,14 @@ require (
5454
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
5555
github.com/Masterminds/goutils v1.1.1 // indirect
5656
github.com/Masterminds/semver/v3 v3.2.0 // indirect
57+
github.com/NYTimes/gziphandler v1.1.1 // indirect
5758
github.com/ProtonMail/go-crypto v0.0.0-20230217124315-7d5c6f04bbb8 // indirect
5859
github.com/ajeddeloh/go-json v0.0.0-20200220154158-5ae607161559 // indirect
5960
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect
6061
github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df // indirect
6162
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a // indirect
6263
github.com/beorn7/perks v1.0.1 // indirect
64+
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
6365
github.com/cespare/xxhash/v2 v2.2.0 // indirect
6466
github.com/chai2010/gettext-go v1.0.2 // indirect
6567
github.com/cloudflare/circl v1.3.3 // indirect
@@ -72,9 +74,11 @@ require (
7274
github.com/evanphx/json-patch v5.6.0+incompatible // indirect
7375
github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d // indirect
7476
github.com/fatih/camelcase v1.0.0 // indirect
77+
github.com/felixge/httpsnoop v1.0.3 // indirect
7578
github.com/fsnotify/fsnotify v1.6.0 // indirect
7679
github.com/fvbommel/sortorder v1.1.0 // indirect
7780
github.com/go-errors/errors v1.4.2 // indirect
81+
github.com/go-logr/stdr v1.2.2 // indirect
7882
github.com/go-logr/zapr v1.2.4 // indirect
7983
github.com/go-openapi/jsonpointer v0.19.6 // indirect
8084
github.com/go-openapi/jsonreference v0.20.2 // indirect
@@ -91,6 +95,8 @@ require (
9195
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect
9296
github.com/google/uuid v1.3.0 // indirect
9397
github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 // indirect
98+
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect
99+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
94100
github.com/hashicorp/hcl v1.0.0 // indirect
95101
github.com/huandu/xstrings v1.3.3 // indirect
96102
github.com/imdario/mergo v0.3.13 // indirect
@@ -134,6 +140,16 @@ require (
134140
github.com/vincent-petithory/dataurl v1.0.0 // indirect
135141
github.com/xlab/treeprint v1.2.0 // indirect
136142
go.etcd.io/etcd/client/pkg/v3 v3.5.9 // indirect
143+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.35.0 // indirect
144+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.35.1 // indirect
145+
go.opentelemetry.io/otel v1.10.0 // indirect
146+
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.10.0 // indirect
147+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.10.0 // indirect
148+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.10.0 // indirect
149+
go.opentelemetry.io/otel/metric v0.31.0 // indirect
150+
go.opentelemetry.io/otel/sdk v1.10.0 // indirect
151+
go.opentelemetry.io/otel/trace v1.10.0 // indirect
152+
go.opentelemetry.io/proto/otlp v0.19.0 // indirect
137153
go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect
138154
go.uber.org/multierr v1.11.0 // indirect
139155
go.uber.org/zap v1.25.0 // indirect
@@ -153,11 +169,14 @@ require (
153169
google.golang.org/protobuf v1.31.0 // indirect
154170
gopkg.in/inf.v0 v0.9.1 // indirect
155171
gopkg.in/ini.v1 v1.67.0 // indirect
172+
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
156173
gopkg.in/yaml.v2 v2.4.0 // indirect
157174
gopkg.in/yaml.v3 v3.0.1 // indirect
158175
k8s.io/cli-runtime v0.28.0 // indirect
159176
k8s.io/component-helpers v0.28.0 // indirect
177+
k8s.io/kms v0.28.0 // indirect
160178
k8s.io/metrics v0.28.0 // indirect
179+
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.1.2 // indirect
161180
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
162181
sigs.k8s.io/kustomize/api v0.13.5-0.20230601165947-6ce0bf390ce3 // indirect
163182
sigs.k8s.io/kustomize/kustomize/v5 v5.0.4-0.20230601165947-6ce0bf390ce3 // indirect

0 commit comments

Comments
 (0)