登录
首页 >  Golang >  Go问答

使用 kubernetes go 客户端进行副本部署的扩展功能

来源:stackoverflow

时间:2024-02-06 14:36:19 481浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《使用 kubernetes go 客户端进行副本部署的扩展功能》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我正在尝试使用 golang 客户端扩展部署。我发现的问题是 golang 客户端没有用于部署的扩展方法。我不知道我该怎么做。 我的想法是进行部署,修改副本,然后进行更新。

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 客户端 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
}
package main

import (
    "context"
    "log"
    "path/filepath"

    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/rest"
    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/client-go/util/homedir"
)

func main() {
    kubeconfig := filepath.Join(homedir.HomeDir(), ".kube", "config")
    config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
    if err != nil {
        config, err = rest.InClusterConfig()
        if err != nil {
            log.Fatal(err)
        }
    }

    client, err := kubernetes.NewForConfig(config)
    if err != nil {
        log.Fatal(err)
    }

    s, err := client.AppsV1().
        Deployments("default").
        GetScale(context.TODO(), "nginx", metav1.GetOptions{})
    if err != nil {
        log.Fatal(err)
    }

    sc := *s
    sc.Spec.Replicas = 10

    us, err := client.AppsV1().
        Deployments("default").
        UpdateScale(context.TODO(),
            "nginx", &sc, metav1.UpdateOptions{})
    if err != nil {
        log.Fatal(err)
    }

    log.Println(*us)
}

好了,本文到此结束,带大家了解了《使用 kubernetes go 客户端进行副本部署的扩展功能》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>