/** * Generate kubernetes service ports for cluster. * * @param kubernetesClusterContext * @param clusterId * @param cartridge */ private void generateKubernetesServicePorts( String applicationId, String clusterId, KubernetesClusterContext kubernetesClusterContext, Cartridge cartridge) { synchronized (KubernetesIaas.class) { if (cartridge != null) { StringBuilder portMappingStrBuilder = new StringBuilder(); for (PortMapping portMapping : Arrays.asList(cartridge.getPortMappings())) { Collection<ClusterPortMapping> clusterPortMappings = CloudControllerContext.getInstance().getClusterPortMappings(applicationId, clusterId); if (clusterPortMappings == null) { throw new CloudControllerException( String.format( "Cluster port mappings not found: " + "[application-id] %s [cluster-id] %s", applicationId, clusterId)); } ClusterPortMapping clusterPortMapping = findClusterPortMapping(clusterPortMappings, portMapping); if (clusterPortMappings == null) { throw new CloudControllerException( String.format( "Cluster port mapping not found: " + "[application-id] %s [cluster-id] %s [transport] %s", applicationId, clusterId, portMapping.getName())); } if (clusterPortMapping.getKubernetesServiceType() == null) { throw new CloudControllerException( String.format( "Kubernetes service type not " + "found [application-id] %s [cluster-id] %s [cartridge] %s", applicationId, clusterId, cartridge)); } String serviceType = portMapping.getKubernetesPortType(); clusterPortMapping.setKubernetesServiceType(serviceType); // If kubernetes service port is already set, skip setting a new one if (clusterPortMapping.getKubernetesServicePort() == 0) { if (serviceType.equals(KubernetesConstants.NODE_PORT)) { int nextServicePort = kubernetesClusterContext.getNextServicePort(); if (nextServicePort == -1) { throw new RuntimeException( String.format( "Could not generate service port: [cluster-id] %s " + "[port] %d", clusterId, portMapping.getPort())); } clusterPortMapping.setKubernetesServicePort(nextServicePort); } else { clusterPortMapping.setKubernetesServicePort(portMapping.getPort()); } } else { if (log.isDebugEnabled()) { log.debug( String.format( "Kubernetes service port is already set: [application-id] %s " + "[cluster-id] %s [port] %d [service-port] %d", applicationId, clusterId, clusterPortMapping.getPort(), clusterPortMapping.getKubernetesServicePort())); } } // Add port mappings to payload if (portMappingStrBuilder.toString().length() > 0) { portMappingStrBuilder.append(";"); } portMappingStrBuilder.append( String.format( "NAME:%s|PROTOCOL:%s|PORT:%d|PROXY_PORT:%d", clusterPortMapping.getName(), clusterPortMapping.getProtocol(), clusterPortMapping.getKubernetesServicePort(), clusterPortMapping.getProxyPort())); if (log.isInfoEnabled()) { log.info( String.format( "Kubernetes service port generated: [application-id] %s " + "[cluster-id] %s [port] %d [service-port] %d", applicationId, clusterId, clusterPortMapping.getPort(), clusterPortMapping.getKubernetesServicePort())); } } NameValuePair nameValuePair = new NameValuePair(PORT_MAPPINGS, portMappingStrBuilder.toString()); payload.add(nameValuePair); // Persist service ports added to cluster port mappings CloudControllerContext.getInstance().persist(); } } }
/** * Create new pod and pass environment variables. * * @param memberContext * @param kubernetesApi * @param kubernetesClusterContext * @throws KubernetesClientException */ private void createPod( ClusterContext clusterContext, MemberContext memberContext, KubernetesApiClient kubernetesApi, KubernetesClusterContext kubernetesClusterContext) throws KubernetesClientException { String applicationId = memberContext.getApplicationId(); String cartridgeType = memberContext.getCartridgeType(); String clusterId = memberContext.getClusterId(); String memberId = memberContext.getMemberId(); if (log.isInfoEnabled()) { log.info( String.format( "Creating kubernetes pod: [application] %s [cartridge] %s [member] %s", applicationId, cartridgeType, memberId)); } Partition partition = memberContext.getPartition(); if (partition == null) { String message = String.format( "Partition not found in member context: [application] %s [cartridge] %s " + "[member] %s ", applicationId, cartridgeType, memberId); log.error(message); throw new RuntimeException(message); } Cartridge cartridge = CloudControllerContext.getInstance().getCartridge(cartridgeType); if (cartridge == null) { String message = "Could not find cartridge: [cartridge] " + cartridgeType; log.error(message); throw new RuntimeException(message); } // Set default values to zero to avoid cpu and memory restrictions int cpu = Integer.getInteger(KUBERNETES_CONTAINER_CPU_DEFAULT, 0); int memory = Integer.getInteger(KUBERNETES_CONTAINER_MEMORY_DEFAULT, 0); 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.getUuid(), partition.getUuid()); if (iaasProvider == null) { String message = "Could not find iaas provider: [partition] " + partition.getUuid(); log.error(message); throw new RuntimeException(message); } // Add dynamic payload to the member context memberContext.setDynamicPayload(payload.toArray(new NameValuePair[payload.size()])); // Create pod long podSeqNo = kubernetesClusterContext.getPodSeqNo().incrementAndGet(); String podId = "pod" + "-" + podSeqNo; String podLabel = DigestUtils.md5Hex(clusterId); String dockerImage = iaasProvider.getImage(); List<EnvVar> environmentVariables = KubernetesIaasUtil.prepareEnvironmentVariables(clusterContext, memberContext); List<ContainerPort> ports = KubernetesIaasUtil.convertPortMappings(Arrays.asList(cartridge.getPortMappings())); log.info( String.format( "Starting pod: [application] %s [cartridge] %s [member] %s " + "[cpu] %d [memory] %d MB", memberContext.getApplicationId(), memberContext.getCartridgeType(), memberContext.getMemberId(), cpu, memory)); kubernetesApi.createPod(podId, podLabel, dockerImage, cpu, memory, ports, environmentVariables); log.info( String.format( "Pod started successfully: [application] %s [cartridge] %s [member] %s " + "[pod] %s [cpu] %d [memory] %d MB", memberContext.getApplicationId(), memberContext.getCartridgeType(), memberContext.getMemberId(), podId, cpu, memory)); // 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(); }