Merge pull request #8692 from Mordred/feat/scheduler-k3s-compression

Enable compression middleware for traefik when using scheduler-k3s
This commit is contained in:
Jose Diaz-Gonzalez
2026-05-27 14:49:14 -04:00
committed by GitHub
7 changed files with 164 additions and 17 deletions

View File

@@ -124,6 +124,32 @@ func findDocByName(t *testing.T, docs []map[string]interface{}, name string) map
return nil
}
func middlewareNames(t *testing.T, route map[string]interface{}) []string {
t.Helper()
middlewares, ok := route["middlewares"].([]interface{})
if !ok {
t.Fatalf("expected route to contain middlewares, got %#v", route["middlewares"])
}
names := make([]string, 0, len(middlewares))
for i, middleware := range middlewares {
middlewareMap, ok := middleware.(map[string]interface{})
if !ok {
t.Fatalf("expected middleware %d to be an object, got %#v", i, middleware)
}
name, ok := middlewareMap["name"].(string)
if !ok {
t.Fatalf("expected middleware %d to contain string name, got %#v", i, middlewareMap["name"])
}
names = append(names, name)
}
return names
}
func TestIngressRouteTemplateTLSCreatesSeparateHTTPAndHTTPSRoutes(t *testing.T) {
docs := renderIngressRouteTemplate(t, testIngressRouteValues(true))
if len(docs) != 2 {
@@ -137,8 +163,8 @@ func TestIngressRouteTemplateTLSCreatesSeparateHTTPAndHTTPSRoutes(t *testing.T)
}
httpRoutes := httpSpec["routes"].([]interface{})
httpRoute0 := httpRoutes[0].(map[string]interface{})
if _, ok := httpRoute0["middlewares"]; !ok {
t.Fatalf("expected HTTP route to contain redirect middleware, got %#v", httpRoute0)
if got := middlewareNames(t, httpRoute0); strings.Join(got, ",") != "myapp-web-compression,myapp-web-redirect-to-https" {
t.Fatalf("expected HTTP route middlewares [myapp-web-compression myapp-web-redirect-to-https], got %#v", got)
}
if _, ok := httpSpec["tls"]; ok {
t.Fatalf("expected HTTP route to omit tls block, got %#v", httpSpec["tls"])
@@ -151,8 +177,8 @@ func TestIngressRouteTemplateTLSCreatesSeparateHTTPAndHTTPSRoutes(t *testing.T)
}
httpsRoutes := httpsSpec["routes"].([]interface{})
httpsRoute0 := httpsRoutes[0].(map[string]interface{})
if _, ok := httpsRoute0["middlewares"]; ok {
t.Fatalf("expected HTTPS route to omit redirect middleware, got %#v", httpsRoute0["middlewares"])
if got := middlewareNames(t, httpsRoute0); strings.Join(got, ",") != "myapp-web-compression" {
t.Fatalf("expected HTTPS route middlewares [myapp-web-compression], got %#v", got)
}
tls, ok := httpsSpec["tls"].(map[string]interface{})
if !ok {
@@ -176,8 +202,8 @@ func TestIngressRouteTemplateWithoutTLSKeepsSingleHTTPRoute(t *testing.T) {
}
httpRoutes := httpSpec["routes"].([]interface{})
httpRoute0 := httpRoutes[0].(map[string]interface{})
if _, ok := httpRoute0["middlewares"]; ok {
t.Fatalf("expected non-TLS route to omit redirect middleware, got %#v", httpRoute0["middlewares"])
if got := middlewareNames(t, httpRoute0); strings.Join(got, ",") != "myapp-web-compression" {
t.Fatalf("expected non-TLS route middlewares [myapp-web-compression], got %#v", got)
}
if _, ok := httpSpec["tls"]; ok {
t.Fatalf("expected non-TLS route to omit tls block, got %#v", httpSpec["tls"])
@@ -225,8 +251,8 @@ func TestIngressRouteTemplateMultipleDomainsRenderOneRoutePerDomain(t *testing.T
}
for i, r := range httpRoutes {
route := r.(map[string]interface{})
if _, ok := route["middlewares"]; !ok {
t.Fatalf("expected HTTP route entry %d to contain redirect middleware, got %#v", i, route)
if got := middlewareNames(t, route); strings.Join(got, ",") != "myapp-web-compression,myapp-web-redirect-to-https" {
t.Fatalf("expected HTTP route entry %d middlewares [myapp-web-compression myapp-web-redirect-to-https], got %#v", i, got)
}
}
if got := httpRoutes[0].(map[string]interface{})["match"]; got != "Host(`app.example.com`)" {
@@ -243,8 +269,8 @@ func TestIngressRouteTemplateMultipleDomainsRenderOneRoutePerDomain(t *testing.T
}
for i, r := range httpsRoutes {
route := r.(map[string]interface{})
if _, ok := route["middlewares"]; ok {
t.Fatalf("expected HTTPS route entry %d to omit redirect middleware, got %#v", i, route)
if got := middlewareNames(t, route); strings.Join(got, ",") != "myapp-web-compression" {
t.Fatalf("expected HTTPS route entry %d middlewares [myapp-web-compression], got %#v", i, got)
}
}
if got := httpsRoutes[0].(map[string]interface{})["match"]; got != "Host(`app.example.com`)" {

View File

@@ -0,0 +1,27 @@
{{- range $processName, $config := .Values.processes }}
{{- if not (hasKey $config "web") }}
# Skip {{ $processName }} as it doesn't have a web section
{{- continue }}
{{- end }}
{{- if and $config.web.domains (eq $.Values.global.network.ingress_class "traefik") }}
---
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
annotations:
dokku.com/managed: "true"
{{ include "print.annotations" (dict "config" $.Values.global "key" "traefik_middleware") | indent 4 }}
{{ include "print.annotations" (dict "config" $config "key" "traefik_middleware") | indent 4 }}
labels:
app.kubernetes.io/instance: {{ $.Values.global.app_name }}-{{ $processName }}-compression
app.kubernetes.io/name: {{ $processName }}
app.kubernetes.io/part-of: {{ $.Values.global.app_name }}
{{ include "print.labels" (dict "config" $.Values.global "key" "traefik_middleware") | indent 4 }}
{{ include "print.labels" (dict "config" $config "key" "traefik_middleware") | indent 4 }}
name: {{ $.Values.global.app_name}}-{{ $processName }}-compression
namespace: {{ $.Values.global.namespace }}
spec:
compress: {}
{{- end }}
{{- end }}

View File

@@ -40,11 +40,13 @@ spec:
{{- range $ddx, $domain := $config.web.domains }}
- kind: Rule
match: Host(`{{ $domain.name }}`)
{{- if and (eq $entryPoint "web") $config.web.tls.enabled }}
middlewares:
- name: {{ $.Values.global.app_name}}-{{ $processName }}-compression
namespace: {{ $.Values.global.namespace }}
{{- if and (eq $entryPoint "web") $config.web.tls.enabled }}
- name: {{ $.Values.global.app_name}}-{{ $processName }}-redirect-to-https
namespace: {{ $.Values.global.namespace }}
{{- end }}
{{- end }}
services:
- name: {{ $.Values.global.app_name }}-{{ $processName }}
namespace: {{ $.Values.global.namespace }}

View File

@@ -762,7 +762,7 @@ func TriggerSchedulerDeploy(scheduler string, appName string, imageTag string) e
templateFiles := []string{"deployment", "keda-scaled-object"}
if processType == "web" {
templateFiles = append(templateFiles, "service", "certificate", "ingress", "ingress-route", "https-redirect-middleware", "keda-http-scaled-object", "keda-interceptor-proxy-service")
templateFiles = append(templateFiles, "service", "certificate", "ingress", "ingress-route", "compression-middleware", "https-redirect-middleware", "keda-http-scaled-object", "keda-interceptor-proxy-service")
}
for _, templateName := range templateFiles {
b, err := templates.ReadFile(fmt.Sprintf("templates/chart/%s.yaml", templateName))