为了账号安全,请及时绑定邮箱和手机立即绑定

在 Golang 中执行“kubectl apply”的等效方法

在 Golang 中执行“kubectl apply”的等效方法

Go
慕少森 2022-05-18 16:37:00
使用 应用复杂的 yaml 配置很简单kubectl,例如,安装kong-ingress-controller只需使用一行kubectl:kubectl apply -f https://raw.githubusercontent.com/Kong/kubernetes-ingress-controller/master/deploy/single/all-in-one-dbless.yaml在 Golang 中这样做的等效方法是什么?
查看完整描述

1 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

通过检查这个问题弄清楚:https ://github.com/kubernetes/client-go/issues/193#issuecomment-363318588


我在 using kubebuilder,简单把 yamls 变成runtime.Objectsusing UniversalDeserializer,然后使用 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")

    }


    ...


}


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 216 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信