Skip to content

Commit

Permalink
add flag and several fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
skonto committed Jul 5, 2023
1 parent d8847d3 commit 82f917f
Show file tree
Hide file tree
Showing 9 changed files with 97 additions and 85 deletions.
15 changes: 9 additions & 6 deletions config/core/configmaps/deployment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ metadata:
app.kubernetes.io/component: controller
app.kubernetes.io/version: devel
annotations:
knative.dev/example-checksum: "dffb11e5"
knative.dev/example-checksum: "ed77183a"
data:
# This is the Go import path for the binary that is containerized
# and substituted here.
Expand Down Expand Up @@ -57,23 +57,26 @@ data:
queue-sidecar-cpu-request: "25m"
# Sets the queue proxy's CPU limit.
# If omitted, a default value (currently "1000m"), is used.
# If omitted, a default value (currently "1000m"), is used when
# `queueproxy.resource-defaults` is set to `Enabled`.
queue-sidecar-cpu-limit: "1000m"
# Sets the queue proxy's memory request.
# If omitted, a default value (currently "400Mi"), is used.
# If omitted, a default value (currently "400Mi"), is used when
# `queueproxy.resource-defaults` is set to `Enabled`.
queue-sidecar-memory-request: "400Mi"
# Sets the queue proxy's memory limit.
# If omitted, a default value (currently "800Mi"), is used.
# If omitted, a default value (currently "800Mi"), is used when
# `queueproxy.resource-defaults` is set to `Enabled`.
queue-sidecar-memory-limit: "800Mi"
# Sets the queue proxy's ephemeral storage request.
# If omitted, a default value (currently "512Mi"), is used.
# If omitted, no value is specified and the system default is used.
queue-sidecar-ephemeral-storage-request: "512Mi"
# Sets the queue proxy's ephemeral storage limit.
# If omitted, a default value (currently "1024Mi"), is used.
# If omitted, no value is specified and the system default is used.
queue-sidecar-ephemeral-storage-limit: "1024Mi"
# Sets tokens associated with specific audiences for queue proxy - used by QPOptions
Expand Down
5 changes: 4 additions & 1 deletion config/core/configmaps/features.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ metadata:
app.kubernetes.io/component: controller
app.kubernetes.io/version: devel
annotations:
knative.dev/example-checksum: "d3565159"
knative.dev/example-checksum: "eb70e734"
data:
_example: |-
################################
Expand Down Expand Up @@ -201,3 +201,6 @@ data:
#
# NOTE THAT THIS IS AN EXPERIMENTAL / ALPHA FEATURE
queueproxy.mount-podinfo: "disabled"
# Default queue proxy resource requests and limits to good values for most cases if set.
queueproxy.resource-defaults: "disabled"
3 changes: 3 additions & 0 deletions pkg/apis/config/features.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ func defaultFeaturesConfig() *Features {
PodSpecPersistentVolumeClaim: Disabled,
PodSpecPersistentVolumeWrite: Disabled,
QueueProxyMountPodInfo: Disabled,
QueueProxyResourceDefaults: Disabled,
PodSpecInitContainers: Disabled,
PodSpecDNSPolicy: Disabled,
PodSpecDNSConfig: Disabled,
Expand Down Expand Up @@ -102,6 +103,7 @@ func NewFeaturesConfigFromMap(data map[string]string) (*Features, error) {
asFlag("kubernetes.podspec-dnsconfig", &nc.PodSpecDNSConfig),
asFlag("secure-pod-defaults", &nc.SecurePodDefaults),
asFlag("tag-header-based-routing", &nc.TagHeaderBasedRouting),
asFlag("queueproxy.resource-defaults", &nc.QueueProxyResourceDefaults),
asFlag("queueproxy.mount-podinfo", &nc.QueueProxyMountPodInfo),
asFlag("autodetect-http2", &nc.AutoDetectHTTP2)); err != nil {
return nil, err
Expand Down Expand Up @@ -134,6 +136,7 @@ type Features struct {
PodSpecPersistentVolumeClaim Flag
PodSpecPersistentVolumeWrite Flag
QueueProxyMountPodInfo Flag
QueueProxyResourceDefaults Flag
PodSpecDNSPolicy Flag
PodSpecDNSConfig Flag
SecurePodDefaults Flag
Expand Down
2 changes: 2 additions & 0 deletions pkg/apis/config/features_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ func TestFeaturesConfiguration(t *testing.T) {
PodSpecDNSPolicy: Enabled,
PodSpecDNSConfig: Enabled,
SecurePodDefaults: Enabled,
QueueProxyResourceDefaults: Enabled,
TagHeaderBasedRouting: Enabled,
}),
data: map[string]string{
Expand All @@ -90,6 +91,7 @@ func TestFeaturesConfiguration(t *testing.T) {
"kubernetes.podspec-dnspolicy": "Enabled",
"kubernetes.podspec-dnsconfig": "Enabled",
"secure-pod-defaults": "Enabled",
"queueproxy.resource-defaults": "Enabled",
"tag-header-based-routing": "Enabled",
},
}, {
Expand Down
13 changes: 4 additions & 9 deletions pkg/deployment/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,15 +99,10 @@ var (

func defaultConfig() *Config {
cfg := &Config{
ProgressDeadline: ProgressDeadlineDefault,
DigestResolutionTimeout: digestResolutionTimeoutDefault,
RegistriesSkippingTagResolving: sets.NewString("kind.local", "ko.local", "dev.local"),
QueueSidecarCPURequest: &QueueSidecarCPURequestDefault,
QueueSidecarCPULimit: &QueueSidecarCPULimitDefault,
QueueSidecarMemoryRequest: &QueueSidecarMemoryRequestDefault,
QueueSidecarMemoryLimit: &QueueSidecarMemoryLimitDefault,
QueueSidecarEphemeralStorageRequest: &QueueSidecarEphemeralStorageRequestDefault,
QueueSidecarEphemeralStorageLimit: &QueueSidecarEphemeralStorageLimitDefault,
ProgressDeadline: ProgressDeadlineDefault,
DigestResolutionTimeout: digestResolutionTimeoutDefault,
RegistriesSkippingTagResolving: sets.NewString("kind.local", "ko.local", "dev.local"),
QueueSidecarCPURequest: &QueueSidecarCPURequestDefault,
}
// The following code is needed for ConfigMap testing.
// defaultConfig must match the example in deployment.yaml which includes: `queue-sidecar-token-audiences: ""`
Expand Down
74 changes: 30 additions & 44 deletions pkg/deployment/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,12 @@ func TestControllerConfigurationFromFile(t *testing.T) {
// We require QSI to be explicitly set. So do it here.
want.QueueSidecarImage = "ko://knative.dev/serving/cmd/queue"

// The following are in the example yaml, to show usage,
// but default is nil, i.e. inheriting k8s.
// So for this test we ignore those, but verify the other fields.
got.QueueSidecarCPULimit = nil
got.QueueSidecarMemoryRequest, got.QueueSidecarMemoryLimit = nil, nil
got.QueueSidecarEphemeralStorageRequest, got.QueueSidecarEphemeralStorageLimit = nil, nil
if !cmp.Equal(got, want) {
t.Error("Example stanza does not match default, diff(-want,+got):", cmp.Diff(want, got))
}
Expand All @@ -77,17 +83,12 @@ func TestControllerConfiguration(t *testing.T) {
}{{
name: "controller configuration with bad registries",
wantConfig: &Config{
RegistriesSkippingTagResolving: sets.NewString("ko.local", ""),
DigestResolutionTimeout: digestResolutionTimeoutDefault,
QueueSidecarImage: defaultSidecarImage,
QueueSidecarCPURequest: &QueueSidecarCPURequestDefault,
QueueSidecarCPULimit: &QueueSidecarCPULimitDefault,
QueueSidecarMemoryRequest: &QueueSidecarMemoryRequestDefault,
QueueSidecarMemoryLimit: &QueueSidecarMemoryLimitDefault,
QueueSidecarEphemeralStorageRequest: &QueueSidecarEphemeralStorageRequestDefault,
QueueSidecarEphemeralStorageLimit: &QueueSidecarEphemeralStorageLimitDefault,
QueueSidecarTokenAudiences: sets.NewString("foo", "bar", "boo-srv"),
ProgressDeadline: ProgressDeadlineDefault,
RegistriesSkippingTagResolving: sets.NewString("ko.local", ""),
DigestResolutionTimeout: digestResolutionTimeoutDefault,
QueueSidecarImage: defaultSidecarImage,
QueueSidecarCPURequest: &QueueSidecarCPURequestDefault,
QueueSidecarTokenAudiences: sets.NewString("foo", "bar", "boo-srv"),
ProgressDeadline: ProgressDeadlineDefault,
},
data: map[string]string{
QueueSidecarImageKey: defaultSidecarImage,
Expand All @@ -97,17 +98,12 @@ func TestControllerConfiguration(t *testing.T) {
}, {
name: "controller configuration good progress deadline",
wantConfig: &Config{
RegistriesSkippingTagResolving: sets.NewString("kind.local", "ko.local", "dev.local"),
DigestResolutionTimeout: digestResolutionTimeoutDefault,
QueueSidecarImage: defaultSidecarImage,
QueueSidecarCPURequest: &QueueSidecarCPURequestDefault,
QueueSidecarCPULimit: &QueueSidecarCPULimitDefault,
QueueSidecarMemoryRequest: &QueueSidecarMemoryRequestDefault,
QueueSidecarMemoryLimit: &QueueSidecarMemoryLimitDefault,
QueueSidecarEphemeralStorageRequest: &QueueSidecarEphemeralStorageRequestDefault,
QueueSidecarEphemeralStorageLimit: &QueueSidecarEphemeralStorageLimitDefault,
QueueSidecarTokenAudiences: sets.NewString(""),
ProgressDeadline: 444 * time.Second,
RegistriesSkippingTagResolving: sets.NewString("kind.local", "ko.local", "dev.local"),
DigestResolutionTimeout: digestResolutionTimeoutDefault,
QueueSidecarImage: defaultSidecarImage,
QueueSidecarCPURequest: &QueueSidecarCPURequestDefault,
QueueSidecarTokenAudiences: sets.NewString(""),
ProgressDeadline: 444 * time.Second,
},
data: map[string]string{
QueueSidecarImageKey: defaultSidecarImage,
Expand All @@ -116,17 +112,12 @@ func TestControllerConfiguration(t *testing.T) {
}, {
name: "controller configuration good digest resolution timeout",
wantConfig: &Config{
RegistriesSkippingTagResolving: sets.NewString("kind.local", "ko.local", "dev.local"),
DigestResolutionTimeout: 60 * time.Second,
QueueSidecarImage: defaultSidecarImage,
QueueSidecarCPURequest: &QueueSidecarCPURequestDefault,
QueueSidecarCPULimit: &QueueSidecarCPULimitDefault,
QueueSidecarMemoryRequest: &QueueSidecarMemoryRequestDefault,
QueueSidecarMemoryLimit: &QueueSidecarMemoryLimitDefault,
QueueSidecarEphemeralStorageRequest: &QueueSidecarEphemeralStorageRequestDefault,
QueueSidecarEphemeralStorageLimit: &QueueSidecarEphemeralStorageLimitDefault,
QueueSidecarTokenAudiences: sets.NewString(""),
ProgressDeadline: ProgressDeadlineDefault,
RegistriesSkippingTagResolving: sets.NewString("kind.local", "ko.local", "dev.local"),
DigestResolutionTimeout: 60 * time.Second,
QueueSidecarImage: defaultSidecarImage,
QueueSidecarCPURequest: &QueueSidecarCPURequestDefault,
QueueSidecarTokenAudiences: sets.NewString(""),
ProgressDeadline: ProgressDeadlineDefault,
},
data: map[string]string{
QueueSidecarImageKey: defaultSidecarImage,
Expand All @@ -135,17 +126,12 @@ func TestControllerConfiguration(t *testing.T) {
}, {
name: "controller configuration with registries",
wantConfig: &Config{
RegistriesSkippingTagResolving: sets.NewString("ko.local", "ko.dev"),
DigestResolutionTimeout: digestResolutionTimeoutDefault,
QueueSidecarImage: defaultSidecarImage,
QueueSidecarCPURequest: &QueueSidecarCPURequestDefault,
QueueSidecarCPULimit: &QueueSidecarCPULimitDefault,
QueueSidecarMemoryRequest: &QueueSidecarMemoryRequestDefault,
QueueSidecarMemoryLimit: &QueueSidecarMemoryLimitDefault,
QueueSidecarEphemeralStorageRequest: &QueueSidecarEphemeralStorageRequestDefault,
QueueSidecarEphemeralStorageLimit: &QueueSidecarEphemeralStorageLimitDefault,
QueueSidecarTokenAudiences: sets.NewString(""),
ProgressDeadline: ProgressDeadlineDefault,
RegistriesSkippingTagResolving: sets.NewString("ko.local", "ko.dev"),
DigestResolutionTimeout: digestResolutionTimeoutDefault,
QueueSidecarImage: defaultSidecarImage,
QueueSidecarCPURequest: &QueueSidecarCPURequestDefault,
QueueSidecarTokenAudiences: sets.NewString(""),
ProgressDeadline: ProgressDeadlineDefault,
},
data: map[string]string{
QueueSidecarImageKey: defaultSidecarImage,
Expand Down
2 changes: 1 addition & 1 deletion pkg/reconciler/revision/resources/deploy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ var (

defaultQueueContainer = &corev1.Container{
Name: QueueContainerName,
Resources: createQueueResources(&deploymentConfig, make(map[string]string), &corev1.Container{}),
Resources: createQueueResources(&deploymentConfig, make(map[string]string), &corev1.Container{}, false),
Ports: append(queueNonServingPorts, queueHTTPPort, queueHTTPSPort),
ReadinessProbe: &corev1.Probe{
ProbeHandler: corev1.ProbeHandler{
Expand Down
33 changes: 22 additions & 11 deletions pkg/reconciler/revision/resources/queue.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,32 +89,42 @@ var (
}
)

func createQueueResources(cfg *deployment.Config, annotations map[string]string, userContainer *corev1.Container) corev1.ResourceRequirements {
func createQueueResources(cfg *deployment.Config, annotations map[string]string, userContainer *corev1.Container, useDefaults bool) corev1.ResourceRequirements {
resourceRequests := corev1.ResourceList{}
resourceLimits := corev1.ResourceList{}

for _, r := range []struct {
Name corev1.ResourceName
Request *resource.Quantity
Limit *resource.Quantity
Name corev1.ResourceName
Request *resource.Quantity
RequestDefault *resource.Quantity
Limit *resource.Quantity
LimitDefault *resource.Quantity
}{{
Name: corev1.ResourceCPU,
Request: cfg.QueueSidecarCPURequest,
Limit: cfg.QueueSidecarCPULimit,
Name: corev1.ResourceCPU,
Request: cfg.QueueSidecarCPURequest,
RequestDefault: &deployment.QueueSidecarCPURequestDefault,
Limit: cfg.QueueSidecarCPULimit,
LimitDefault: &deployment.QueueSidecarCPULimitDefault,
}, {
Name: corev1.ResourceMemory,
Request: cfg.QueueSidecarMemoryRequest,
Limit: cfg.QueueSidecarMemoryLimit,
Name: corev1.ResourceMemory,
Request: cfg.QueueSidecarMemoryRequest,
RequestDefault: &deployment.QueueSidecarMemoryRequestDefault,
Limit: cfg.QueueSidecarMemoryLimit,
LimitDefault: &deployment.QueueSidecarMemoryLimitDefault,
}, {
Name: corev1.ResourceEphemeralStorage,
Request: cfg.QueueSidecarEphemeralStorageRequest,
Limit: cfg.QueueSidecarEphemeralStorageLimit,
}} {
if r.Request != nil {
resourceRequests[r.Name] = *r.Request
} else if useDefaults && r.RequestDefault != nil {
resourceRequests[r.Name] = *r.RequestDefault
}
if r.Limit != nil {
resourceLimits[r.Name] = *r.Limit
} else if useDefaults && r.LimitDefault != nil {
resourceLimits[r.Name] = *r.LimitDefault
}
}

Expand Down Expand Up @@ -288,10 +298,11 @@ func makeQueueContainer(rev *v1.Revision, cfg *config.Config) (*corev1.Container
}
}

useQPResourceDefaults := cfg.Features.QueueProxyResourceDefaults == apicfg.Enabled
c := &corev1.Container{
Name: QueueContainerName,
Image: cfg.Deployment.QueueSidecarImage,
Resources: createQueueResources(cfg.Deployment, rev.GetAnnotations(), container),
Resources: createQueueResources(cfg.Deployment, rev.GetAnnotations(), container, useQPResourceDefaults),
Ports: ports,
StartupProbe: execProbe,
ReadinessProbe: httpProbe,
Expand Down
35 changes: 22 additions & 13 deletions pkg/reconciler/revision/resources/queue_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -312,28 +312,37 @@ func TestMakeQueueContainer(t *testing.T) {
})
}),
}, {
name: "default resource config",
name: "default resource config with feature qp defaults disabled",
rev: revision("bar", "foo",
withContainers(containers)),
dc: deployment.Config{
QueueSidecarCPURequest: &deployment.QueueSidecarCPURequestDefault,
QueueSidecarCPULimit: &deployment.QueueSidecarCPULimitDefault,
QueueSidecarMemoryRequest: &deployment.QueueSidecarMemoryRequestDefault,
QueueSidecarMemoryLimit: &deployment.QueueSidecarMemoryLimitDefault,
QueueSidecarEphemeralStorageRequest: &deployment.QueueSidecarEphemeralStorageRequestDefault,
QueueSidecarEphemeralStorageLimit: &deployment.QueueSidecarEphemeralStorageLimitDefault,
QueueSidecarCPURequest: &deployment.QueueSidecarCPURequestDefault,
},
want: queueContainer(func(c *corev1.Container) {
c.Env = env(map[string]string{})
c.Resources.Requests = corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("25m"),
corev1.ResourceMemory: resource.MustParse("400Mi"),
corev1.ResourceEphemeralStorage: resource.MustParse("512Mi"),
corev1.ResourceCPU: deployment.QueueSidecarCPURequestDefault,
}
}),
}, {
name: "resource config with feature qp defaults enabled",
rev: revision("bar", "foo",
withContainers(containers)),
dc: deployment.Config{
QueueSidecarCPURequest: &deployment.QueueSidecarCPURequestDefault,
},
fc: apicfg.Features{
QueueProxyResourceDefaults: apicfg.Enabled,
},
want: queueContainer(func(c *corev1.Container) {
c.Env = env(map[string]string{})
c.Resources.Requests = corev1.ResourceList{
corev1.ResourceCPU: deployment.QueueSidecarCPURequestDefault,
corev1.ResourceMemory: deployment.QueueSidecarMemoryRequestDefault,
}
c.Resources.Limits = corev1.ResourceList{
corev1.ResourceCPU: resource.MustParse("1000m"),
corev1.ResourceMemory: resource.MustParse("800Mi"),
corev1.ResourceEphemeralStorage: resource.MustParse("1024Mi"),
corev1.ResourceCPU: deployment.QueueSidecarCPULimitDefault,
corev1.ResourceMemory: deployment.QueueSidecarMemoryLimitDefault,
}
}),
}, {
Expand Down

0 comments on commit 82f917f

Please sign in to comment.