我正在尝试使用golang client扩展部署。我发现的问题是golang client does not have a scale method for deployments。我不知道该怎么办。我的想法是进行部署,修改副本,然后进行更新。
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{})
}
((摘自kubernetes client go github存储库的示例)
但是我不知道这是否是最好的方法。
您还可以使用patch
将更改应用于部署对象。
// 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
}