private async Task Deploy(string name, string image, string nameSpace, int min, int max, double cpu, int memory, string port, string pullSecret) { await CreateNamespace(nameSpace); var deploymentName = $"{name}-deployment"; await DeleteDeploymentIfExists(deploymentName, nameSpace); ColoredConsole.WriteLine("Deploying function to Kubernetes..."); var deployment = GetDeployment(deploymentName, image, cpu, memory, port, nameSpace, min, pullSecret); var json = Newtonsoft.Json.JsonConvert.SerializeObject(deployment, Newtonsoft.Json.Formatting.None, new Newtonsoft.Json.JsonSerializerSettings { NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore }); await KubectlHelper.RunKubectl($"apply -f deployment.json --namespace {nameSpace}"); ColoredConsole.WriteLine("Deployment successful"); var service = GetService(deploymentName, nameSpace, port); try { // we can safely ignore the error here await KubectlHelper.KubectlApply(service, showOutput : false); } catch { } await TryRemoveAutoscaler(deploymentName, nameSpace); await CreateAutoscaler(deploymentName, nameSpace, min, max); var externalIP = ""; ColoredConsole.WriteLine("Waiting for External IP..."); while (string.IsNullOrEmpty(externalIP)) { var svc = await KubectlHelper.KubectlGet <JObject>($"{deploymentName}-service --namespace {nameSpace}"); if (svc != null) { var obj = svc.SelectToken("Status.LoadBalancer.Ingress[0].Ip"); if (obj != null) { externalIP = obj.ToString(); } } } ColoredConsole.WriteLine(); ColoredConsole.WriteLine("Function deployed successfully!"); ColoredConsole.WriteLine($"Function IP: {externalIP}"); }
private async Task CreateAutoscaler(string deploymentName, string nameSpace, int minInstances, int maxInstances, int cpuPercentage = 60) { var cmd = $"autoscale deploy {deploymentName} --cpu-percent={cpuPercentage} --max={maxInstances} --min={minInstances} --namespace={nameSpace}"; if (!string.IsNullOrEmpty(configFile)) { cmd += $" --kubeconfig {configFile}"; } await KubectlHelper.RunKubectl(cmd); }
private async Task TryRemoveAutoscaler(string deploymentName, string nameSpace) { await KubectlHelper.RunKubectl($"delete hpa {deploymentName} -n {nameSpace}"); }
private async Task DeleteDeploymentIfExists(string name, string nameSpace) { await KubectlHelper.RunKubectl($"delete deployment {name} --namespace {nameSpace}"); }
private async Task CreateNamespace(string name) { await KubectlHelper.RunKubectl($"create ns {name}"); }
public async Task GetKubernetesFunctionLogs(string functionName) { string nameSpace = KUBERNETES_DEFAULT_NAMESPACE; await KubectlHelper.RunKubectl($"logs -l app={functionName}-deployment -n {nameSpace}", showOutput : true); }