Skip to content

Commit

Permalink
Add cpu limit to resource requests and refactor knative service struct
Browse files Browse the repository at this point in the history
  • Loading branch information
deadlycoconuts committed May 23, 2024
1 parent 70da2bc commit 916ed3f
Show file tree
Hide file tree
Showing 11 changed files with 302 additions and 213 deletions.
12 changes: 2 additions & 10 deletions api/turing/cluster/knative_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,7 @@ type KnativeService struct {
TopologySpreadConstraints []corev1.TopologySpreadConstraint `json:"topologySpreadConstraints"`

// Resource properties
QueueProxyResourcePercentage int `json:"queueProxyResourcePercentage"`
UserContainerCPULimitRequestFactor float64 `json:"userContainerLimitCPURequestFactor"`
UserContainerMemoryLimitRequestFactor float64 `json:"userContainerLimitMemoryRequestFactor"`
QueueProxyResourcePercentage int `json:"queueProxyResourcePercentage"`
}

// Creates a new config object compatible with the knative serving API, from
Expand Down Expand Up @@ -131,12 +129,6 @@ func (cfg *KnativeService) buildSvcSpec(
// Revision name
revisionName := getDefaultRevisionName(cfg.Name)

// Build resource requirements for the user container
resourceReqs := cfg.buildResourceReqs(
cfg.UserContainerCPULimitRequestFactor,
cfg.UserContainerMemoryLimitRequestFactor,
)

// Build container spec
var portName string
// If protocol is using GRPC, add "h2c" which is required for grpc knative
Expand All @@ -151,7 +143,7 @@ func (cfg *KnativeService) buildSvcSpec(
ContainerPort: cfg.ContainerPort,
},
},
Resources: resourceReqs,
Resources: cfg.buildResourceReqs(),
VolumeMounts: cfg.VolumeMounts,
Env: cfg.Envs,
}
Expand Down
2 changes: 1 addition & 1 deletion api/turing/cluster/kubernetes_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ func (cfg *KubernetesService) buildStatefulSet(labels map[string]string) *appsv1
Args: cfg.Command,
Ports: cfg.buildContainerPorts(),
Env: cfg.Envs,
Resources: cfg.buildResourceReqs(defaultCPULimitRequestFactor, defaultMemoryLimitRequestFactor),
Resources: cfg.buildResourceReqs(),
VolumeMounts: cfg.VolumeMounts,
LivenessProbe: cfg.buildContainerProbe(livenessProbeType, int(cfg.ProbePort)),
ReadinessProbe: cfg.buildContainerProbe(readinessProbeType, int(cfg.ProbePort)),
Expand Down
19 changes: 9 additions & 10 deletions api/turing/cluster/models.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,10 @@ type BaseService struct {
Image string `json:"image"`

// Resources
CPURequests resource.Quantity `json:"cpu_requests"`
MemoryRequests resource.Quantity `json:"memory_requests"`
CPURequests resource.Quantity `json:"cpu_requests"`
CPULimit *resource.Quantity `json:"cpu_limit"`
MemoryRequests resource.Quantity `json:"memory_requests"`
MemoryLimit *resource.Quantity `json:"memory_limit"`

// Health Checks
ProbePort int32 `json:"probe_port"`
Expand All @@ -62,22 +64,19 @@ type BaseService struct {
InitContainers []Container `json:"init_containers"`
}

func (cfg *BaseService) buildResourceReqs(
UserContainerCPULimitRequestFactor float64,
UserContainerMemoryLimitRequestFactor float64,
) corev1.ResourceRequirements {
func (cfg *BaseService) buildResourceReqs() corev1.ResourceRequirements {
reqs := map[corev1.ResourceName]resource.Quantity{
corev1.ResourceCPU: cfg.CPURequests,
corev1.ResourceMemory: cfg.MemoryRequests,
}

// Set resource limits to request * userContainerCPULimitRequestFactor or UserContainerMemoryLimitRequestFactor
limits := map[corev1.ResourceName]resource.Quantity{}
if UserContainerCPULimitRequestFactor != 0 {
limits[corev1.ResourceCPU] = ComputeResource(cfg.CPURequests, UserContainerCPULimitRequestFactor)
if cfg.CPULimit != nil {
limits[corev1.ResourceCPU] = *cfg.CPULimit
}
if UserContainerMemoryLimitRequestFactor != 0 {
limits[corev1.ResourceMemory] = ComputeResource(cfg.MemoryRequests, UserContainerMemoryLimitRequestFactor)
if cfg.MemoryLimit != nil {
limits[corev1.ResourceMemory] = *cfg.MemoryLimit
}

return corev1.ResourceRequirements{
Expand Down
47 changes: 25 additions & 22 deletions api/turing/cluster/servicebuilder/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,9 @@ func (sb *clusterSvcBuilder) NewRouterService(
Namespace: namespace,
Image: routerVersion.Image,
CPURequests: routerVersion.ResourceRequest.CPURequest,
CPULimit: sb.getCPULimit(routerVersion.ResourceRequest),
MemoryRequests: routerVersion.ResourceRequest.MemoryRequest,
MemoryLimit: sb.getMemoryLimit(routerVersion.ResourceRequest),
LivenessHTTPGetPath: routerLivenessPath,
ReadinessHTTPGetPath: routerReadinessPath,
Envs: envs,
Expand All @@ -148,18 +150,16 @@ func (sb *clusterSvcBuilder) NewRouterService(
VolumeMounts: volumeMounts,
InitContainers: initContainers,
},
IsClusterLocal: false,
ContainerPort: routerPort,
Protocol: routerVersion.Protocol,
MinReplicas: routerVersion.ResourceRequest.MinReplica,
MaxReplicas: routerVersion.ResourceRequest.MaxReplica,
InitialScale: initialScale,
AutoscalingMetric: string(routerVersion.AutoscalingPolicy.Metric),
AutoscalingTarget: routerVersion.AutoscalingPolicy.Target,
TopologySpreadConstraints: topologySpreadConstraints,
QueueProxyResourcePercentage: sb.knativeServiceConfig.QueueProxyResourcePercentage,
UserContainerCPULimitRequestFactor: sb.knativeServiceConfig.UserContainerCPULimitRequestFactor,
UserContainerMemoryLimitRequestFactor: sb.knativeServiceConfig.UserContainerMemoryLimitRequestFactor,
IsClusterLocal: false,
ContainerPort: routerPort,
Protocol: routerVersion.Protocol,
MinReplicas: routerVersion.ResourceRequest.MinReplica,
MaxReplicas: routerVersion.ResourceRequest.MaxReplica,
InitialScale: initialScale,
AutoscalingMetric: string(routerVersion.AutoscalingPolicy.Metric),
AutoscalingTarget: routerVersion.AutoscalingPolicy.Target,
TopologySpreadConstraints: topologySpreadConstraints,
QueueProxyResourcePercentage: sb.knativeServiceConfig.QueueProxyResourcePercentage,
}
return sb.validateKnativeService(svc)
}
Expand Down Expand Up @@ -210,17 +210,20 @@ func (sb *clusterSvcBuilder) buildRouterEnvs(
sentryDSN string,
ver *models.RouterVersion,
) ([]corev1.EnvVar, error) {
envs := sb.getEnvVars(ver.ResourceRequest, nil)

// Add app name, router timeout, jaeger collector
envs := []corev1.EnvVar{
{Name: envAppName, Value: fmt.Sprintf("%s-%d.%s", ver.Router.Name, ver.Version, namespace)},
{Name: envAppEnvironment, Value: environmentType},
{Name: envRouterTimeout, Value: ver.Timeout},
{Name: envJaegerEndpoint, Value: routerDefaults.JaegerCollectorEndpoint},
{Name: envRouterConfigFile, Value: routerConfigMapMountPath + routerConfigFileName},
{Name: envRouterProtocol, Value: string(ver.Protocol)},
{Name: envSentryEnabled, Value: strconv.FormatBool(sentryEnabled)},
{Name: envSentryDSN, Value: sentryDSN},
}
envs = append(envs,
[]corev1.EnvVar{
{Name: envAppName, Value: fmt.Sprintf("%s-%d.%s", ver.Router.Name, ver.Version, namespace)},
{Name: envAppEnvironment, Value: environmentType},
{Name: envRouterTimeout, Value: ver.Timeout},
{Name: envJaegerEndpoint, Value: routerDefaults.JaegerCollectorEndpoint},
{Name: envRouterConfigFile, Value: routerConfigMapMountPath + routerConfigFileName},
{Name: envRouterProtocol, Value: string(ver.Protocol)},
{Name: envSentryEnabled, Value: strconv.FormatBool(sentryEnabled)},
{Name: envSentryDSN, Value: sentryDSN},
}...)

// Add enricher / ensembler related env vars, if enabled
if ver.Enricher != nil {
Expand Down
Loading

0 comments on commit 916ed3f

Please sign in to comment.