This is an automated email from the ASF dual-hosted git repository. mcdan pushed a commit to branch mcdan/ephmeral-scale-factor in repository https://gitbox.apache.org/repos/asf/openwhisk.git
commit 40025c5ce7ead08e136e1de409e956ae0fe7d9aa Author: mcweeney <[email protected]> AuthorDate: Wed Oct 21 14:07:59 2020 -0400 Add ability to scale Ephemeral storage along with memory, similar to CPU. --- core/invoker/src/main/resources/application.conf | 4 ++- .../kubernetes/KubernetesClient.scala | 2 +- .../containerpool/kubernetes/WhiskPodBuilder.scala | 7 +++- .../kubernetes/test/WhiskPodBuilderTests.scala | 41 +++++++++++++++++++++- 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/core/invoker/src/main/resources/application.conf b/core/invoker/src/main/resources/application.conf index a11f454..35c6fc9 100644 --- a/core/invoker/src/main/resources/application.conf +++ b/core/invoker/src/main/resources/application.conf @@ -110,10 +110,12 @@ whisk { #} #if missing, the pod will be created without ephermal disk request/limit - #if specified, the pod will be created with ephemeral-storage request+limit set + #if specified, the pod will be created with ephemeral-storage request+limit set or using the scale factor + #as a multiple of the request memory. If both are set scale-factor takes precedence. #See: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#local-ephemeral-storage #ephemeral-storage { # limit = 2 g + # scale-factor = 2.0 #} #enable PodDisruptionBudget creation for pods? (will include same labels as pods, and specify minAvailable=1 to prevent termination of action pods during maintenance) diff --git a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala index ca96dd4..b44b2c2 100644 --- a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala +++ b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/KubernetesClient.scala @@ -74,7 +74,7 @@ case class KubernetesCpuScalingConfig(millicpus: Int, memory: ByteSize, maxMilli /** * Configuration for kubernetes ephemeral storage limit for the action container */ -case class KubernetesEphemeralStorageConfig(limit: ByteSize) +case class KubernetesEphemeralStorageConfig(limit: ByteSize, scaleFactor: Double) /** * Exception to indicate a pod took too long to become ready. diff --git a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/WhiskPodBuilder.scala b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/WhiskPodBuilder.scala index b5eda4d..98410b5 100644 --- a/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/WhiskPodBuilder.scala +++ b/core/invoker/src/main/scala/org/apache/openwhisk/core/containerpool/kubernetes/WhiskPodBuilder.scala @@ -108,7 +108,12 @@ class WhiskPodBuilder(client: NamespacedKubernetesClient, config: KubernetesClie .getOrElse(Map.empty) val diskLimit = config.ephemeralStorage - .map(diskConfig => Map("ephemeral-storage" -> new Quantity(diskConfig.limit.toMB + "Mi"))) + .map(diskConfig => if (diskConfig.scaleFactor > 0) { + Map("ephemeral-storage" -> new Quantity(diskConfig.scaleFactor * memory.toMB + "Mi")) + } + else { + Map("ephemeral-storage" -> new Quantity(diskConfig.limit.toMB + "Mi")) + }) .getOrElse(Map.empty) //In container its assumed that env, port, resource limits are set explicitly diff --git a/tests/src/test/scala/org/apache/openwhisk/core/containerpool/kubernetes/test/WhiskPodBuilderTests.scala b/tests/src/test/scala/org/apache/openwhisk/core/containerpool/kubernetes/test/WhiskPodBuilderTests.scala index 93bc4b3..0965f17 100644 --- a/tests/src/test/scala/org/apache/openwhisk/core/containerpool/kubernetes/test/WhiskPodBuilderTests.scala +++ b/tests/src/test/scala/org/apache/openwhisk/core/containerpool/kubernetes/test/WhiskPodBuilderTests.scala @@ -133,7 +133,8 @@ class WhiskPodBuilderTests extends FlatSpec with Matchers with KubeClientSupport Some(KubernetesCpuScalingConfig(300, 3.MB, 1000)), false, None, - Some(KubernetesEphemeralStorageConfig(1.GB))) + Some(KubernetesEphemeralStorageConfig(1.GB, 0), + KubernetesTerminationStatusCheckConfig(2.seconds, 20.seconds))) val builder = new WhiskPodBuilder(kubeClient, config) val (pod, _) = builder.buildPodSpec(name, testImage, 2.MB, Map("foo" -> "bar"), Map("fooL" -> "barV"), config) @@ -143,6 +144,44 @@ class WhiskPodBuilderTests extends FlatSpec with Matchers with KubeClientSupport c.getResources.getRequests.asScala.get("ephemeral-storage").map(_.getAmount) shouldBe Some("1024Mi") } } + it should "scale ephemeral storage when scale factor is given" in { + val config = KubernetesClientConfig( + KubernetesClientTimeoutConfig(1.second, 1.second), + KubernetesInvokerNodeAffinity(false, "k", "v"), + KubernetesInvokerPodAntiAffinity(false, ""), + true, + None, + None, + Some(scalingConfig), + false, + None, + Some(KubernetesEphemeralStorageConfig(1.GB, 1.25), + KubernetesTerminationStatusCheckConfig(2.seconds, 20.seconds))) + val builder = new WhiskPodBuilder(kubeClient, config) + + val (pod, _) = builder.buildPodSpec(name, testImage, 2.MB, Map("foo" -> "bar"), Map("fooL" -> "barV"), config) + withClue(Serialization.asYaml(pod)) { + val c = getActionContainer(pod) + c.getResources.getLimits.asScala.get("ephemeral-storage").map(_.getAmount) shouldBe Some("2.5Mi") + c.getResources.getRequests.asScala.get("ephemeral-storage").map(_.getAmount) shouldBe Some("2.5Mi") + } + } + + it should "set pod anti-affinity when configured" in { + val config = KubernetesClientConfig( + KubernetesClientTimeoutConfig(1.second, 1.second), + KubernetesInvokerNodeAffinity(false, "k", "v"), + KubernetesInvokerPodAntiAffinity(true, "topokey"), + true, + None, + None, + Some(scalingConfig), + false, + None, + Some(KubernetesEphemeralStorageConfig(1.GB, 0)), + KubernetesTerminationStatusCheckConfig(2.seconds, 20.seconds)) + val builder = new WhiskPodBuilder(kubeClient, config) +>>>>>>> Stashed changes it should "extend existing pod template" in { val template = """
