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
This commit is contained in:
Cezary Zawadka 2023-06-29 17:06:01 +02:00 committed by czawadka
parent 9516a25ce4
commit 4e6aa5fb86
2 changed files with 15 additions and 0 deletions

View File

@ -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"])
}
}
}

View File

@ -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 {