go - 在 Golang 中执行“kubectl apply”的等效方法
问题描述
使用 应用复杂的 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 中这样做的等效方法是什么?
解决方案
通过检查这个问题弄清楚:https ://github.com/kubernetes/client-go/issues/193#issuecomment-363318588
我在 using kubebuilder
,简单把 yamls 变成runtime.Objects
using 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")
}
...
}
推荐阅读
- json - 来自包含双精度数字的 Json 帖子的错误 400(错误请求)
- django - Django-haystack & solr : 增加结果数
- python - UnicodeDecodeError:'utf-8'编解码器无法解码位置 0 的字节 0xff:django 中的无效起始字节
- python-3.x - 根据多列条件过滤熊猫数据框行
- java - 运行 Java 工件时显示 Unicode 字符的问题,但在 IntelliJ IDEA 中运行时一切正常
- jenkins - Jenkins声明性管道负载参数在前提条件下
- javascript - 防止删除 contenteditable div 中的第一段
- javascript - Asp.net Core 中的 ReadAsMultipartAsync
- excel - 将用户表单提交到 Access 数据库时自动增加字母数字字符串
- javascript - How do you make the same command but it will change according to the day