Skip to content

Commit f740e52

Browse files
Merge pull request kubernetes-csi#115 from jsafrane/rebase-v1.1.0
Bug 1912237: Rebase to v1.1.0 for OCP 4.7
2 parents 3b9403f + 023c5d2 commit f740e52

File tree

795 files changed

+81873
-29577
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

795 files changed

+81873
-29577
lines changed

CHANGELOG-1.1.md

Lines changed: 242 additions & 0 deletions
Large diffs are not rendered by default.

Dockerfile.openshift.rhel7

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ WORKDIR /go/src/github.com/kubernetes-csi/external-resizer
33
COPY . .
44
RUN make build
55

6-
FROM registry.svc.ci.openshift.org/ocp/4.0:base
6+
FROM registry.svc.ci.openshift.org/ocp/4.7:base
77
COPY --from=builder /go/src/github.com/kubernetes-csi/external-resizer/bin/csi-resizer /usr/bin/
88
ENTRYPOINT ["/usr/bin/csi-resizer"]

README.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ Note that the external-resizer does not scale with more replicas. Only one exter
5757

5858
* `--workers <num>`: Number of simultaneously running `ControllerExpandVolume` operations. Default value is `10`.
5959

60-
* `--metrics-address`: The TCP network address where the prometheus metrics endpoint will run (example: `:8080` which corresponds to port 8080 on local host). The default is empty string, which means metrics endpoint is disabled.
60+
* `--http-endpoint`: The TCP network address where the HTTP server for diagnostics, including metrics and leader election health check, will listen (example: `:8080` which corresponds to port 8080 on local host). The default is empty string, which means the server is disabled.
6161

6262
* `--metrics-path`: The HTTP path where prometheus metrics will be exposed. Default is `/metrics`.
6363

@@ -69,10 +69,20 @@ Note that the external-resizer does not scale with more replicas. Only one exter
6969

7070
* `--master <url>`: Master URL to build a client config from. When omitted, default token provided by Kubernetes will be used. This option is useful only when the external-resizer does not run as a Kubernetes pod, e.g. for debugging. Either this or `--kubeconfig` needs to be set if the external-resizer is being run out of cluster.
7171

72+
* `--metrics-address`: (deprecated) The TCP network address where the prometheus metrics endpoint will run (example: `:8080` which corresponds to port 8080 on local host). The default is empty string, which means metrics endpoint is disabled.
73+
7274
* `--version`: Prints current external-resizer version and quits.
7375

7476
* All glog / klog arguments are supported, such as `-v <log level>` or `-alsologtostderr`.
7577

78+
### HTTP endpoint
79+
80+
The external-resizer optionally exposes an HTTP endpoint at address:port specified by `--http-endpoint` argument. When set, these two paths are exposed:
81+
82+
* Metrics path, as set by `--metrics-path` argument (default is `/metrics`).
83+
* Leader election health check at `/healthz/leader-election`. It is recommended to run a liveness probe against this endpoint when leader election is used to kill external-resizer leader that fails to connect to the API server to renew its leadership. See https://github.com/kubernetes-csi/csi-lib-utils/issues/66 for details.
84+
85+
7686
## Community, discussion, contribution, and support
7787

7888
Learn how to engage with the Kubernetes community on the [community page](http://kubernetes.io/community/).

cmd/csi-resizer/main.go

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@ import (
2020
"context"
2121
"flag"
2222
"fmt"
23+
"net/http"
2324
"os"
2425
"time"
2526

27+
"github.com/kubernetes-csi/csi-lib-utils/metrics"
28+
"github.com/kubernetes-csi/external-resizer/pkg/csi"
2629
"k8s.io/client-go/kubernetes"
2730
"k8s.io/client-go/rest"
2831
"k8s.io/client-go/tools/clientcmd"
@@ -36,7 +39,7 @@ import (
3639

3740
"k8s.io/apimachinery/pkg/util/wait"
3841
"k8s.io/client-go/informers"
39-
"k8s.io/klog"
42+
"k8s.io/klog/v2"
4043
)
4144

4245
var (
@@ -56,7 +59,8 @@ var (
5659
enableLeaderElection = flag.Bool("leader-election", false, "Enable leader election.")
5760
leaderElectionNamespace = flag.String("leader-election-namespace", "", "Namespace where the leader election resource lives. Defaults to the pod namespace if not set.")
5861

59-
metricsAddress = flag.String("metrics-address", "", "The TCP network address where the prometheus metrics endpoint will listen (example: `:8080`). The default is empty string, which means metrics endpoint is disabled.")
62+
metricsAddress = flag.String("metrics-address", "", "(deprecated) The TCP network address where the prometheus metrics endpoint will listen (example: `:8080`). The default is empty string, which means metrics endpoint is disabled. Only one of `--metrics-address` and `--http-endpoint` can be set.")
63+
httpEndpoint = flag.String("http-endpoint", "", "The TCP network address where the HTTP server for diagnostics, including metrics and leader election health check, will listen (example: `:8080`). The default is empty string, which means the server is disabled. Only one of `--metrics-address` and `--http-endpoint` can be set.")
6064
metricsPath = flag.String("metrics-path", "/metrics", "The HTTP path where prometheus metrics will be exposed. Default is `/metrics`.")
6165

6266
kubeAPIQPS = flag.Float64("kube-api-qps", 5, "QPS to use while communicating with the kubernetes apiserver. Defaults to 5.0.")
@@ -78,6 +82,15 @@ func main() {
7882
}
7983
klog.Infof("Version : %s", version)
8084

85+
if *metricsAddress != "" && *httpEndpoint != "" {
86+
klog.Error("only one of `--metrics-address` and `--http-endpoint` can be set.")
87+
os.Exit(1)
88+
}
89+
addr := *metricsAddress
90+
if addr == "" {
91+
addr = *httpEndpoint
92+
}
93+
8194
var config *rest.Config
8295
var err error
8396
if *master != "" || *kubeConfig != "" {
@@ -99,17 +112,44 @@ func main() {
99112

100113
informerFactory := informers.NewSharedInformerFactory(kubeClient, *resyncPeriod)
101114

102-
csiResizer, err := resizer.NewResizer(
103-
*csiAddress,
115+
mux := http.NewServeMux()
116+
117+
metricsManager := metrics.NewCSIMetricsManager("" /* driverName */)
118+
119+
csiClient, err := csi.New(*csiAddress, *timeout, metricsManager)
120+
if err != nil {
121+
klog.Fatal(err.Error())
122+
}
123+
124+
driverName, err := getDriverName(csiClient, *timeout)
125+
if err != nil {
126+
klog.Fatal(fmt.Errorf("get driver name failed: %v", err))
127+
}
128+
klog.V(2).Infof("CSI driver name: %q", driverName)
129+
130+
csiResizer, err := resizer.NewResizerFromClient(
131+
csiClient,
104132
*timeout,
105133
kubeClient,
106134
informerFactory,
107-
*metricsAddress,
108-
*metricsPath)
135+
driverName)
109136
if err != nil {
110137
klog.Fatal(err.Error())
111138
}
112139

140+
// Start HTTP server for metrics + leader election healthz
141+
if addr != "" {
142+
metricsManager.RegisterToServer(mux, *metricsPath)
143+
metricsManager.SetDriverName(driverName)
144+
go func() {
145+
klog.Infof("ServeMux listening at %q", addr)
146+
err := http.ListenAndServe(addr, mux)
147+
if err != nil {
148+
klog.Fatalf("Failed to start HTTP server at specified address (%q) and metrics path (%q): %s", addr, *metricsPath, err)
149+
}
150+
}()
151+
}
152+
113153
resizerName := csiResizer.Name()
114154
rc := controller.NewResizeController(resizerName, csiResizer, kubeClient, *resyncPeriod, informerFactory,
115155
workqueue.NewItemExponentialFailureRateLimiter(*retryIntervalStart, *retryIntervalMax),
@@ -129,6 +169,9 @@ func main() {
129169
klog.Fatal(err.Error())
130170
}
131171
le := leaderelection.NewLeaderElection(leKubeClient, lockName, run)
172+
if *httpEndpoint != "" {
173+
le.PrepareHealthCheck(mux, leaderelection.DefaultHealthCheckTimeout)
174+
}
132175

133176
if *leaderElectionNamespace != "" {
134177
le.WithNamespace(*leaderElectionNamespace)
@@ -139,3 +182,9 @@ func main() {
139182
}
140183
}
141184
}
185+
186+
func getDriverName(client csi.Client, timeout time.Duration) (string, error) {
187+
ctx, cancel := context.WithTimeout(context.Background(), timeout)
188+
defer cancel()
189+
return client.GetDriverName(ctx)
190+
}

deploy/kubernetes/deployment.yaml

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,28 @@ spec:
1919
serviceAccount: csi-resizer
2020
containers:
2121
- name: csi-resizer
22-
image: quay.io/k8scsi/csi-resizer:canary
22+
image: gcr.io/k8s-staging-sig-storage/csi-resizer:canary
2323
args:
2424
- "--v=5"
2525
- "--csi-address=$(ADDRESS)"
2626
- "--leader-election"
27+
- "--http-endpoint=:8080"
2728
env:
2829
- name: ADDRESS
2930
value: /var/lib/csi/sockets/pluginproxy/mock.socket
3031
imagePullPolicy: "IfNotPresent"
32+
ports:
33+
- containerPort: 8080
34+
name: http-endpoint
35+
protocol: TCP
36+
livenessProbe:
37+
failureThreshold: 1
38+
httpGet:
39+
path: /healthz/leader-election
40+
port: http-endpoint
41+
initialDelaySeconds: 10
42+
timeoutSeconds: 10
43+
periodSeconds: 20
3144
volumeMounts:
3245
- name: socket-dir
3346
mountPath: /var/lib/csi/sockets/pluginproxy/

go.mod

Lines changed: 53 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,53 +3,58 @@ module github.com/kubernetes-csi/external-resizer
33
go 1.15
44

55
require (
6-
github.com/container-storage-interface/spec v1.2.0
7-
github.com/imdario/mergo v0.3.9 // indirect
8-
github.com/kubernetes-csi/csi-lib-utils v0.7.0
9-
google.golang.org/grpc v1.28.0
10-
k8s.io/api v0.19.0
11-
k8s.io/apimachinery v0.19.0
12-
k8s.io/client-go v0.19.0
13-
k8s.io/csi-translation-lib v0.19.0
14-
k8s.io/klog v1.0.0
6+
github.com/container-storage-interface/spec v1.3.0
7+
github.com/go-logr/logr v0.3.0 // indirect
8+
github.com/google/go-cmp v0.5.4 // indirect
9+
github.com/google/gofuzz v1.2.0 // indirect
10+
github.com/googleapis/gnostic v0.5.3 // indirect
11+
github.com/hashicorp/golang-lru v0.5.4 // indirect
12+
github.com/imdario/mergo v0.3.11 // indirect
13+
github.com/kubernetes-csi/csi-lib-utils v0.9.0
14+
github.com/prometheus/client_golang v1.9.0 // indirect
15+
golang.org/x/crypto v0.0.0-20201217014255-9d1352758620 // indirect
16+
golang.org/x/net v0.0.0-20201216054612-986b41b23924 // indirect
17+
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5 // indirect
18+
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect
19+
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect
20+
google.golang.org/appengine v1.6.7 // indirect
21+
google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d // indirect
22+
google.golang.org/grpc v1.34.0
23+
gopkg.in/yaml.v2 v2.4.0 // indirect
24+
k8s.io/api v0.20.0
25+
k8s.io/apimachinery v0.21.0-alpha.0
26+
k8s.io/client-go v0.20.0
27+
k8s.io/component-base v0.20.0 // indirect
28+
k8s.io/csi-translation-lib v0.20.0
29+
k8s.io/klog/v2 v2.4.0
1530
)
1631

17-
replace k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.19.0
18-
19-
replace k8s.io/apiserver => k8s.io/apiserver v0.19.0
20-
21-
replace k8s.io/cli-runtime => k8s.io/cli-runtime v0.19.0
22-
23-
replace k8s.io/cloud-provider => k8s.io/cloud-provider v0.19.0
24-
25-
replace k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.19.0
26-
27-
replace k8s.io/code-generator => k8s.io/code-generator v0.19.0
28-
29-
replace k8s.io/component-base => k8s.io/component-base v0.19.0
30-
31-
replace k8s.io/cri-api => k8s.io/cri-api v0.19.0
32-
33-
replace k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.19.0
34-
35-
replace k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.19.0
36-
37-
replace k8s.io/kube-proxy => k8s.io/kube-proxy v0.19.0
38-
39-
replace k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.19.0
40-
41-
replace k8s.io/kubectl => k8s.io/kubectl v0.19.0
42-
43-
replace k8s.io/kubelet => k8s.io/kubelet v0.19.0
44-
45-
replace k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.19.0
46-
47-
replace k8s.io/metrics => k8s.io/metrics v0.19.0
48-
49-
replace k8s.io/node-api => k8s.io/node-api v0.19.0
50-
51-
replace k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.19.0
52-
53-
replace k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.19.0
54-
55-
replace k8s.io/sample-controller => k8s.io/sample-controller v0.19.0
32+
replace (
33+
k8s.io/api => k8s.io/api v0.20.0
34+
k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.20.0
35+
k8s.io/apimachinery => k8s.io/apimachinery v0.21.0-alpha.0
36+
k8s.io/apiserver => k8s.io/apiserver v0.20.0
37+
k8s.io/cli-runtime => k8s.io/cli-runtime v0.20.0
38+
k8s.io/client-go => k8s.io/client-go v0.20.0
39+
k8s.io/cloud-provider => k8s.io/cloud-provider v0.20.0
40+
k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.20.0
41+
k8s.io/code-generator => k8s.io/code-generator v0.20.1-rc.1
42+
k8s.io/component-base => k8s.io/component-base v0.20.0
43+
k8s.io/component-helpers => k8s.io/component-helpers v0.20.0
44+
k8s.io/controller-manager => k8s.io/controller-manager v0.20.0
45+
k8s.io/cri-api => k8s.io/cri-api v0.20.1-rc.1
46+
k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.20.0
47+
k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.20.0
48+
k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.20.0
49+
k8s.io/kube-proxy => k8s.io/kube-proxy v0.20.0
50+
k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.20.0
51+
k8s.io/kubectl => k8s.io/kubectl v0.20.0
52+
k8s.io/kubelet => k8s.io/kubelet v0.20.0
53+
k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.20.0
54+
k8s.io/metrics => k8s.io/metrics v0.20.0
55+
k8s.io/mount-utils => k8s.io/mount-utils v0.20.1-rc.1
56+
k8s.io/node-api => k8s.io/node-api v0.19.0
57+
k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.20.0
58+
k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.20.0
59+
k8s.io/sample-controller => k8s.io/sample-controller v0.20.0
60+
)

0 commit comments

Comments
 (0)