diff --git a/docs/reference/buildx_create.md b/docs/reference/buildx_create.md index 28a687989c4..743d95de64e 100644 --- a/docs/reference/buildx_create.md +++ b/docs/reference/buildx_create.md @@ -125,6 +125,10 @@ Passes additional driver-specific options. Details for each driver: - `image=IMAGE` - Sets the container image to be used for running buildkit. - `namespace=NS` - Sets the Kubernetes namespace. Defaults to the current namespace. - `replicas=N` - Sets the number of `Pod` replicas. Defaults to 1. + - `requests.cpu` - Sets the request CPU value specified in units of Kubernetes CPU. Example `requests.cpu=100m`, `requests.cpu=2` + - `requests.memory` - Sets the request memory value specified in bytes or with a valid suffix. Example `requests.memory=500Mi`, `requests.memory=4G` + - `limits.cpu` - Sets the limit CPU value specified in units of Kubernetes CPU. Example `limits.cpu=100m`, `limits.cpu=2` + - `limits.memory` - Sets the limit memory value specified in bytes or with a valid suffix. Example `limits.memory=500Mi`, `limits.memory=4G` - `nodeselector="label1=value1,label2=value2"` - Sets the kv of `Pod` nodeSelector. No Defaults. Example `nodeselector=kubernetes.io/arch=arm64` - `rootless=(true|false)` - Run the container as a non-root user without `securityContext.privileged`. [Using Ubuntu host kernel is recommended](https://github.com/moby/buildkit/blob/master/docs/rootless.md). Defaults to false. - `loadbalance=(sticky|random)` - Load-balancing strategy. If set to "sticky", the pod is chosen using the hash of the context path. Defaults to "sticky" diff --git a/driver/kubernetes/factory.go b/driver/kubernetes/factory.go index de69f374808..bff4212ca03 100644 --- a/driver/kubernetes/factory.go +++ b/driver/kubernetes/factory.go @@ -85,6 +85,14 @@ func (f *factory) New(ctx context.Context, cfg driver.InitConfig) (driver.Driver if err != nil { return nil, err } + case "requests.cpu": + deploymentOpt.RequestsCPU = v + case "requests.memory": + deploymentOpt.RequestsMemory = v + case "limits.cpu": + deploymentOpt.LimitsCPU = v + case "limits.memory": + deploymentOpt.LimitsMemory = v case "rootless": deploymentOpt.Rootless, err = strconv.ParseBool(v) if err != nil { diff --git a/driver/kubernetes/manifest/manifest.go b/driver/kubernetes/manifest/manifest.go index 959669e4e23..eb44a773115 100644 --- a/driver/kubernetes/manifest/manifest.go +++ b/driver/kubernetes/manifest/manifest.go @@ -7,18 +7,23 @@ import ( v1 "github.com/opencontainers/image-spec/specs-go/v1" appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) type DeploymentOpt struct { - Namespace string - Name string - Image string - Replicas int - BuildkitFlags []string - Rootless bool - NodeSelector map[string]string - Platforms []v1.Platform + Namespace string + Name string + Image string + Replicas int + BuildkitFlags []string + Rootless bool + NodeSelector map[string]string + RequestsCPU string + RequestsMemory string + LimitsCPU string + LimitsMemory string + Platforms []v1.Platform } const ( @@ -76,6 +81,10 @@ func NewDeployment(opt *DeploymentOpt) (*appsv1.Deployment, error) { }, }, }, + Resources: corev1.ResourceRequirements{ + Requests: corev1.ResourceList{}, + Limits: corev1.ResourceList{}, + }, }, }, }, @@ -92,6 +101,38 @@ func NewDeployment(opt *DeploymentOpt) (*appsv1.Deployment, error) { d.Spec.Template.Spec.NodeSelector = opt.NodeSelector } + if opt.RequestsCPU != "" { + reqCPU, err := resource.ParseQuantity(opt.RequestsCPU) + if err != nil { + return nil, err + } + d.Spec.Template.Spec.Containers[0].Resources.Requests[corev1.ResourceCPU] = reqCPU + } + + if opt.RequestsMemory != "" { + reqMemory, err := resource.ParseQuantity(opt.RequestsMemory) + if err != nil { + return nil, err + } + d.Spec.Template.Spec.Containers[0].Resources.Requests[corev1.ResourceMemory] = reqMemory + } + + if opt.LimitsCPU != "" { + limCPU, err := resource.ParseQuantity(opt.LimitsCPU) + if err != nil { + return nil, err + } + d.Spec.Template.Spec.Containers[0].Resources.Limits[corev1.ResourceCPU] = limCPU + } + + if opt.LimitsMemory != "" { + limMemory, err := resource.ParseQuantity(opt.LimitsMemory) + if err != nil { + return nil, err + } + d.Spec.Template.Spec.Containers[0].Resources.Limits[corev1.ResourceMemory] = limMemory + } + return d, nil }