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
{
[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; }
}
}
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!
Top comments (0)