DEV Community

Carlos Mendible
Carlos Mendible

Posted on • Originally published at carlos.mendible.com on

Scale a Kubernetes Deployment with .NET Core

Let’s start:

1. Create a folder for your new project


Open a command prompt an run:

mkdir kuberenetes.scale
Enter fullscreen mode Exit fullscreen mode

2. Create the project


cd kuberenetes.scale
dotnet new api
Enter fullscreen mode Exit fullscreen mode

3. Add the references to KubernetesClient


dotnet add package KubernetesClient -v 1.5.18
dotnet restore
Enter fullscreen mode Exit fullscreen mode

4. Create a PodsController.cs with the following code


using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using k8s;
using k8s.Models;
using Microsoft.AspNetCore.JsonPatch;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;

namespace kubernetes.scale
{
    [Route("api/[controller]")]
    [ApiController]
    public class PodsController : ControllerBase
    {
        private KubernetesClientConfiguration k8sConfig = null;

        public PodsController(IConfiguration config)
        {
            // Reading configuration to know if running inside a cluster or in local mode.
            var useKubeConfig = bool.Parse(config["UseKubeConfig"]);
            if (!useKubeConfig)
            {
                // Running inside a k8s cluser
                k8sConfig = KubernetesClientConfiguration.InClusterConfig();
            }
            else
            {
                // Running on dev machine
                k8sConfig = KubernetesClientConfiguration.BuildConfigFromConfigFile();
            }
        }

        [HttpPatch("scale")]
        public IActionResult Scale([FromBody]ReplicaRequest request)
        {
            // Use the config object to create a client.
            using (var client = new Kubernetes(k8sConfig))
            {
                // Create a json patch for the replicas
                var jsonPatch = new JsonPatchDocument<V1Scale>();
                // Set the new number of repplcias
                jsonPatch.Replace(e => e.Spec.Replicas, request.Replicas);
                // Creat the patch
                var patch = new V1Patch(jsonPatch);

                // Patch the "minions" Deployment in the "default" namespace
                client.PatchNamespacedDeploymentScale(patch, request.Deployment, request.Namespace);

                return NoContent();
            }
        }
    }

    public class ReplicaRequest
    {
        public string Deployment { get; set; }
        public string Namespace { get; set; }
        public int Replicas { get; set; }
    }
}
Enter fullscreen mode Exit fullscreen mode

5. Replace the contents of the appsettings.Development.json file

Note the UseKubeConfig property is set to true.

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  },
  "UseKubeConfig": true
}
Enter fullscreen mode Exit fullscreen mode

6. Replace the contents of the appsettings.json file

Note the UseKubeConfig property is set to false.

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "UseKubeConfig": false
}
Enter fullscreen mode Exit fullscreen mode

7. Test the application


Test the app from your dev machine running:

dotnet run
curl -k -i -H 'Content-Type: application/json' -d '{"Deployment": "<YOUR DEPLOYMENT NAME>", "Namespace": "<YOUR NAMESPACE>", "Replicas": 3}' -X PATCH https://localhost:5001/api/pods/scale
Enter fullscreen mode Exit fullscreen mode

Note : You must have a valid config file to connect to the k8s cluster.

Please find all the code used in this post here.

Hope it helps!

Top comments (0)