Scale deployment replicas with kubernetes go client

ghz 1years ago ⋅ 2974 views

Question

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](https://godoc.org/k8s.io/client- go/kubernetes/typed/apps/v1#DeploymentInterface). 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](https://github.com/kubernetes/client-go/blob/master/examples/create- update-delete-deployment/) github repository)

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


Answer

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
}