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
}