added --url_base_prefix option (#2018)

Some reverse proxies do not support overriding 'Location' header
in 3xx responses. This commit adds a --url_base_prefix option
that adds a prefix to all URLs of cAdvisor so that
redirects go to the correct places.
This commit is contained in:
Tolga HOSGOR 2018-09-27 09:36:26 +03:00 committed by Hosgor, Tolga (CT RDA DS EU TR MTS)
parent cf21050b59
commit 8018ee104b
3 changed files with 34 additions and 9 deletions

View File

@ -62,6 +62,8 @@ var collectorKey = flag.String("collector_key", "", "Key for the collector's cer
var storeContainerLabels = flag.Bool("store_container_labels", true, "convert container labels and environment variables into labels on prometheus metrics for each container. If flag set to false, then only metrics exported are container name, first alias, and image name")
var urlBasePrefix = flag.String("url_base_prefix", "", "prefix path that will be prepended to all paths to support some reverse proxies")
var (
// Metrics to be ignored.
// Tcp metrics are ignored by default.
@ -156,7 +158,7 @@ func main() {
}
// Register all HTTP handlers.
err = cadvisorhttp.RegisterHandlers(mux, containerManager, *httpAuthFile, *httpAuthRealm, *httpDigestFile, *httpDigestRealm)
err = cadvisorhttp.RegisterHandlers(mux, containerManager, *httpAuthFile, *httpAuthRealm, *httpDigestFile, *httpDigestRealm, *urlBasePrefix)
if err != nil {
klog.Fatalf("Failed to register HTTP handlers: %v", err)
}
@ -177,8 +179,11 @@ func main() {
klog.V(1).Infof("Starting cAdvisor version: %s-%s on port %d", version.Info["version"], version.Info["revision"], *argPort)
rootMux := http.NewServeMux()
rootMux.Handle(*urlBasePrefix+"/", http.StripPrefix(*urlBasePrefix, mux))
addr := fmt.Sprintf("%s:%d", *argIp, *argPort)
klog.Fatal(http.ListenAndServe(addr, mux))
klog.Fatal(http.ListenAndServe(addr, rootMux))
}
func setMaxProcs() {

View File

@ -35,7 +35,7 @@ import (
"k8s.io/klog"
)
func RegisterHandlers(mux httpmux.Mux, containerManager manager.Manager, httpAuthFile, httpAuthRealm, httpDigestFile, httpDigestRealm string) error {
func RegisterHandlers(mux httpmux.Mux, containerManager manager.Manager, httpAuthFile, httpAuthRealm, httpDigestFile, httpDigestRealm string, urlBasePrefix string) error {
// Basic health handler.
if err := healthz.RegisterHandler(mux); err != nil {
return fmt.Errorf("failed to register healthz handler: %s", err)
@ -55,7 +55,7 @@ func RegisterHandlers(mux httpmux.Mux, containerManager manager.Manager, httpAut
}
// Redirect / to containers page.
mux.Handle("/", http.RedirectHandler(pages.ContainersPage, http.StatusTemporaryRedirect))
mux.Handle("/", http.RedirectHandler(urlBasePrefix+pages.ContainersPage, http.StatusTemporaryRedirect))
var authenticated bool
@ -65,7 +65,7 @@ func RegisterHandlers(mux httpmux.Mux, containerManager manager.Manager, httpAut
secrets := auth.HtpasswdFileProvider(httpAuthFile)
authenticator := auth.NewBasicAuthenticator(httpAuthRealm, secrets)
mux.HandleFunc(static.StaticResource, authenticator.Wrap(staticHandler))
if err := pages.RegisterHandlersBasic(mux, containerManager, authenticator); err != nil {
if err := pages.RegisterHandlersBasic(mux, containerManager, authenticator, urlBasePrefix); err != nil {
return fmt.Errorf("failed to register pages auth handlers: %s", err)
}
authenticated = true
@ -75,7 +75,7 @@ func RegisterHandlers(mux httpmux.Mux, containerManager manager.Manager, httpAut
secrets := auth.HtdigestFileProvider(httpDigestFile)
authenticator := auth.NewDigestAuthenticator(httpDigestRealm, secrets)
mux.HandleFunc(static.StaticResource, authenticator.Wrap(staticHandler))
if err := pages.RegisterHandlersDigest(mux, containerManager, authenticator); err != nil {
if err := pages.RegisterHandlersDigest(mux, containerManager, authenticator, urlBasePrefix); err != nil {
return fmt.Errorf("failed to register pages digest handlers: %s", err)
}
authenticated = true
@ -84,7 +84,7 @@ func RegisterHandlers(mux httpmux.Mux, containerManager manager.Manager, httpAut
// Change handler based on authenticator initalization
if !authenticated {
mux.HandleFunc(static.StaticResource, staticHandlerNoAuth)
if err := pages.RegisterHandlersBasic(mux, containerManager, nil); err != nil {
if err := pages.RegisterHandlersBasic(mux, containerManager, nil, urlBasePrefix); err != nil {
return fmt.Errorf("failed to register pages handlers: %s", err)
}
}

View File

@ -100,7 +100,7 @@ func dockerHandler(containerManager manager.Manager) auth.AuthenticatedHandlerFu
}
// Register http handlers
func RegisterHandlersDigest(mux httpmux.Mux, containerManager manager.Manager, authenticator *auth.DigestAuth) error {
func RegisterHandlersDigest(mux httpmux.Mux, containerManager manager.Manager, authenticator *auth.DigestAuth, urlBasePrefix string) error {
// Register the handler for the containers page.
if authenticator != nil {
mux.HandleFunc(ContainersPage, authenticator.Wrap(containerHandler(containerManager)))
@ -109,10 +109,20 @@ func RegisterHandlersDigest(mux httpmux.Mux, containerManager manager.Manager, a
mux.HandleFunc(ContainersPage, containerHandlerNoAuth(containerManager))
mux.HandleFunc(DockerPage, dockerHandlerNoAuth(containerManager))
}
if ContainersPage[len(ContainersPage)-1] == '/' {
redirectHandler := http.RedirectHandler(urlBasePrefix+ContainersPage, http.StatusMovedPermanently)
mux.Handle(ContainersPage[0:len(ContainersPage)-1], redirectHandler)
}
if DockerPage[len(DockerPage)-1] == '/' {
redirectHandler := http.RedirectHandler(urlBasePrefix+DockerPage, http.StatusMovedPermanently)
mux.Handle(DockerPage[0:len(DockerPage)-1], redirectHandler)
}
return nil
}
func RegisterHandlersBasic(mux httpmux.Mux, containerManager manager.Manager, authenticator *auth.BasicAuth) error {
func RegisterHandlersBasic(mux httpmux.Mux, containerManager manager.Manager, authenticator *auth.BasicAuth, urlBasePrefix string) error {
// Register the handler for the containers and docker age.
if authenticator != nil {
mux.HandleFunc(ContainersPage, authenticator.Wrap(containerHandler(containerManager)))
@ -121,6 +131,16 @@ func RegisterHandlersBasic(mux httpmux.Mux, containerManager manager.Manager, au
mux.HandleFunc(ContainersPage, containerHandlerNoAuth(containerManager))
mux.HandleFunc(DockerPage, dockerHandlerNoAuth(containerManager))
}
if ContainersPage[len(ContainersPage)-1] == '/' {
redirectHandler := http.RedirectHandler(urlBasePrefix+ContainersPage, http.StatusMovedPermanently)
mux.Handle(ContainersPage[0:len(ContainersPage)-1], redirectHandler)
}
if DockerPage[len(DockerPage)-1] == '/' {
redirectHandler := http.RedirectHandler(urlBasePrefix+DockerPage, http.StatusMovedPermanently)
mux.Handle(DockerPage[0:len(DockerPage)-1], redirectHandler)
}
return nil
}