Repository: stratos Updated Branches: refs/heads/master c868c7af4 -> 7dc0c9a1f
Introducing parameters to specify cpu and memory allocations for docker containers Project: http://git-wip-us.apache.org/repos/asf/stratos/repo Commit: http://git-wip-us.apache.org/repos/asf/stratos/commit/7dc0c9a1 Tree: http://git-wip-us.apache.org/repos/asf/stratos/tree/7dc0c9a1 Diff: http://git-wip-us.apache.org/repos/asf/stratos/diff/7dc0c9a1 Branch: refs/heads/master Commit: 7dc0c9a1ff230e9e2b3b57072f6eed12e518848a Parents: c868c7a Author: Imesh Gunaratne <[email protected]> Authored: Thu May 21 00:51:43 2015 +0530 Committer: Imesh Gunaratne <[email protected]> Committed: Thu May 21 00:54:51 2015 +0530 ---------------------------------------------------------------------- .../controller/domain/InstanceMetadata.java | 9 ++++++ .../iaases/kubernetes/KubernetesIaas.java | 31 ++++++++++++++++-- .../kubernetes/client/KubernetesApiClient.java | 13 ++++++-- .../KubernetesAPIClientInterface.java | 12 ++++--- .../kubernetes/client/model/Container.java | 33 ++++++++++++++++--- .../client/live/AbstractLiveTest.java | 4 +-- .../live/KubernetesApiClientLiveTest.java | 8 ++--- .../autoscaling-policy-1.json | 6 ++-- samples/cartridges/kubernetes/php.json | 34 +++++++++++++------- 9 files changed, 113 insertions(+), 37 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceMetadata.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceMetadata.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceMetadata.java index 4c0895b..02022af 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceMetadata.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/domain/InstanceMetadata.java @@ -30,6 +30,7 @@ public class InstanceMetadata implements Serializable { private String hostname; private String hypervisor; + private int cpu; private int ram; private String imageId; private int loginPort; @@ -109,4 +110,12 @@ public class InstanceMetadata implements Serializable { public void setOperatingSystem64bit(boolean operatingSystem64bit) { this.operatingSystem64bit = operatingSystem64bit; } + + public void setCpu(int cpu) { + this.cpu = cpu; + } + + public int getCpu() { + return cpu; + } } http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java index b756121..4aa4c4c 100644 --- a/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java +++ b/components/org.apache.stratos.cloud.controller/src/main/java/org/apache/stratos/cloud/controller/iaases/kubernetes/KubernetesIaas.java @@ -62,6 +62,10 @@ public class KubernetesIaas extends Iaas { private static final String PAYLOAD_PARAMETER_NAME_VALUE_SEPARATOR = "="; private static final String PAYLOAD_PARAMETER_PREFIX = "payload_parameter."; private static final String PORT_MAPPINGS = "PORT_MAPPINGS"; + private static final String KUBERNETES_CONTAINER_CPU = "KUBERNETES_CONTAINER_CPU"; + private static final String KUBERNETES_CONTAINER_MEMORY = "KUBERNETES_CONTAINER_MEMORY"; + private static final String KUBERNETES_CONTAINER_CPU_DEFAULT = "kubernetes.container.cpu.default"; + private static final String KUBERNETES_CONTAINER_MEMORY_DEFAULT = "kubernetes.container.memory.default"; private PartitionValidator partitionValidator; private List<NameValuePair> payload; @@ -224,9 +228,11 @@ public class KubernetesIaas extends Iaas { // Update member context updateMemberContext(memberContext, pod, kubernetesCluster); - log.info(String.format("Container started successfully: [application] %s [cartridge] %s [member] %s [pod]", + log.info(String.format("Container started successfully: [application] %s [cartridge] %s [member] %s " + + "[pod] %s [cpu] %d [memory] %d MB", memberContext.getApplicationId(), memberContext.getCartridgeType(), - memberContext.getMemberId(), memberContext.getKubernetesPodId())); + memberContext.getMemberId(), memberContext.getKubernetesPodId(), + memberContext.getInstanceMetadata().getCpu(), memberContext.getInstanceMetadata().getRam())); return memberContext; } catch (Exception e) { String msg = String.format("Could not start container: [application] %s [cartridge] %s [member] %s", @@ -373,6 +379,17 @@ public class KubernetesIaas extends Iaas { throw new RuntimeException(message); } + int cpu = Integer.getInteger(KUBERNETES_CONTAINER_CPU_DEFAULT, 1); + int memory = Integer.getInteger(KUBERNETES_CONTAINER_MEMORY_DEFAULT, 1024); + Property cpuProperty = cartridge.getProperties().getProperty(KUBERNETES_CONTAINER_CPU); + if(cpuProperty != null) { + cpu = Integer.parseInt(cpuProperty.getValue()); + } + Property memoryProperty = cartridge.getProperties().getProperty(KUBERNETES_CONTAINER_MEMORY); + if(memoryProperty != null) { + memory = Integer.parseInt(memoryProperty.getValue()); + } + IaasProvider iaasProvider = CloudControllerContext.getInstance().getIaasProviderOfPartition(cartridge.getType(), partition.getId()); if (iaasProvider == null) { String message = "Could not find iaas provider: [partition] " + partition.getId(); @@ -392,11 +409,19 @@ public class KubernetesIaas extends Iaas { clusterContext, memberContext); List<Port> ports = KubernetesIaasUtil.convertPortMappings(Arrays.asList(cartridge.getPortMappings())); - kubernetesApi.createPod(podId, podLabel, dockerImage, ports, environmentVariables); + kubernetesApi.createPod(podId, podLabel, dockerImage, cpu, memory, ports, environmentVariables); // Add pod id to member context memberContext.setKubernetesPodId(podId); memberContext.setKubernetesPodLabel(podLabel); + + // Create instance metadata + InstanceMetadata instanceMetadata = new InstanceMetadata(); + instanceMetadata.setImageId(dockerImage); + instanceMetadata.setCpu(cpu); + instanceMetadata.setRam(memory); + memberContext.setInstanceMetadata(instanceMetadata); + // Persist cloud controller context CloudControllerContext.getInstance().persist(); http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/KubernetesApiClient.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/KubernetesApiClient.java b/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/KubernetesApiClient.java index aec99eb..99f156f 100644 --- a/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/KubernetesApiClient.java +++ b/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/KubernetesApiClient.java @@ -54,17 +54,22 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface { * @param podId Identifier of the pod * @param podLabel Pod name to be used by the pod label * @param dockerImage Docker image to be used by the pod + * @param cpu Number of cpu cores + * @param memory Memory allocation in megabytes * @param ports Ports exposed by the pod * @param environmentVariables Environment variables to be passed to the pod * @throws KubernetesClientException */ @Override - public void createPod(String podId, String podLabel, String dockerImage, List<Port> ports, + public void createPod(String podId, String podLabel, String dockerImage, int cpu, int memory, List<Port> ports, EnvironmentVariable[] environmentVariables) throws KubernetesClientException { + + int memoryInMB = 1024 * 1024 * memory; if (log.isDebugEnabled()) { - log.debug(String.format("Creating kubernetes pod: [pod-id] %s [pod-name] %s [docker-image] %s [ports] %s", - podId, podLabel, dockerImage, ports)); + log.debug(String.format("Creating kubernetes pod: [pod-id] %s [pod-name] %s [docker-image] %s " + + "[cpu] %d [memory] %d MB [ports] %s", + podId, podLabel, dockerImage, cpu, memoryInMB, ports)); } // Create pod definition @@ -87,6 +92,8 @@ public class KubernetesApiClient implements KubernetesAPIClientInterface { Container containerTemplate = new Container(); containerTemplate.setName(podLabel); containerTemplate.setImage(dockerImage); + containerTemplate.setCpu(cpu); + containerTemplate.setMemory(memoryInMB); containerTemplate.setPorts(ports); containerTemplate.setImagePullPolicy(KubernetesConstants.POLICY_PULL_IF_NOT_PRESENT); if (environmentVariables != null) { http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/interfaces/KubernetesAPIClientInterface.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/interfaces/KubernetesAPIClientInterface.java b/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/interfaces/KubernetesAPIClientInterface.java index 739677e..df9f3de 100644 --- a/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/interfaces/KubernetesAPIClientInterface.java +++ b/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/interfaces/KubernetesAPIClientInterface.java @@ -31,13 +31,15 @@ public interface KubernetesAPIClientInterface { /** * Create pod. * - * @param podId - * @param podLabel - * @param dockerImage - * @param ports + * @param podId id of the pod + * @param podLabel pod label + * @param dockerImage docker image name + * @param cpu number of cpu cores + * @param memory memory allocation in mega bytes + * @param ports ports to be opened * @throws KubernetesClientException */ - public void createPod(String podId, String podLabel, String dockerImage, List<Port> ports, + public void createPod(String podId, String podLabel, String dockerImage, int cpu, int memory, List<Port> ports, EnvironmentVariable[] environmentVariables) throws KubernetesClientException; http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/model/Container.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/model/Container.java b/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/model/Container.java index 45e4bca..fd8d591 100644 --- a/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/model/Container.java +++ b/components/org.apache.stratos.kubernetes.client/src/main/java/org/apache/stratos/kubernetes/client/model/Container.java @@ -30,6 +30,8 @@ public class Container { private String name; private String image; + private int cpu; + private int memory; private String workingDir; private String[] command; private VolumeMount[] volumeMounts; @@ -57,6 +59,23 @@ public class Container { this.image = image; } + + public int getCpu() { + return cpu; + } + + public void setCpu(int cpu) { + this.cpu = cpu; + } + + public int getMemory() { + return memory; + } + + public void setMemory(int memory) { + this.memory = memory; + } + public String getWorkingDir() { return workingDir; } @@ -103,11 +122,15 @@ public class Container { @Override public String toString() { - return "Container [name=" + name + ", image=" + image + ", workingDir=" - + workingDir + ", command=" + Arrays.toString(command) - + ", volumeMounts=" + Arrays.toString(volumeMounts) - + ", ports=" + ports + ", env=" - + Arrays.toString(env) + "]"; + return "Container [name=" + name + + ", image=" + image + + ", cpu=" + cpu + + ", memory=" + memory + + ", workingDir=" + workingDir + + ", command=" + Arrays.toString(command) + + ", volumeMounts=" + Arrays.toString(volumeMounts) + + ", ports=" + ports + + ", env=" + Arrays.toString(env) + "]"; } public String getImagePullPolicy() { http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/AbstractLiveTest.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/AbstractLiveTest.java b/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/AbstractLiveTest.java index faab5ab..0ab978e 100644 --- a/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/AbstractLiveTest.java +++ b/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/AbstractLiveTest.java @@ -123,10 +123,10 @@ public class AbstractLiveTest extends TestCase { log.info("Kubernetes resources cleaned"); } - protected void createPod(String podId, String podName, String containerPortName) throws KubernetesClientException { + protected void createPod(String podId, String podName, String containerPortName, int cpu, int memory) throws KubernetesClientException { log.info("Creating pod: [pod] " + podId); List<Port> ports = createPorts(containerPortName); - client.createPod(podId, podName, dockerImage, ports, null); + client.createPod(podId, podName, dockerImage, cpu, memory, ports, null); podIdList.add(podId); sleep(2000); http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/KubernetesApiClientLiveTest.java ---------------------------------------------------------------------- diff --git a/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/KubernetesApiClientLiveTest.java b/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/KubernetesApiClientLiveTest.java index 5c425aa..7983194 100644 --- a/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/KubernetesApiClientLiveTest.java +++ b/components/org.apache.stratos.kubernetes.client/src/test/java/org/apache/stratos/kubernetes/client/live/KubernetesApiClientLiveTest.java @@ -47,8 +47,8 @@ public class KubernetesApiClientLiveTest extends AbstractLiveTest { public void testPodCreation() throws Exception { log.info("Testing pod creation..."); - createPod("stratos-test-pod-1", "stratos-test-pod", "http-1"); - createPod("stratos-test-pod-2", "stratos-test-pod", "http-1"); + createPod("stratos-test-pod-2", "stratos-test-pod", "http-1", 1, 512); + createPod("stratos-test-pod-2", "stratos-test-pod", "http-1", 2, 512); deletePod("stratos-test-pod-1"); deletePod("stratos-test-pod-2"); @@ -73,8 +73,8 @@ public class KubernetesApiClientLiveTest extends AbstractLiveTest { createService(serviceId, serviceName, SERVICE_PORT, containerPortName, minionPublicIPs); - createPod("stratos-test-pod-1", serviceName, containerPortName); - createPod("stratos-test-pod-2", serviceName, containerPortName); + createPod("stratos-test-pod-1", serviceName, containerPortName, 1, 512); + createPod("stratos-test-pod-2", serviceName, containerPortName, 2, 512); if (testServiceSocket) { // test service accessibility http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/samples/autoscaling-policies/autoscaling-policy-1.json ---------------------------------------------------------------------- diff --git a/samples/autoscaling-policies/autoscaling-policy-1.json b/samples/autoscaling-policies/autoscaling-policy-1.json index 9f6a370..495ed7b 100644 --- a/samples/autoscaling-policies/autoscaling-policy-1.json +++ b/samples/autoscaling-policies/autoscaling-policy-1.json @@ -2,13 +2,13 @@ "id": "autoscaling-policy-1", "loadThresholds": { "requestsInFlight": { - "threshold": 50 + "threshold": 20 }, "memoryConsumption": { - "threshold": 40 + "threshold": 70 }, "loadAverage": { - "threshold": 40 + "threshold": 70 } } } http://git-wip-us.apache.org/repos/asf/stratos/blob/7dc0c9a1/samples/cartridges/kubernetes/php.json ---------------------------------------------------------------------- diff --git a/samples/cartridges/kubernetes/php.json b/samples/cartridges/kubernetes/php.json index fd3905f..8d2c9a0 100755 --- a/samples/cartridges/kubernetes/php.json +++ b/samples/cartridges/kubernetes/php.json @@ -7,7 +7,7 @@ "description": "php Cartridge", "version": "7", "multiTenant": "false", - "loadBalancingIPType" : "public", + "loadBalancingIPType": "public", "portMapping": [ { "protocol": "http", @@ -15,17 +15,27 @@ "proxyPort": "8281" } ], - "deployment":{ - "baseDir":"/var/www" + "deployment": { + "baseDir": "/var/www" }, - "iaasProvider":[ - { - "type":"kubernetes", - "imageId":"stratos/php:4.1.0-beta", - "networkInterfaces":[ - ], - "property":[ - ] - } + "iaasProvider": [ + { + "type": "kubernetes", + "imageId": "stratos/php:4.1.0-beta", + "networkInterfaces": [ + ], + "property": [ + ] + } + ], + "property": [ + { + "name": "KUBERNETES_CONTAINER_CPU", + "value": "1" + }, + { + "name": "KUBERNETES_CONTAINER_MEMORY", + "value": "512" + } ] }
