diff --git a/.drone.yml b/.drone.yml index 65d7bee27..00267fea9 100644 --- a/.drone.yml +++ b/.drone.yml @@ -34,6 +34,8 @@ pipeline: commands: sh .drone.sh when: event: [ push, tag ] + # resources: + # cpu_limit: "12" publish_server_alpine: image: plugins/docker diff --git a/cncd/pipeline/pipec/pipec b/cncd/pipeline/pipec/pipec index c05e3c543..f516525c4 100755 Binary files a/cncd/pipeline/pipec/pipec and b/cncd/pipeline/pipec/pipec differ diff --git a/cncd/pipeline/pipeline/backend/kubernetes/pod.go b/cncd/pipeline/pipeline/backend/kubernetes/pod.go index f173831f7..2aba5bec8 100644 --- a/cncd/pipeline/pipeline/backend/kubernetes/pod.go +++ b/cncd/pipeline/pipeline/backend/kubernetes/pod.go @@ -54,14 +54,31 @@ func Pod(namespace string, step *backend.Step) *v1.Pod { hostAliases = append(hostAliases, v1.HostAlias{IP: host[1], Hostnames: []string{host[0]}}) } + if step.Resources.CPULimit == "" { + step.Resources.CPULimit = "2" + } + if step.Resources.MemoryLimit == "" { + step.Resources.MemoryLimit = "2G" + } + + memoryLimit := resource.MustParse(step.Resources.MemoryLimit) + CPULimit := resource.MustParse(step.Resources.CPULimit) + + memoryLimitValue, _ := memoryLimit.AsInt64() + CPULimitValue, _ := CPULimit.AsInt64() + loadfactor := 0.5 + + memoryRequest := resource.NewQuantity(int64(float64(memoryLimitValue)*loadfactor), resource.DecimalSI) + CPURequest := resource.NewQuantity(int64(float64(CPULimitValue)*loadfactor), resource.DecimalSI) + resources := v1.ResourceRequirements{ Requests: v1.ResourceList{ - v1.ResourceMemory: resource.MustParse("256Mi"), - v1.ResourceCPU: resource.MustParse("500m"), + v1.ResourceMemory: *memoryRequest, + v1.ResourceCPU: *CPURequest, }, Limits: v1.ResourceList{ - v1.ResourceMemory: resource.MustParse("512Mi"), - v1.ResourceCPU: resource.MustParse("1000m"), + v1.ResourceMemory: memoryLimit, + v1.ResourceCPU: CPULimit, }, } diff --git a/cncd/pipeline/pipeline/backend/types.go b/cncd/pipeline/pipeline/backend/types.go index 1b346ce6f..3a20c4733 100644 --- a/cncd/pipeline/pipeline/backend/types.go +++ b/cncd/pipeline/pipeline/backend/types.go @@ -49,6 +49,7 @@ type ( IpcMode string `json:"ipc_mode,omitempty"` Sysctls map[string]string `json:"sysctls,omitempty"` Ports []string `json:"ports,omitempty"` + Resources Resources `json:"resources,omitempty"` } // Auth defines registry authentication credentials. @@ -86,6 +87,12 @@ type ( Mask bool `json:"mask,omitempty"` } + // Resources defines pod resources limits. + Resources struct { + CPULimit string `json:"cpu_limit"` + MemoryLimit string `json:"mem_limit"` + } + // State defines a container state. State struct { // Container exit code diff --git a/cncd/pipeline/pipeline/frontend/yaml/compiler/convert.go b/cncd/pipeline/pipeline/frontend/yaml/compiler/convert.go index afa3d453e..4a54ff137 100644 --- a/cncd/pipeline/pipeline/frontend/yaml/compiler/convert.go +++ b/cncd/pipeline/pipeline/frontend/yaml/compiler/convert.go @@ -143,6 +143,10 @@ func (c *Compiler) createProcess(name string, container *yaml.Container, section cpuSet = c.reslimit.CPUSet } ports := container.Ports + resources := backend.Resources{ + MemoryLimit: container.Resources.MemoryLimit, + CPULimit: container.Resources.CPULimit, + } return &backend.Step{ Name: name, @@ -178,5 +182,6 @@ func (c *Compiler) createProcess(name string, container *yaml.Container, section NetworkMode: network_mode, IpcMode: ipc_mode, Ports: ports, + Resources: resources, } } diff --git a/cncd/pipeline/pipeline/frontend/yaml/container.go b/cncd/pipeline/pipeline/frontend/yaml/container.go index aeeef7b07..471a5d44b 100644 --- a/cncd/pipeline/pipeline/frontend/yaml/container.go +++ b/cncd/pipeline/pipeline/frontend/yaml/container.go @@ -59,9 +59,16 @@ type ( Constraints Constraints `yaml:"when,omitempty"` Vargs map[string]interface{} `yaml:",inline"` Ports []string `yaml:"ports,omitempty"` + Resources Resources `yaml:"resources,omitempty"` } ) +// Resources defines pod resources limits. +type Resources struct { + CPULimit string `yaml:"cpu_limit,omitempty"` + MemoryLimit string `yaml:"mem_limit,omitempty"` +} + // UnmarshalYAML implements the Unmarshaller interface. func (c *Containers) UnmarshalYAML(unmarshal func(interface{}) error) error { slice := yaml.MapSlice{} diff --git a/cncd/pipeline/pipeline/frontend/yaml/container_test.go b/cncd/pipeline/pipeline/frontend/yaml/container_test.go index e8c1ac137..e83d3af43 100644 --- a/cncd/pipeline/pipeline/frontend/yaml/container_test.go +++ b/cncd/pipeline/pipeline/frontend/yaml/container_test.go @@ -62,6 +62,10 @@ tmpfs: - /var/lib/test when: branch: master +ports: ["5432"] +resources: + mem_limit: 1G + cpu_limit: 1 `) func TestUnmarshalContainer(t *testing.T) { @@ -91,6 +95,8 @@ func TestUnmarshalContainer(t *testing.T) { MemSwapLimit: libcompose.MemStringorInt(1024), MemSwappiness: libcompose.MemStringorInt(1024), Name: "my-build-container", + Ports: []string{"5432"}, + Resources: Resources{MemoryLimit: "1G", CPULimit: "1"}, Networks: libcompose.Networks{ Networks: []*libcompose.Network{ {Name: "some-network"},