Search code examples
gokubernetesclient

Scale deployment replicas with kubernetes go client


I'm trying to scale a deployment with golang client. The problem I've found is that the golang client does not have a scale method for deployments. I don't know how I should do it. The idea that I have is get a deployment, modify the replicas, and then do an update.

package main

import (
    "context"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    appsv1 "k8s.io/api/apps/v1"
    "flag"
    "fmt"
    "os"
    "path/filepath"

)

func main() {
    var kubeconfig *string
    if home := homedir.HomeDir(); home != "" {
        kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
    } else {
        kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
    }
    flag.Parse()

    config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
    if err != nil {
        panic(err)
    }
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err)
    }
    //get and update replicas
    deploymentsClient := clientset.AppsV1().Deployments(apiv1.NamespaceDefault)
    deployment, _ := deploymentsClient.Get(context.TODO(), "demo-deployment", metav1.GetOptions{})
    deploymentsClient.Update(context.TODO(), deployment, metav1.UpdateOptions{})
}

(Example taken from kubernetes client go github repository)

But I don't know if it is the best aproach.


Solution

  • You can also use patch to apply changes to the deployment object.

    // here, 
    // "client" be the kubernetes client
    // "cur" be the current deployment object
    // "mod" be the modified deployment object, 
    // make sure to use deep copy before modifying the deployment object.
    
    func PatchDeploymentObject(client kubernetes.Interface, cur, mod *apps.Deployment) (*apps.Deployment, error) {
        curJson, err := json.Marshal(cur)
        if err != nil {
            return nil, err
        }
    
        modJson, err := json.Marshal(mod)
        if err != nil {
            return nil, err
        }
    
        patch, err := strategicpatch.CreateTwoWayMergePatch(curJson, modJson, apps.Deployment{})
        if err != nil {
            return nil, err
        }
    
        if len(patch) == 0 || string(patch) == "{}" {
            return cur, nil
        }
    
        out, err := client.AppsV1().Deployments(cur.Namespace).Patch(cur.Name, types.StrategicMergePatchType, patch)
    
        return out, err
    }