Scale a Kubernetes Deployment with .NET Core

by Carlos Mendible on 31 May 2019 » dotNetCore, kubernetes, DevOps

Let’s start:

1. Create a folder for your new project

Open a command prompt an run:

mkdir kuberenetes.scale

2. Create the project

cd kuberenetes.scale
dotnet new api

3. Add the references to KubernetesClient

dotnet add package KubernetesClient -v 1.5.18
dotnet restore

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
    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();
                // Running on dev machine
                k8sConfig = KubernetesClientConfiguration.BuildConfigFromConfigFile();

        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; }

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

6. Replace the contents of the appsettings.json file

Note the UseKubeConfig property is set to false.

  "Logging": {
    "LogLevel": {
      "Default": "Warning"
  "AllowedHosts": "*",
  "UseKubeConfig": false

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

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!