コード例 #1
0
        public string CreateService(string tenant, string filename)
        {
            var yml = Yaml.LoadFromFileAsync <V1Service>(filename).Result;

            yml.Metadata.Labels.Add("tenant", tenant);
            yml.Spec.Selector.Add("tenant", tenant);
            var svc = _client.CreateNamespacedService(yml, "default");

            return(svc.Metadata.Name);
        }
コード例 #2
0
        public ActionResult Create()
        {
            var id     = Guid.NewGuid().ToString("N").Substring(0, 5);
            var config = KubernetesClientConfiguration.BuildConfigFromConfigFile();
            var client = new Kubernetes(config);

            var service = client.CreateNamespacedService(ServiceModel.CreateService(id), "minecraft");

            service.Validate();

            try
            {
                client.CreateNamespacedStatefulSet(StatefulSetModel.CreateStatefulSet(id), "minecraft");
            }
            catch { }

            var pod = client.CreateNamespacedPod(PodModel.CreatePod(id), "minecraft");

            pod.Validate();

            return(Created("/servers", new object[] { service, pod }));
        }
コード例 #3
0
        public virtual IActionResult ServersPost(string servername)
        {
            Contract.Ensures(Contract.Result <IActionResult>() != null);
            try
            {
                var         config = KubernetesClientConfiguration.BuildConfigFromConfigFile();
                IKubernetes client = new Kubernetes(config);



                var deployment = ObterYaml <V1Deployment>(servername, "./aks-minecraft.yaml");

                var services = ObterYaml <V1Service>(servername, "./services.yaml");


                var newDeployment = client.CreateNamespacedDeployment(
                    body: deployment, namespaceParameter: "default");

                var newServices = client.CreateNamespacedService(
                    body: services, namespaceParameter: "default");


                string exampleJson = null;
                exampleJson = "{\n  \"endpoints\" : {\n    \"minecraft\" : \"minecraft\",\n    \"rcon\" : \"rcon\"\n  },\n  \"name\" : \"name\"\n}";


                var example = exampleJson != null
                ? JsonConvert.DeserializeObject <Server>(exampleJson)
                : default(Server);



                return(new ObjectResult(newDeployment));
            }
            catch (Exception ex)
            {
                return(new ObjectResult(ex.Message));
            }
        }
コード例 #4
0
ファイル: CreateController.cs プロジェクト: Xyrvyre/athena
        public async System.Threading.Tasks.Task <IActionResult> Index(int id)
        {
            userName = this.User.FindFirstValue(ClaimTypes.NameIdentifier);

            var k8SClientConfig = KubernetesClientConfiguration.BuildDefaultConfig();
            var client          = new Kubernetes(k8SClientConfig);


            var optionsBuilder = new DbContextOptionsBuilder <ApplicationDbContext>();

            optionsBuilder.UseSqlServer("ApplicationDbContext");
            p = _context.Template.Find(id).Path;

            HttpContext.Session.SetInt32("TemplateId", id);


            var    pDeployments = "/etc/athena/Templates/" + p + "/Deployment";
            var    pServices    = "/etc/athena/Templates/" + p + "/Service";
            var    pIngress     = "/etc/athena/Templates/" + p + "/Ingress";
            string pNetPol      = "/etc/athena/Templates/" + p + "/NetworkPolicy";

            try
            {
                foreach (string file in Directory.EnumerateFiles(pServices))
                {
                    var fileContent = System.IO.File.ReadAllText(file);

                    var service = Yaml.LoadFromString <V1Service>(fileContent);


                    var result = client.CreateNamespacedService(service, userName);
                }

                foreach (string file in Directory.EnumerateFiles(pDeployments))
                {
                    var fileContent = System.IO.File.ReadAllText(file);

                    var deployment = Yaml.LoadFromString <V1Deployment>(fileContent);

                    var result = client.CreateNamespacedDeployment(deployment, userName);
                }

                foreach (string file in Directory.EnumerateFiles(pIngress))
                {
                    var fileContent = System.IO.File.ReadAllText(file);

                    var ingress = Yaml.LoadFromString <Networkingv1beta1Ingress>(fileContent);

                    AddIngress(client, ingress, userName);
                }

                foreach (string file in Directory.EnumerateFiles(pNetPol))
                {
                    V1NetworkPolicy netPol      = null;
                    var             fileContent = System.IO.File.ReadAllText(file);

                    netPol = Yaml.LoadFromString <V1NetworkPolicy>(fileContent);


                    var result = client.CreateNamespacedNetworkPolicy(netPol, userName);
                }


                return(View());
            }
            catch {
                return(View());
            }
        }
コード例 #5
0
ファイル: KubeHelper.cs プロジェクト: rjmuniz/OpenHack
        internal void AddServicePod(string podName)
        {
            podName = podName.ToLower();
            var appLabel = new Dictionary <string, string> {
                { "app", podName }
            };

            using (Stream stream = KubeConfigStream)
            {
                var config = KubernetesClientConfiguration.BuildConfigFromConfigFile(stream);

                using (IKubernetes client = new Kubernetes(config))
                {
                    var deployment = new Appsv1beta1Deployment("apps/v1beta1", "Deployment")
                    {
                        Metadata = new V1ObjectMeta()
                        {
                            Name = podName
                        },
                        Spec = new Appsv1beta1DeploymentSpec()
                        {
                            Template = new V1PodTemplateSpec()
                            {
                                Metadata = new V1ObjectMeta()
                                {
                                    Labels = appLabel
                                },
                                Spec = new V1PodSpec()
                                {
                                    Containers = new k8s.Models.V1Container[] {
                                        new V1Container
                                        {
                                            Name         = podName,
                                            Image        = "openhackteam5.azurecr.io/minecraft-server:2.0",
                                            VolumeMounts = new V1VolumeMount[]
                                            {
                                                new k8s.Models.V1VolumeMount
                                                {
                                                    Name      = "volume",
                                                    MountPath = "/data"
                                                }
                                            },
                                            Ports = new V1ContainerPort[]
                                            {
                                                new V1ContainerPort(25565, name: "port25565"),
                                                new V1ContainerPort(25575, name: "port25575")
                                            },
                                            Env = new V1EnvVar[] { new V1EnvVar("EULA", true.ToString()) }
                                        }
                                    },
                                    Volumes = new V1Volume[]
                                    {
                                        new V1Volume("volume", persistentVolumeClaim: new V1PersistentVolumeClaimVolumeSource(podName + SuffixPVC))
                                    },
                                    ImagePullSecrets = new V1LocalObjectReference[] { new V1LocalObjectReference("acr-auth") }
                                }
                            }
                        }
                    };
                    var loadBalancer = new V1Service("v1", "Service")
                    {
                        Metadata = new V1ObjectMeta {
                            Name = podName + SuffixLoadBalancer
                        },
                        Spec = new V1ServiceSpec
                        {
                            Type  = "LoadBalancer",
                            Ports = new V1ServicePort[] {
                                new   V1ServicePort(25565, "port25565", targetPort: 25565),
                                new   V1ServicePort(25575, "port25575", targetPort: 25575)
                            },
                            Selector = appLabel
                        }
                    };


                    var persistentVolumeClaim = new V1PersistentVolumeClaim()
                    {
                        Metadata = new V1ObjectMeta()
                        {
                            Name = podName + SuffixPVC, NamespaceProperty = DefaultNamespace
                        },
                        Spec = new V1PersistentVolumeClaimSpec
                        {
                            AccessModes      = new string[] { "ReadWriteMany" },
                            StorageClassName = "azurefile",
                            Resources        = new V1ResourceRequirements(requests: new Dictionary <string, ResourceQuantity> {
                                { "storage", new ResourceQuantity("5Gi") }
                            })
                        },
                        Status = new V1PersistentVolumeClaimStatus()
                    };
                    var pvcs = client.ListDeploymentForAllNamespaces1();
                    client.CreateNamespacedPersistentVolumeClaim(persistentVolumeClaim, DefaultNamespace);
                    client.CreateNamespacedDeployment1(deployment, DefaultNamespace);
                    client.CreateNamespacedService(loadBalancer, DefaultNamespace);
                }
            }
        }
コード例 #6
0
        public static Compute CreateCompute([ActivityTrigger] string caseNumber, ExecutionContext context, ILogger log)
        {
            log.LogInformation($"Creating compute for {caseNumber}.");

            var homeDirectory = context.FunctionAppDirectory;

            var compute = new Compute();

            var config
                = KubernetesClientConfiguration.BuildConfigFromConfigFile(Path.Combine(homeDirectory, "kubeconfig.json"));

            config.ClientCertificateKeyStoreFlags = X509KeyStorageFlags.MachineKeySet
                                                    | X509KeyStorageFlags.PersistKeySet
                                                    | X509KeyStorageFlags.Exportable;
            var client = new Kubernetes(config);

            try
            {
                var name = $"dsirona-engine-ag-{caseNumber}";

                var v1service = Yaml.LoadFromFileAsync <V1Service>(Path.Combine(homeDirectory, "engineService.yaml")).Result;
                v1service.Metadata.Name = name;
                v1service.Spec.Selector.Clear();
                v1service.Spec.Selector.Add("app", name);
                var service = client.CreateNamespacedService(v1service, "default");

                var v1Deployment  = Yaml.LoadFromFileAsync <V1Deployment>(Path.Combine(homeDirectory, "engineDeployment.yaml")).Result;
                var v1PodTemplate = v1Deployment.Spec.Template;
                v1PodTemplate.Spec.Containers[0].Name = name;
                v1Deployment.Metadata.Name            = name;
                v1Deployment.Spec.Selector.MatchLabels.Clear();
                v1Deployment.Spec.Selector.MatchLabels.Add("app", name);
                v1Deployment.Spec.Template.Metadata.Labels.Clear();
                v1Deployment.Spec.Template.Metadata.Labels.Add("app", name);


                var deployment = client.CreateNamespacedDeployment(v1Deployment, "default");

                HttpOperationResponse <V1PodList> pods;
                V1Pod pod = null;
                //TODO: Keep trying till the status of the pod is Running, implement timeout
                for (int retry = 0; retry < 60; retry++)
                {
                    pods = client.ListNamespacedPodWithHttpMessagesAsync("default", labelSelector: $"app={name}").Result;
                    pod  = pods.Body.Items[0];
                    if (pod.Status.Phase == "Running")
                    {
                        break;
                    }

                    Task.Delay(1000);
                }

                //Console.WriteLine($"Host IP : { pod.Status.HostIP}, ports: {service.Spec.Ports[0].NodePort},{service.Spec.Ports[1].NodePort},{service.Spec.Ports[2].NodePort}");

                compute.Key       = name;
                compute.IPAddress = pod.Status?.HostIP;
                compute.Port      = service.Spec.Ports[0].NodePort.ToString();
            }
            catch (Exception serviceException)
            {
                ///TODO: Implement rollback
                compute.Status           = "Error";
                compute.LastErrorMessage = serviceException.Message;
                Console.Write(serviceException.Message);
            }

            compute.Status = "Healthy";

            return(compute);
        }