【问题标题】:How to create kubernetes objects by passing a yaml file like kubectl apply in golang如何通过在golang中传递像kubectl这样的yaml文件来创建kubernetes对象
【发布时间】:2020-06-08 16:05:26
【问题描述】:

我正在创建一个工具,该工具将使用 yaml 文件创建 kubernetes 对象。我是用golang写的。该工具希望实现与 kubectl apply -f test.yaml 相同的行为

【问题讨论】:

标签: kubernetes kubectl client-go


【解决方案1】:

基本上,最快的就是使用像官方go client这样的现有库。

本质上kubectl 也使用client-go,因此您也可以按照其源代码作为指导。

您也可以使用k8s,这是另一个 K8s go 客户端。

【讨论】:

    【解决方案2】:

    kubectl 源码比较难理解,尤其是涉及到很多非固定对象类型的创建,如何解析 yaml 到 go 对象(我搞定了,但是需要手动切换大小写转换成真正的 go 类型,这是单一类型)。

    这是秘密创建代码,有什么通用的创建可以传递不同对象的列表吗?或者更好,只是简单的 yaml 字符串

        secretClient := client.CoreV1().Secrets("default")
    
        result, err := secretClient.Create(secret)
    

    链接:https://sourcegraph.com/github.com/kubernetes/kubectl@master/-/blob/pkg/cmd/apply/apply.go#L328:22&tab=def

    func (o *ApplyOptions) GetObjects() ([]*resource.Info, error) {
        var err error = nil
        if !o.objectsCached {
            // include the uninitialized objects by default if --prune is true
            // unless explicitly set --include-uninitialized=false
            r := o.Builder.
                Unstructured().
                Schema(o.Validator).
                ContinueOnError().
                NamespaceParam(o.Namespace).DefaultNamespace().
                FilenameParam(o.EnforceNamespace, &o.DeleteOptions.FilenameOptions).
                LabelSelectorParam(o.Selector).
                Flatten().
                Do()
            o.objects, err = r.Infos()
            o.objectsCached = true
        }
        return o.objects, err
    }
    

    r.Infos 迷路了,不确定它在哪里定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-06
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      • 2022-09-25
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多