public async Task <bool> DeployAsync(Container container) { V1Deployment deployment = GetDeploymentFromContainer(container); await _client.CreateNamespacedDeploymentAsync(deployment, "default"); return(true); }
private async Task <bool> EnsureDeploymentAsync(WebPinger pinger) { var name = $"wp-{pinger.Metadata.Name}"; var deployments = await _kubernetes.ListNamespacedDeploymentAsync( Program.NamespaceName, fieldSelector : $"metadata.name={name}"); if (!deployments.Items.Any()) { var deployment = new V1Deployment { Metadata = new V1ObjectMeta { Name = name, Labels = new Dictionary <string, string>() { { "kiamol", "ch20" }, } }, Spec = new V1DeploymentSpec { Selector = new V1LabelSelector { MatchLabels = new Dictionary <string, string>() { { "app", "web-ping" }, { "instance", name } } }, Template = new V1PodTemplateSpec { Metadata = new V1ObjectMeta { Labels = new Dictionary <string, string>() { { "app", "web-ping" }, { "instance", name }, { "target", pinger.Spec.Target } } }, Spec = new V1PodSpec { AutomountServiceAccountToken = false, Containers = new List <V1Container> { new V1Container { Name = "web", Image = "kiamol/ch10-web-ping", Env = new List <V1EnvVar> { new V1EnvVar { Name = "INTERVAL", Value = pinger.Spec.GetIntervalMilliseconds().ToString() }, new V1EnvVar { Name = "TARGET", Value = pinger.Spec.Target }, new V1EnvVar { Name = "METHOD", Value = pinger.Spec.GetMethod() } }, VolumeMounts = new List <V1VolumeMount> { new V1VolumeMount { Name = "config", MountPath = "/app/config", ReadOnlyProperty = true }, new V1VolumeMount { Name = "logs", MountPath = "/logs" } } }, new V1Container { Name = "api", Image = "kiamol/ch20-log-archiver", Ports = new List <V1ContainerPort> { new V1ContainerPort { Name = "api", ContainerPort = 80 } }, VolumeMounts = new List <V1VolumeMount> { new V1VolumeMount { Name = "logs", MountPath = "/logs" } } } }, Volumes = new List <V1Volume> { new V1Volume { Name = "config", ConfigMap = new V1ConfigMapVolumeSource { Name = $"{name}-config" } }, new V1Volume { Name = "logs", EmptyDir = new V1EmptyDirVolumeSource() } } } } } }; await _kubernetes.CreateNamespacedDeploymentAsync(deployment, Program.NamespaceName); Console.WriteLine($"** Created Deployment: {name}, in namespace: {Program.NamespaceName}"); return(true); } else { Console.WriteLine($"** Deployment exists: {name}, in namespace: {Program.NamespaceName}"); return(false); } }
CreateDeploymentAsync(Kubernetes k8sClient, V1Deployment yamlModel, MTADeployModel deployModel) { try { var namespaceParams = PrepareNamespaceParams(_groupName); var deployParams = PrepareDeployParams(_deployName); yamlModel.Metadata.Name = deployParams.Item1; yamlModel.Metadata.NamespaceProperty = namespaceParams; if (deployModel.Annotations != null) { yamlModel.Metadata.Annotations = deployModel.Annotations; } if (deployModel.Labels != null) { yamlModel.Metadata.Labels = deployModel.Labels; } yamlModel.Spec.Replicas = deployModel.Replicas; yamlModel.Spec.Selector.MatchLabels["app"] = deployParams.Item2; yamlModel.Spec.Template.Metadata.Labels["app"] = deployParams.Item2; var container = yamlModel.Spec.Template.Spec.Containers[0]; container.Name = deployParams.Item3; container.Image = deployModel.Image; container.ImagePullPolicy = deployModel.ImagePullPolicy; if (deployModel.Resources != null) { if (deployModel.Resources.Requests != null) { var cpu = new ResourceQuantity(deployModel.Resources.Requests.CPU); container.Resources.Requests["cpu"] = cpu; var memory = new ResourceQuantity(deployModel.Resources.Requests.Memory); container.Resources.Requests["memory"] = memory; } if (deployModel.Resources.Limits != null) { var cpu = new ResourceQuantity(deployModel.Resources.Limits.CPU); container.Resources.Limits["cpu"] = cpu; var memory = new ResourceQuantity(deployModel.Resources.Limits.Memory); container.Resources.Limits["memory"] = memory; } } if (deployModel.Env != null) { var v1EnvList = new List <V1EnvVar>(); foreach (var env in deployModel.Env) { var v1Env = new V1EnvVar(env["name"], env["value"]); v1EnvList.Add(v1Env); } container.Env = v1EnvList; } var containerPorts = new List <V1ContainerPort>(); foreach (var port in deployModel.Ports) { var v1ContainerPort = new V1ContainerPort(port); containerPorts.Add(v1ContainerPort); } container.Ports = containerPorts; var v1Deployment = await k8sClient.CreateNamespacedDeploymentAsync (yamlModel, namespaceParams); deployModel = new MTADeployModel(v1Deployment); return(new Tuple <MTADeployModel, MTAErrorModel>(deployModel, null)); } catch (HttpOperationException ex) { var errorModel = new MTAErrorModel(ex); return(new Tuple <MTADeployModel, MTAErrorModel>(null, errorModel)); } catch (Exception) { throw; } }
private async Task EnsureDeploymentAsync(Timecheck timecheck) { var name = timecheck.Metadata.Name; var deployments = await _kubernetes.ListNamespacedDeploymentAsync( namespaceParameter : Program.NamespaceName, fieldSelector : $"metadata.name={name}"); if (!deployments.Items.Any()) { var deployment = new V1Deployment { Metadata = new V1ObjectMeta { Name = name, Labels = new Dictionary <string, string>() { { "kiamol", "ch20" }, } }, Spec = new V1DeploymentSpec { Selector = new V1LabelSelector { MatchLabels = new Dictionary <string, string>() { { "app", "timecheck" }, { "instance", name } } }, Template = new V1PodTemplateSpec { Metadata = new V1ObjectMeta { Labels = new Dictionary <string, string>() { { "app", "timecheck" }, { "instance", name } } }, Spec = new V1PodSpec { AutomountServiceAccountToken = false, Containers = new List <V1Container> { new V1Container { Name = "tc", Image = "kiamol/ch07-timecheck", Env = new List <V1EnvVar> { new V1EnvVar { Name = "Application__Environment", Value = timecheck.Spec.Environment }, new V1EnvVar { Name = "Timer__IntervalSeconds", Value = timecheck.Spec.Interval.ToString() } }, VolumeMounts = new List <V1VolumeMount> { new V1VolumeMount { Name = "logs", MountPath = "/logs" } } }, new V1Container { Name = "logger", Image = "kiamol/ch03-sleep", Command = new List <string> { "sh", "-c", "tail -f /logs-ro/timecheck.log" }, VolumeMounts = new List <V1VolumeMount> { new V1VolumeMount { Name = "logs", MountPath = "/logs-ro", ReadOnlyProperty = true } } } }, Volumes = new List <V1Volume> { new V1Volume { Name = "logs", EmptyDir = new V1EmptyDirVolumeSource() } } } } } }; await _kubernetes.CreateNamespacedDeploymentAsync(deployment, Program.NamespaceName); Console.WriteLine($"** Created Deployment: {name}, in namespace: {Program.NamespaceName}"); } else { Console.WriteLine($"** Deployment exists: {name}, in namespace: {Program.NamespaceName}"); } }