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}");
 }
예제 #6
0
 public async Task GetKubernetesFunctionLogs(string functionName)
 {
     string nameSpace = KUBERNETES_DEFAULT_NAMESPACE;
     await KubectlHelper.RunKubectl($"logs -l app={functionName}-deployment -n {nameSpace}", showOutput : true);
 }