Beispiel #1
0
        public async Task <bool> DeployAsync(Container container)
        {
            V1Deployment deployment = GetDeploymentFromContainer(container);
            await _client.CreateNamespacedDeploymentAsync(deployment, "default");

            return(true);
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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;
            }
        }
Beispiel #4
0
        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}");
            }
        }