-
Notifications
You must be signed in to change notification settings - Fork 349
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Allow redis shards discovery without full-fledged k8s dataclient #2476
Comments
Skipper also supports pulling endpoints via HTTP (e.g. from routesrv) #2242 Users may also deploy routesrv and only use redis endpoints API but that adds another moving part. |
`routesrv` may be configured to produce no routes, e.g. to only serve Redis endpoints: ```go opts := cfg.ToOptions() // ignore all Ingresses and RouteGroups opts.KubernetesIngressLabelSelectors = map[string]string{"ignore": "all"} opts.KubernetesRouteGroupsLabelSelectors = map[string]string{"ignore": "all"} // disable auxiliary routes opts.KubernetesHealthcheck = false opts.KubernetesHTTPSRedirect = false if err := routesrv.Run(opts); err != nil { log.Fatal(err) } ``` For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
`routesrv` may be configured to produce no routes, e.g. to only serve Redis endpoints from the namespace without Ingresses/RouteGroups: ```sh bin/routesrv \ -enable-kubernetes-endpointslices \ -kubernetes-namespace=my-redis-ns \ -kubernetes-redis-service-namespace=my-redis-ns \ -kubernetes-redis-service-name=my-redis \ -kubernetes-https-redirect=false \ -kubernetes-healthcheck=false \ ... ``` For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
bin/routesrv \
-enable-kubernetes-endpointslices \
-kubernetes-namespace=my-redis-ns \
-kubernetes-redis-service-namespace=my-redis-ns \
-kubernetes-redis-service-name=my-redis \
-kubernetes-https-redirect=false \
-kubernetes-healthcheck=false \
... |
`routesrv` may be configured to produce no routes, e.g. to only serve Redis endpoints from the namespace without Ingresses/RouteGroups: ```sh bin/routesrv \ -enable-kubernetes-endpointslices \ -kubernetes-namespace=my-redis-ns \ -kubernetes-redis-service-namespace=my-redis-ns \ -kubernetes-redis-service-name=my-redis \ -kubernetes-https-redirect=false \ -kubernetes-healthcheck=false \ ... ``` For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
* change GetEndpointAddresses to return host:port addresses to avoid trimming implicit scheme * use all ports for endpointslices addresses for consistency with endpoints * uses separate cluster state cache for addresses since cache key does not contain port * rename helpers protocol argument to scheme For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
* change GetEndpointAddresses to return host:port addresses to avoid trimming implicit scheme * use all ports for endpointslices addresses for consistency with endpoints * use separate cluster state cache for addresses since cache key does not contain port * rename helpers protocol argument to scheme For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
* change GetEndpointAddresses to return addresses without port * use -kubernetes-redis-service-port to configure redis port * use separate cluster state cache for addresses since cache key does not contain port * rename helpers protocol argument to scheme For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
…es without port * use -kubernetes-redis-service-port flag to configure redis port * use separate cluster state cache for addresses since cache key does not contain port * rename helpers protocol argument to scheme For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
…es without port * use -kubernetes-redis-service-port flag to explicitly configure redis port * use separate cluster state cache for addresses since cache key does not contain port * rename helpers protocol argument to scheme This is a breaking change for users that: * use kubernetes dataclient GetEndpointAddresses method * use dynamic redis shards discovery AND use non-standard redis port AND do not specify -kubernetes-redis-service-port For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
…es without scheme and port * use -kubernetes-redis-service-port flag to explicitly configure redis port * use separate cluster state cache for addresses since cache key does not contain port * rename helpers protocol argument to scheme This is a breaking change for users that: * use kubernetes dataclient GetEndpointAddresses method * use dynamic redis shards discovery AND use non-standard redis port AND do not specify -kubernetes-redis-service-port For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
…es without scheme and port * use -kubernetes-redis-service-port flag to explicitly configure redis port * use separate cluster state cache for addresses since cache key does not contain port * rename helpers protocol argument to scheme This is a breaking change for users that: * use kubernetes dataclient GetEndpointAddresses method * use dynamic redis shards discovery AND use non-standard redis port AND do not specify -kubernetes-redis-service-port For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
…es without scheme and port * use -kubernetes-redis-service-port flag to explicitly configure redis port * use separate cluster state cache for addresses since cache key does not contain port * rename helpers protocol argument to scheme This is a breaking change for users that: * use kubernetes dataclient GetEndpointAddresses method * use dynamic redis shards discovery AND use non-standard redis port AND do not specify -kubernetes-redis-service-port For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
…es without scheme and port (#2917) * use -kubernetes-redis-service-port flag to explicitly configure redis port * use separate cluster state cache for addresses since cache key does not contain port * rename helpers protocol argument to scheme This is a breaking change for users that: * use kubernetes dataclient GetEndpointAddresses method * use dynamic redis shards discovery AND use non-standard redis port AND do not specify -kubernetes-redis-service-port For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Add LoadEndpointAddresses to kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Add LoadEndpointAddresses to kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll to allow discovery of redis shards without fetching full cluster state. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Add LoadEndpointAddresses to kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll to allow discovery of redis shards without fetching full cluster state. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Add LoadEndpointAddresses to kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll to allow discovery of redis shards without fetching full cluster state. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
TestGetEndpointAddresses was broken because it used shared TestAPI instance and did not re-initialize it for each test. In partucular "Ingress with endpointslices" was actually testing endpoints and not endpointslices (testAPI.ServeHTTP does not even serve endpointslices). This change refactors GetEndpointAddresses test using kubernetestest.NewAPI and existing fixture files. For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
TestGetEndpointAddresses was broken because it used shared TestAPI instance and did not re-initialize it for each test. In partucular "Ingress with endpointslices" was actually testing endpoints and not endpointslices (testAPI.ServeHTTP does not even serve endpointslices). This change refactors GetEndpointAddresses test using kubernetestest.NewAPI and existing fixture files. For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
This is useful for testing getting endpoints by service name. For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Add LoadEndpointAddresses to kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll to allow discovery of redis shards without fetching full cluster state. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Add LoadEndpointAddresses to kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll to allow discovery of redis shards without fetching full cluster state. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Add LoadEndpointAddresses to kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll to allow discovery of redis shards without fetching full cluster state. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Add LoadEndpointAddresses to kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll to allow discovery of redis shards without fetching full cluster state. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Add LoadEndpointAddresses to kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll to allow discovery of redis shards without fetching full cluster state. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Add LoadEndpointAddresses to kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll to allow discovery of redis shards without fetching full cluster state. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Add LoadEndpointAddresses to kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll to allow discovery of redis shards without fetching full cluster state. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Add LoadEndpointAddresses to Kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll to allow discovery of Redis shards without fetching full cluster state. When `-kubernetes` flag is not set but `-enable-swarm`, `-kubernetes-redis-service-namespace`, `-kubernetes-redis-service-name` and `-kubernetes-redis-service-port` are provided then Skipper creates Kubernetes dataclient to dicover Redis instances but does not use this dataclient for routing. This allows running Skipper as application (i.e. not as ingress controller) inside Kubernetes cluster using autoscaled Redis for ratelimiting. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Skipper supports Redis based Cluster Ratelimits and dynamic discovery of Redis instances using Kubernetes Service, see https://github.com/zalando/skipper/blob/master/docs/tutorials/ratelimit.md#redis-based-cluster-ratelimits Dynamic discovery relies on Kubernetes Dataclient that also fetches Ingresses and RouteGroups and creates routes from them. This change enables dynamic discovery of Redis instances using Kubernetes without fetching Ingresses and RouteGroups. When `-kubernetes` flag is not set but `-enable-swarm`, `-kubernetes-redis-service-namespace`, `-kubernetes-redis-service-name` and `-kubernetes-redis-service-port` are provided then Skipper creates Kubernetes dataclient to discover Redis instances but does not use this dataclient for routing. The change adds LoadEndpointAddresses to Kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll to allow discovery of Redis shards without fetching full cluster state. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Skipper supports Redis based Cluster Ratelimits and dynamic discovery of Redis instances using Kubernetes Service, see https://github.com/zalando/skipper/blob/master/docs/tutorials/ratelimit.md#redis-based-cluster-ratelimits Dynamic discovery relies on Kubernetes Dataclient that also fetches Ingresses and RouteGroups and creates routes from them. This change enables dynamic discovery of Redis instances using Kubernetes without fetching Ingresses and RouteGroups. When `-kubernetes` flag is not set but `-enable-swarm`, `-kubernetes-redis-service-namespace`, `-kubernetes-redis-service-name` and `-kubernetes-redis-service-port` are provided then Skipper creates Kubernetes dataclient to discover Redis instances but does not use this dataclient for routing. The change adds LoadEndpointAddresses to Kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll to allow discovery of Redis shards without fetching full cluster state. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Skipper supports Redis based Cluster Ratelimits and dynamic discovery of Redis instances using Kubernetes Service, see https://github.com/zalando/skipper/blob/master/docs/tutorials/ratelimit.md#redis-based-cluster-ratelimits Dynamic discovery relies on Kubernetes Dataclient that also fetches Ingresses and RouteGroups and creates routes from them. This change enables dynamic discovery of Redis instances using Kubernetes without fetching Ingresses and RouteGroups. When `-kubernetes` flag is not set but `-enable-swarm`, `-kubernetes-redis-service-namespace`, `-kubernetes-redis-service-name` and `-kubernetes-redis-service-port` are provided then Skipper creates Kubernetes dataclient to discover Redis instances but does not use this dataclient for routing. The change adds LoadEndpointAddresses to Kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll to allow discovery of Redis shards without fetching full cluster state. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Skipper supports Redis based Cluster Ratelimits and dynamic discovery of Redis instances using Kubernetes Service, see https://github.com/zalando/skipper/blob/master/docs/tutorials/ratelimit.md#redis-based-cluster-ratelimits Dynamic discovery relies on Kubernetes Dataclient that also fetches Ingresses and RouteGroups and creates routes from them. This change enables dynamic discovery of Redis instances using Kubernetes without fetching Ingresses and RouteGroups. When `-kubernetes` flag is not set but `-enable-swarm`, `-kubernetes-redis-service-namespace`, `-kubernetes-redis-service-name` and `-kubernetes-redis-service-port` are provided then Skipper creates Kubernetes dataclient to discover Redis instances but does not use this dataclient for routing. The change adds LoadEndpointAddresses to Kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll to allow discovery of Redis shards without fetching full cluster state. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Skipper supports Redis based Cluster Ratelimits and dynamic discovery of Redis instances using Kubernetes Service, see https://github.com/zalando/skipper/blob/master/docs/tutorials/ratelimit.md#redis-based-cluster-ratelimits Dynamic discovery relies on Kubernetes Dataclient that also fetches Ingresses and RouteGroups and creates routes from them. This change enables dynamic discovery of Redis instances using Kubernetes without fetching Ingresses and RouteGroups. When `-kubernetes` flag is not set but `-enable-swarm`, `-kubernetes-redis-service-namespace`, `-kubernetes-redis-service-name` and `-kubernetes-redis-service-port` are provided then Skipper creates Kubernetes dataclient to discover Redis instances but does not use this dataclient for routing. The change adds LoadEndpointAddresses to Kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll to allow discovery of Redis shards without fetching full cluster state. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
…2934) Skipper supports Redis based Cluster Ratelimits and dynamic discovery of Redis instances using Kubernetes Service, see https://github.com/zalando/skipper/blob/master/docs/tutorials/ratelimit.md#redis-based-cluster-ratelimits Dynamic discovery relies on Kubernetes Dataclient that also fetches Ingresses and RouteGroups and creates routes from them. This change enables dynamic discovery of Redis instances using Kubernetes without fetching Ingresses and RouteGroups. When `-kubernetes` flag is not set but `-enable-swarm`, `-kubernetes-redis-service-namespace`, `-kubernetes-redis-service-name` and `-kubernetes-redis-service-port` are provided then Skipper creates Kubernetes dataclient to discover Redis instances but does not use this dataclient for routing. The change adds LoadEndpointAddresses to Kubernetes dataclient that is similar to caching GetEndpointAddresses but does not rely on previous call to Load or LoadAll to allow discovery of Redis shards without fetching full cluster state. Fixes #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Require kubernetes option (explicitly or via -kubernetes flag). Initially routesrv implied this option as it was envisioned for service kubernetes dataclient routes. Later an endpoint to serve Redis endpoints was added by #2237 Within #2476 skipper allows Redis endpoints discovery without using kubernetes dataclient for routing. This behaviour is configured by the -kubernetes flag. The plan is to allow routesrv the same - provide Redis endpoints without using dataclient to create routes. This change is the first step that converts implied Kubernetes option into required. This is a breaking change for users that run rouetsrv without -kubernetes flag or use it from the library without setting Kubernetes option. For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Require kubernetes option (explicitly or via -kubernetes flag). Initially routesrv implied this option as it was envisioned for serving Kubernetes dataclient routes. Later an endpoint to serve Redis endpoints was added by #2237 Within #2476 skipper allows Redis endpoints discovery without using kubernetes dataclient for routing. This behaviour is configured by the -kubernetes flag. The plan is to allow routesrv the same - provide Redis endpoints without using Kubernetes dataclient to create routes. This change is the first step that converts implied Kubernetes option into required. This is a breaking change for users that run routesrv without -kubernetes flag or use it from the library without setting Kubernetes option. For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Require kubernetes option (explicitly or via -kubernetes flag). Initially routesrv implied this option as it was envisioned for serving Kubernetes dataclient routes. Later an endpoint to serve Redis endpoints was added by #2237 Within #2476 skipper allows Redis endpoints discovery without using kubernetes dataclient for routing. This behaviour is configured by the -kubernetes flag. The plan is to allow routesrv the same - provide Redis endpoints without using Kubernetes dataclient to create routes. This change is the first step that converts implied Kubernetes option into required. This is a breaking change for users that run routesrv without -kubernetes flag or use it from the library without setting Kubernetes option. For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Require kubernetes option (explicitly or via -kubernetes flag). Initially routesrv implied this option as it was envisioned for serving Kubernetes dataclient routes. Later an endpoint to serve Redis endpoints was added by #2237 Within #2476 skipper allows Redis endpoints discovery without using kubernetes dataclient for routing. This behaviour is configured by the -kubernetes flag. The plan is to allow routesrv the same - provide Redis endpoints without using Kubernetes dataclient to create routes. This change is the first step that converts implied Kubernetes option into required. This is a breaking change for users that run routesrv without -kubernetes flag or use it from the library without setting Kubernetes option. For #2476 Signed-off-by: Alexander Yastrebov <alexander.yastrebov@zalando.de>
Is your feature request related to a problem? Please describe.
#2009 added dynamic discovery of Redis shards via Kubernetes service endpoints.
This implementation relies on k8s dataclient present as it uses the endpoints data that is updated periodically by routing datasource poll cycle.
This works fine for k8s cluster-ingress type of deployment where Skipper needs k8s dataclient anyway.
It is not great for application type deployment where full k8s dataclient is not needed. Most likely users would need to
hackconfigure k8s dataclient and e.g. use a fake selector (#2045) or ingress/routegroup class (#334, #1456) to not fetch Ingresses and RouteGroups from the cluster.Describe the solution you would like
Skipper supports Redis shards discovery in k8s without fetching other cluster resources.
Ideally k8s dataclient is not registered into the routing to not produce empty/default routes (like https redirect).
Maybe it is possible to use k8s dataclient's cluster client to fetch redis endpoints and not rely on datasource poll cycle.
Describe alternatives you've considered (optional)
A clear and concise description of any alternative solutions or features you've considered.
Additional context (optional)
Add any other context or screenshots about the feature request here.
Would you like to work on it?
Yes
The text was updated successfully, but these errors were encountered: