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 <string> GetIstioClusterIngressEndpoint()
        {
            var gateway = await KubectlHelper.KubectlGet <JObject>("service istio-ingressgateway --namespace istio-system");

            if (gateway == null)
            {
                return(string.Empty);
            }

            var endpoint = gateway.SelectToken("Status.LoadBalancer.Ingress[0].Hostname")?.ToString();

            if (!string.IsNullOrEmpty(endpoint))
            {
                return(endpoint);
            }

            return(gateway.SelectToken("Status.LoadBalancer.Ingress[0].Ip")?.ToString());
        }