From 4e6aa5fb86176e69e3c02cf719df5946fe99c799 Mon Sep 17 00:00:00 2001 From: Cezary Zawadka Date: Thu, 29 Jun 2023 17:06:01 +0200 Subject: [PATCH] kube-proxy service health: add new return header with number of local endpoints - add new header "X-Load-Balancing-Endpoint-Weight" returned from service health. Value of the header is number of local endpoints. Header can be used in weighted load balancing. Parsing header for number of endpoints is faster than unmarshalling json from the content body. - add missing unit test for new and old headers returned from service health --- pkg/proxy/healthcheck/healthcheck_test.go | 12 ++++++++++++ pkg/proxy/healthcheck/service_health.go | 3 +++ 2 files changed, 15 insertions(+) diff --git a/pkg/proxy/healthcheck/healthcheck_test.go b/pkg/proxy/healthcheck/healthcheck_test.go index e4ad27aa59f..6b4a0468711 100644 --- a/pkg/proxy/healthcheck/healthcheck_test.go +++ b/pkg/proxy/healthcheck/healthcheck_test.go @@ -21,13 +21,16 @@ import ( "net" "net/http" "net/http/httptest" + "strconv" "testing" "time" + "github.com/google/go-cmp/cmp" "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/dump" "k8s.io/apimachinery/pkg/util/sets" + proxyutil "k8s.io/kubernetes/pkg/proxy/util" testingclock "k8s.io/utils/clock/testing" ) @@ -412,6 +415,15 @@ func tHandler(hcs *server, nsn types.NamespacedName, status int, endpoints int, if payload.ServiceProxyHealthy != kubeProxyHealthy { t.Errorf("expected %v kubeProxyHealthy, got %v", kubeProxyHealthy, payload.ServiceProxyHealthy) } + if !cmp.Equal(resp.Header()["Content-Type"], []string{"application/json"}) { + t.Errorf("expected 'Content-Type: application/json' respose header, got: %v", resp.Header()["Content-Type"]) + } + if !cmp.Equal(resp.Header()["X-Content-Type-Options"], []string{"nosniff"}) { + t.Errorf("expected 'X-Content-Type-Options: nosniff' respose header, got: %v", resp.Header()["X-Content-Type-Options"]) + } + if !cmp.Equal(resp.Header()["X-Load-Balancing-Endpoint-Weight"], []string{strconv.Itoa(endpoints)}) { + t.Errorf("expected 'X-Load-Balancing-Endpoint-Weight: %d' respose header, got: %v", endpoints, resp.Header()["X-Load-Balancing-Endpoint-Weight"]) + } } } diff --git a/pkg/proxy/healthcheck/service_health.go b/pkg/proxy/healthcheck/service_health.go index edea50de78a..25d48285560 100644 --- a/pkg/proxy/healthcheck/service_health.go +++ b/pkg/proxy/healthcheck/service_health.go @@ -20,6 +20,7 @@ import ( "fmt" "net" "net/http" + "strconv" "strings" "sync" @@ -233,6 +234,8 @@ func (h hcHandler) ServeHTTP(resp http.ResponseWriter, req *http.Request) { resp.Header().Set("Content-Type", "application/json") resp.Header().Set("X-Content-Type-Options", "nosniff") + resp.Header().Set("X-Load-Balancing-Endpoint-Weight", strconv.Itoa(count)) + if count != 0 && kubeProxyHealthy { resp.WriteHeader(http.StatusOK) } else {