Skip to content

Commit fc786fc

Browse files
authored
Merge pull request kubernetes#125552 from liggitt/fix-timeout-wiring
KEP-3221: Fix structured authorization webhook timeout wiring and detection
2 parents b3db54e + c50f68d commit fc786fc

File tree

3 files changed

+21
-1
lines changed

3 files changed

+21
-1
lines changed

pkg/kubeapiserver/authorizer/reload.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@ func (r *reloadableAuthorizerResolver) newForConfig(authzConfig *authzconfig.Aut
128128
if err != nil {
129129
return nil, nil, err
130130
}
131+
if configuredAuthorizer.Webhook.Timeout.Duration != 0 {
132+
clientConfig.Timeout = configuredAuthorizer.Webhook.Timeout.Duration
133+
}
131134
var decisionOnError authorizer.Decision
132135
switch configuredAuthorizer.Webhook.FailurePolicy {
133136
case authzconfig.FailurePolicyNoOpinion:

staging/src/k8s.io/apiserver/plugin/pkg/authorizer/webhook/webhook.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import (
3333
"k8s.io/apimachinery/pkg/runtime"
3434
"k8s.io/apimachinery/pkg/runtime/schema"
3535
"k8s.io/apimachinery/pkg/util/cache"
36+
utilnet "k8s.io/apimachinery/pkg/util/net"
3637
"k8s.io/apimachinery/pkg/util/wait"
3738
"k8s.io/apiserver/pkg/apis/apiserver"
3839
apiservervalidation "k8s.io/apiserver/pkg/apis/apiserver/validation"
@@ -251,7 +252,7 @@ func (w *WebhookAuthorizer) Authorize(ctx context.Context, attr authorizer.Attri
251252
metricsResult = "success"
252253
case ctx.Err() != nil:
253254
metricsResult = "canceled"
254-
case errors.Is(sarErr, context.DeadlineExceeded) || apierrors.IsTimeout(sarErr) || statusCode == http.StatusGatewayTimeout:
255+
case utilnet.IsTimeout(sarErr) || errors.Is(sarErr, context.DeadlineExceeded) || apierrors.IsTimeout(sarErr) || statusCode == http.StatusGatewayTimeout:
255256
metricsResult = "timeout"
256257
default:
257258
metricsResult = "error"

test/integration/auth/authz_config_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,10 @@ users:
177177
}
178178
t.Log("serverTimeout", sar)
179179
time.Sleep(2 * time.Second)
180+
sar.Status.Reason = "no opinion"
181+
if err := json.NewEncoder(w).Encode(sar); err != nil {
182+
t.Error(err)
183+
}
180184
}))
181185
defer serverTimeout.Close()
182186
serverTimeoutKubeconfigName := filepath.Join(dir, "serverTimeout.yaml")
@@ -331,6 +335,13 @@ users:
331335

332336
assertCount(errorName, c.errorCount, &serverErrorCalled)
333337
assertCount(timeoutName, c.timeoutCount, &serverTimeoutCalled)
338+
expectedTimeoutCounts := map[string]int{}
339+
if c.timeoutCount > 0 {
340+
expectedTimeoutCounts[timeoutName] = int(c.timeoutCount)
341+
}
342+
if !reflect.DeepEqual(expectedTimeoutCounts, metrics.whTimeoutTotal) {
343+
t.Fatalf("expected timeouts %#v, got %#v", expectedTimeoutCounts, metrics.whTimeoutTotal)
344+
}
334345
assertCount(denyName, c.denyCount, &serverDenyCalled)
335346
if e, a := c.denyCount, metrics.decisions[authorizerKey{authorizerType: "Webhook", authorizerName: denyName}]["denied"]; e != int32(a) {
336347
t.Fatalf("expected deny webhook denied metrics calls: %d, got %d", e, a)
@@ -770,6 +781,7 @@ type metrics struct {
770781
evalErrors int
771782

772783
whTotal map[string]int
784+
whTimeoutTotal map[string]int
773785
whFailOpenTotal map[string]int
774786
whDurationCount map[string]int
775787
}
@@ -803,6 +815,7 @@ func getMetrics(t *testing.T, client *clientset.Clientset) (*metrics, error) {
803815
var m metrics
804816

805817
m.whTotal = map[string]int{}
818+
m.whTimeoutTotal = map[string]int{}
806819
m.whFailOpenTotal = map[string]int{}
807820
m.whDurationCount = map[string]int{}
808821
m.exclusions = 0
@@ -849,6 +862,9 @@ func getMetrics(t *testing.T, client *clientset.Clientset) (*metrics, error) {
849862
}
850863
t.Log(count)
851864
m.whTotal[matches[1]] += count
865+
if matches[2] == "timeout" {
866+
m.whTimeoutTotal[matches[1]] += count
867+
}
852868
}
853869
if matches := webhookDurationMetric.FindStringSubmatch(line); matches != nil {
854870
t.Log(matches)

0 commit comments

Comments
 (0)