登录
首页 >  Golang >  Go问答

使用 Golang 执行 Kubernetes 资源部署

来源:stackoverflow

时间:2024-03-02 12:12:22 487浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《使用 Golang 执行 Kubernetes 资源部署》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

问题内容

使用 kubectl 应用复杂的 yaml 配置很简单,例如,使用 kubectl 安装 kong-ingress-controller 只需一行:

kubectl apply -f https://raw.githubusercontent.com/Kong/kubernetes-ingress-controller/master/deploy/single/all-in-one-dbless.yaml

在 golang 中执行此操作的等效方法是什么?


解决方案


通过查看此问题找出答案:https://github.com/kubernetes/client-go/issues/193#issuecomment-363318588

我使用的是kubebuilder,使用universaldeserializer简单地将yamls转换为runtime.objects,然后使用reconciler的create方法创建对象:

// ref: https://github.com/kubernetes/client-go/issues/193#issuecomment-363318588
func parseK8sYaml(fileR []byte) []runtime.Object {

    acceptedK8sTypes := regexp.MustCompile(`(Namespace|Role|ClusterRole|RoleBinding|ClusterRoleBinding|ServiceAccount)`)
    fileAsString := string(fileR[:])
    sepYamlfiles := strings.Split(fileAsString, "---")
    retVal := make([]runtime.Object, 0, len(sepYamlfiles))
    for _, f := range sepYamlfiles {
        if f == "\n" || f == "" {
            // ignore empty cases
            continue
        }

        decode := scheme.Codecs.UniversalDeserializer().Decode
        obj, groupVersionKind, err := decode([]byte(f), nil, nil)

        if err != nil {
            log.Println(fmt.Sprintf("Error while decoding YAML object. Err was: %s", err))
            continue
        }

        if !acceptedK8sTypes.MatchString(groupVersionKind.Kind) {
            log.Printf("The custom-roles configMap contained K8s object types which are not supported! Skipping object with type: %s", groupVersionKind.Kind)
        } else {
            retVal = append(retVal, obj)
        }

    }
    return retVal
}

func (r *MyReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
    ctx := context.Background()
    log := r.Log.WithValues("MyReconciler", req.NamespacedName)

    // your logic here
    log.Info("reconciling")

    yaml := `
apiVersion: v1
kind: Namespace
metadata:
  name: test-ns`
    obj := parseK8sYaml([]byte(yaml))
    if err := r.Create(ctx, obj[0]); err != nil {
        log.Error(err, "failed when creating obj")
    }

    ...

}

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

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