Skip to content

Commit 517ed30

Browse files
authored
chore: cherry pick commits for release v2.11.2 (#4826)
Co-authored-by: Jorge Turrado Ferrero <[email protected]> Co-authored-by: Dao Thanh Tung <[email protected]> Co-authored-by: Eldarrin <[email protected]> fix `msgBacklogThreshold` field being named wrongly as `msgBacklog` (#4736) fix: AWS Pod Identity uses default service account if not provided (#4768) fix: Restore prometheus metrics in Metrics Server (#4766) fix repo bug (#4792)
1 parent b8dbd29 commit 517ed30

File tree

17 files changed

+224
-142
lines changed

17 files changed

+224
-142
lines changed

CHANGELOG.md

+29-3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ To learn more about active deprecations, we recommend checking [GitHub Discussio
1616
## History
1717

1818
- [Unreleased](#unreleased)
19+
- [v2.11.2](#v2110)
20+
- [v2.11.1](#v2110)
1921
- [v2.11.0](#v2110)
2022
- [v2.10.1](#v2101)
2123
- [v2.10.0](#v2100)
@@ -55,9 +57,7 @@ To learn more about active deprecations, we recommend checking [GitHub Discussio
5557

5658
### Fixes
5759

58-
- **General**: Paused ScaledObject continues working after removing the annotation ([#4733](https://github.com/kedacore/keda/issues/4733))
59-
- **General**: Skip resolving secrets if namespace is restricted ([#4519](https://github.com/kedacore/keda/issues/4519))
60-
- **Prometheus**: Authenticated connections to Prometheus work in non-PodIdenty case ([#4695](https://github.com/kedacore/keda/issues/4695))
60+
- TODO ([#XXX](https://github.com/kedacore/keda/issue/XXX))
6161

6262
### Deprecations
6363

@@ -75,6 +75,32 @@ New deprecation(s):
7575

7676
- TODO ([#XXX](https://github.com/kedacore/keda/issue/XXX))
7777

78+
## v2.11.2
79+
80+
### Fixes
81+
82+
- **General**: Metrics server exposes Prometheus metrics ([#4776](https://github.com/kedacore/keda/issues/4776))
83+
- **AWS Pod Identity Authentication**: Use `default` service account if the workload doesn't set it ([#4767](https://github.com/kedacore/keda/issues/4767))
84+
- **GitHub Runner Scaler**: Fix rate checking on GHEC when HTTP 200 ([#4786](https://github.com/kedacore/keda/issues/4786))
85+
- **GitHub Runner Scaler**: Fix explicit repo check 404 to skip not crash ([#4790](https://github.com/kedacore/keda/issues/4790))
86+
- **Pulsar Scaler**: Fix `msgBacklogThreshold` field being named wrongly as `msgBacklog` ([#4681](https://github.com/kedacore/keda/issues/4681))
87+
88+
### Deprecations
89+
90+
You can find all deprecations in [this overview](https://github.com/kedacore/keda/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3Abreaking-change) and [join the discussion here](https://github.com/kedacore/keda/discussions/categories/deprecations).
91+
92+
New deprecation(s):
93+
94+
- **Pulsar Scaler**: Fix `msgBacklogThreshold` field being named wrongly as `msgBacklog` ([#4681](https://github.com/kedacore/keda/issues/4681))
95+
96+
## v2.11.1
97+
98+
### Fixes
99+
100+
- **General**: Paused ScaledObject continues working after removing the annotation ([#4733](https://github.com/kedacore/keda/issues/4733))
101+
- **General**: Skip resolving secrets if namespace is restricted ([#4519](https://github.com/kedacore/keda/issues/4519))
102+
- **Prometheus**: Authenticated connections to Prometheus work in non-PodIdenty case ([#4695](https://github.com/kedacore/keda/issues/4695))
103+
78104
## v2.11.0
79105

80106
### New

cmd/adapter/main.go

+22-50
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,9 @@ import (
2121
"flag"
2222
"fmt"
2323
"os"
24-
"time"
2524

2625
appsv1 "k8s.io/api/apps/v1"
27-
corev1 "k8s.io/api/core/v1"
28-
"k8s.io/apimachinery/pkg/util/wait"
29-
kubeinformers "k8s.io/client-go/informers"
30-
"k8s.io/client-go/kubernetes"
3126
"k8s.io/client-go/kubernetes/scheme"
32-
"k8s.io/client-go/tools/record"
3327
"k8s.io/klog/v2"
3428
"k8s.io/klog/v2/klogr"
3529
ctrl "sigs.k8s.io/controller-runtime"
@@ -40,7 +34,6 @@ import (
4034
kedav1alpha1 "github.com/kedacore/keda/v2/apis/keda/v1alpha1"
4135
"github.com/kedacore/keda/v2/pkg/metricsservice"
4236
kedaprovider "github.com/kedacore/keda/v2/pkg/provider"
43-
"github.com/kedacore/keda/v2/pkg/scaling"
4437
kedautil "github.com/kedacore/keda/v2/pkg/util"
4538
)
4639

@@ -62,44 +55,44 @@ var (
6255
metricsServiceAddr string
6356
)
6457

65-
func (a *Adapter) makeProvider(ctx context.Context, globalHTTPTimeout time.Duration) (provider.ExternalMetricsProvider, error) {
58+
func (a *Adapter) makeProvider(ctx context.Context) (provider.ExternalMetricsProvider, <-chan struct{}, error) {
6659
scheme := scheme.Scheme
6760
if err := appsv1.SchemeBuilder.AddToScheme(scheme); err != nil {
6861
logger.Error(err, "failed to add apps/v1 scheme to runtime scheme")
69-
return nil, fmt.Errorf("failed to add apps/v1 scheme to runtime scheme (%s)", err)
62+
return nil, nil, fmt.Errorf("failed to add apps/v1 scheme to runtime scheme (%s)", err)
7063
}
7164
if err := kedav1alpha1.SchemeBuilder.AddToScheme(scheme); err != nil {
7265
logger.Error(err, "failed to add keda scheme to runtime scheme")
73-
return nil, fmt.Errorf("failed to add keda scheme to runtime scheme (%s)", err)
66+
return nil, nil, fmt.Errorf("failed to add keda scheme to runtime scheme (%s)", err)
7467
}
7568
namespace, err := getWatchNamespace()
7669
if err != nil {
7770
logger.Error(err, "failed to get watch namespace")
78-
return nil, fmt.Errorf("failed to get watch namespace (%s)", err)
71+
return nil, nil, fmt.Errorf("failed to get watch namespace (%s)", err)
7972
}
8073

8174
leaseDuration, err := kedautil.ResolveOsEnvDuration("KEDA_METRICS_LEADER_ELECTION_LEASE_DURATION")
8275
if err != nil {
8376
logger.Error(err, "invalid KEDA_METRICS_LEADER_ELECTION_LEASE_DURATION")
84-
return nil, fmt.Errorf("invalid KEDA_METRICS_LEADER_ELECTION_LEASE_DURATION (%s)", err)
77+
return nil, nil, fmt.Errorf("invalid KEDA_METRICS_LEADER_ELECTION_LEASE_DURATION (%s)", err)
8578
}
8679

8780
renewDeadline, err := kedautil.ResolveOsEnvDuration("KEDA_METRICS_LEADER_ELECTION_RENEW_DEADLINE")
8881
if err != nil {
8982
logger.Error(err, "Invalid KEDA_METRICS_LEADER_ELECTION_RENEW_DEADLINE")
90-
return nil, fmt.Errorf("invalid KEDA_METRICS_LEADER_ELECTION_RENEW_DEADLINE (%s)", err)
83+
return nil, nil, fmt.Errorf("invalid KEDA_METRICS_LEADER_ELECTION_RENEW_DEADLINE (%s)", err)
9184
}
9285

9386
retryPeriod, err := kedautil.ResolveOsEnvDuration("KEDA_METRICS_LEADER_ELECTION_RETRY_PERIOD")
9487
if err != nil {
9588
logger.Error(err, "Invalid KEDA_METRICS_LEADER_ELECTION_RETRY_PERIOD")
96-
return nil, fmt.Errorf("invalid KEDA_METRICS_LEADER_ELECTION_RETRY_PERIOD (%s)", err)
89+
return nil, nil, fmt.Errorf("invalid KEDA_METRICS_LEADER_ELECTION_RETRY_PERIOD (%s)", err)
9790
}
9891

9992
useMetricsServiceGrpc, err := kedautil.ResolveOsEnvBool("KEDA_USE_METRICS_SERVICE_GRPC", true)
10093
if err != nil {
10194
logger.Error(err, "Invalid KEDA_USE_METRICS_SERVICE_GRPC")
102-
return nil, fmt.Errorf("invalid KEDA_USE_METRICS_SERVICE_GRPC (%s)", err)
95+
return nil, nil, fmt.Errorf("invalid KEDA_USE_METRICS_SERVICE_GRPC (%s)", err)
10396
}
10497

10598
// Get a config to talk to the apiserver
@@ -121,38 +114,24 @@ func (a *Adapter) makeProvider(ctx context.Context, globalHTTPTimeout time.Durat
121114
})
122115
if err != nil {
123116
logger.Error(err, "failed to setup manager")
124-
return nil, err
117+
return nil, nil, err
125118
}
126119

127-
broadcaster := record.NewBroadcaster()
128-
recorder := broadcaster.NewRecorder(scheme, corev1.EventSource{Component: "keda-metrics-adapter"})
129-
130-
kubeClientset, err := kubernetes.NewForConfig(cfg)
131-
if err != nil {
132-
logger.Error(err, "Unable to create kube clientset")
133-
return nil, err
134-
}
135-
objectNamespace, err := kedautil.GetClusterObjectNamespace()
136-
if err != nil {
137-
logger.Error(err, "Unable to get cluster object namespace")
138-
return nil, err
139-
}
140-
// the namespaced kubeInformerFactory is used to restrict secret informer to only list/watch secrets in KEDA cluster object namespace,
141-
// refer to https://github.com/kedacore/keda/issues/3668
142-
kubeInformerFactory := kubeinformers.NewSharedInformerFactoryWithOptions(kubeClientset, 1*time.Hour, kubeinformers.WithNamespace(objectNamespace))
143-
secretInformer := kubeInformerFactory.Core().V1().Secrets()
144-
145-
handler := scaling.NewScaleHandler(mgr.GetClient(), nil, scheme, globalHTTPTimeout, recorder, secretInformer.Lister())
146-
kubeInformerFactory.Start(ctx.Done())
147-
148120
logger.Info("Connecting Metrics Service gRPC client to the server", "address", metricsServiceAddr)
149121
grpcClient, err := metricsservice.NewGrpcClient(metricsServiceAddr, a.SecureServing.ServerCert.CertDirectory)
150122
if err != nil {
151123
logger.Error(err, "error connecting Metrics Service gRPC client to the server", "address", metricsServiceAddr)
152-
return nil, err
153-
}
154-
155-
return kedaprovider.NewProvider(ctx, logger, handler, mgr.GetClient(), *grpcClient, useMetricsServiceGrpc, namespace), nil
124+
return nil, nil, err
125+
}
126+
stopCh := make(chan struct{})
127+
go func() {
128+
if err := mgr.Start(ctx); err != nil {
129+
logger.Error(err, "controller-runtime encountered an error")
130+
stopCh <- struct{}{}
131+
close(stopCh)
132+
}
133+
}()
134+
return kedaprovider.NewProvider(ctx, logger, mgr.GetClient(), *grpcClient, useMetricsServiceGrpc, namespace), stopCh, nil
156135
}
157136

158137
// generateDefaultMetricsServiceAddr generates default Metrics Service gRPC Server address based on the current Namespace.
@@ -217,27 +196,20 @@ func main() {
217196

218197
ctrl.SetLogger(logger)
219198

220-
// default to 3 seconds if they don't pass the env var
221-
globalHTTPTimeoutMS, err := kedautil.ResolveOsEnvInt("KEDA_HTTP_DEFAULT_TIMEOUT", 3000)
222-
if err != nil {
223-
logger.Error(err, "Invalid KEDA_HTTP_DEFAULT_TIMEOUT")
224-
return
225-
}
226-
227199
err = printWelcomeMsg(cmd)
228200
if err != nil {
229201
return
230202
}
231203

232-
kedaProvider, err := cmd.makeProvider(ctx, time.Duration(globalHTTPTimeoutMS)*time.Millisecond)
204+
kedaProvider, stopCh, err := cmd.makeProvider(ctx)
233205
if err != nil {
234206
logger.Error(err, "making provider")
235207
return
236208
}
237209
cmd.WithExternalMetrics(kedaProvider)
238210

239211
logger.Info(cmd.Message)
240-
if err = cmd.Run(wait.NeverStop); err != nil {
212+
if err = cmd.Run(stopCh); err != nil {
241213
return
242214
}
243215
}

config/metrics-server/service.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ spec:
1313
- name: https
1414
port: 443
1515
targetPort: 6443
16-
- name: http
17-
port: 80
16+
- name: metrics
17+
port: 8080
1818
targetPort: 8080
1919
selector:
2020
app: keda-metrics-apiserver

pkg/provider/provider.go

+1-4
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,13 @@ import (
2929

3030
kedav1alpha1 "github.com/kedacore/keda/v2/apis/keda/v1alpha1"
3131
"github.com/kedacore/keda/v2/pkg/metricsservice"
32-
"github.com/kedacore/keda/v2/pkg/scaling"
3332
)
3433

3534
// KedaProvider implements External Metrics Provider
3635
type KedaProvider struct {
3736
defaults.DefaultExternalMetricsProvider
3837

3938
client client.Client
40-
scaleHandler scaling.ScaleHandler
4139
watchedNamespace string
4240
ctx context.Context
4341

@@ -52,10 +50,9 @@ var (
5250
)
5351

5452
// NewProvider returns an instance of KedaProvider
55-
func NewProvider(ctx context.Context, adapterLogger logr.Logger, scaleHandler scaling.ScaleHandler, client client.Client, grpcClient metricsservice.GrpcClient, useMetricsServiceGrpc bool, watchedNamespace string) provider.ExternalMetricsProvider {
53+
func NewProvider(ctx context.Context, adapterLogger logr.Logger, client client.Client, grpcClient metricsservice.GrpcClient, useMetricsServiceGrpc bool, watchedNamespace string) provider.ExternalMetricsProvider {
5654
provider := &KedaProvider{
5755
client: client,
58-
scaleHandler: scaleHandler,
5956
watchedNamespace: watchedNamespace,
6057
ctx: ctx,
6158
grpcClient: grpcClient,

pkg/scalers/authentication/authentication_types.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,15 @@ import "time"
66
type Type string
77

88
const (
9-
// APIKeyAuthType is a auth type using an API key
9+
// APIKeyAuthType is an auth type using an API key
1010
APIKeyAuthType Type = "apiKey"
11-
// BasicAuthType is a auth type using basic auth
11+
// BasicAuthType is an auth type using basic auth
1212
BasicAuthType Type = "basic"
13-
// TLSAuthType is a auth type using TLS
13+
// TLSAuthType is an auth type using TLS
1414
TLSAuthType Type = "tls"
15-
// BearerAuthType is a auth type using a bearer token
15+
// BearerAuthType is an auth type using a bearer token
1616
BearerAuthType Type = "bearer"
17-
// CustomAuthType is a auth type using a custom header
17+
// CustomAuthType is an auth type using a custom header
1818
CustomAuthType Type = "custom"
1919
)
2020

pkg/scalers/github_runner_scaler.go

+23-17
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ func (s *githubRunnerScaler) getRepositories(ctx context.Context) ([]string, err
479479
default:
480480
return nil, fmt.Errorf("runnerScope %s not supported", s.metadata.runnerScope)
481481
}
482-
body, err := getGithubRequest(ctx, url, s.metadata, s.httpClient)
482+
body, _, err := getGithubRequest(ctx, url, s.metadata, s.httpClient)
483483
if err != nil {
484484
return nil, err
485485
}
@@ -498,10 +498,10 @@ func (s *githubRunnerScaler) getRepositories(ctx context.Context) ([]string, err
498498
return repoList, nil
499499
}
500500

501-
func getGithubRequest(ctx context.Context, url string, metadata *githubRunnerMetadata, httpClient *http.Client) ([]byte, error) {
501+
func getGithubRequest(ctx context.Context, url string, metadata *githubRunnerMetadata, httpClient *http.Client) ([]byte, int, error) {
502502
req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
503503
if err != nil {
504-
return []byte{}, err
504+
return []byte{}, -1, err
505505
}
506506

507507
req.Header.Set("Accept", "application/vnd.github.v3+json")
@@ -513,27 +513,29 @@ func getGithubRequest(ctx context.Context, url string, metadata *githubRunnerMet
513513

514514
r, err := httpClient.Do(req)
515515
if err != nil {
516-
return []byte{}, err
516+
return []byte{}, -1, err
517517
}
518518

519519
b, err := io.ReadAll(r.Body)
520520
if err != nil {
521-
return []byte{}, err
521+
return []byte{}, -1, err
522522
}
523523
_ = r.Body.Close()
524524

525-
if r.StatusCode != 200 || r.Header.Get("X-RateLimit-Remaining") == "" {
526-
return []byte{}, fmt.Errorf("the GitHub REST API returned error. url: %s status: %d response: %s", url, r.StatusCode, string(b))
527-
}
525+
if r.StatusCode != 200 {
526+
if r.Header.Get("X-RateLimit-Remaining") != "" {
527+
githubAPIRemaining, _ := strconv.Atoi(r.Header.Get("X-RateLimit-Remaining"))
528528

529-
githubAPIRemaining, _ := strconv.Atoi(r.Header.Get("X-RateLimit-Remaining"))
529+
if githubAPIRemaining == 0 {
530+
resetTime, _ := strconv.ParseInt(r.Header.Get("X-RateLimit-Reset"), 10, 64)
531+
return []byte{}, r.StatusCode, fmt.Errorf("GitHub API rate limit exceeded, resets at %s", time.Unix(resetTime, 0))
532+
}
533+
}
530534

531-
if githubAPIRemaining == 0 {
532-
resetTime, _ := strconv.ParseInt(r.Header.Get("X-RateLimit-Reset"), 10, 64)
533-
return []byte{}, fmt.Errorf("GitHub API rate limit exceeded, resets at %s", time.Unix(resetTime, 0))
535+
return []byte{}, r.StatusCode, fmt.Errorf("the GitHub REST API returned error. url: %s status: %d response: %s", url, r.StatusCode, string(b))
534536
}
535537

536-
return b, nil
538+
return b, r.StatusCode, nil
537539
}
538540

539541
func stripDeadRuns(allWfrs []WorkflowRuns) []WorkflowRun {
@@ -551,7 +553,7 @@ func stripDeadRuns(allWfrs []WorkflowRuns) []WorkflowRun {
551553
// getWorkflowRunJobs returns a list of jobs for a given workflow run
552554
func (s *githubRunnerScaler) getWorkflowRunJobs(ctx context.Context, workflowRunID int64, repoName string) ([]Job, error) {
553555
url := fmt.Sprintf("%s/repos/%s/%s/actions/runs/%d/jobs", s.metadata.githubAPIURL, s.metadata.owner, repoName, workflowRunID)
554-
body, err := getGithubRequest(ctx, url, s.metadata, s.httpClient)
556+
body, _, err := getGithubRequest(ctx, url, s.metadata, s.httpClient)
555557
if err != nil {
556558
return nil, err
557559
}
@@ -568,8 +570,10 @@ func (s *githubRunnerScaler) getWorkflowRunJobs(ctx context.Context, workflowRun
568570
// getWorkflowRuns returns a list of workflow runs for a given repository
569571
func (s *githubRunnerScaler) getWorkflowRuns(ctx context.Context, repoName string) (*WorkflowRuns, error) {
570572
url := fmt.Sprintf("%s/repos/%s/%s/actions/runs", s.metadata.githubAPIURL, s.metadata.owner, repoName)
571-
body, err := getGithubRequest(ctx, url, s.metadata, s.httpClient)
572-
if err != nil {
573+
body, statusCode, err := getGithubRequest(ctx, url, s.metadata, s.httpClient)
574+
if err != nil && statusCode == 404 {
575+
return nil, nil
576+
} else if err != nil {
573577
return nil, err
574578
}
575579

@@ -618,7 +622,9 @@ func (s *githubRunnerScaler) GetWorkflowQueueLength(ctx context.Context) (int64,
618622
if err != nil {
619623
return -1, err
620624
}
621-
allWfrs = append(allWfrs, *wfrs)
625+
if wfrs != nil {
626+
allWfrs = append(allWfrs, *wfrs)
627+
}
622628
}
623629

624630
var queueCount int64

0 commit comments

Comments
 (0)