client-go:将 kubernetes json 文件解析为 k8s 结构

2024-03-12

我想解析 kubernetes 清单文件(json/yaml)并能够将它们转换为 k8s 结构(以便稍后操作它们)

我知道有 NewYAMLOrJSONDecoder().Decode() 函数(https://github.com/kubernetes/apimachinery/blob/master/pkg/util/yaml/decoder.go https://github.com/kubernetes/apimachinery/blob/master/pkg/util/yaml/decoder.go)读取 json/yaml 文件,但下一步是:如何将它们转换为 k8s 结构/类型?

即,如果我读取带有命名空间对象的 yaml 文件,如何将其转换为 core/v1/namespace 接口

Regards,


谢谢 svenwltr,我不知道我们可以这样做。

与此同时,我设法找到了一种不同的方法,而不是更好的方法:

package main

import (
    "flag"
    "fmt"
    "os"
    "io"
    "path/filepath"
    "log"
    "encoding/json"
    //"time"

    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
    "k8s.io/client-go/discovery"
    "k8s.io/client-go/dynamic"
    "k8s.io/apimachinery/pkg/util/yaml"
    "k8s.io/apimachinery/pkg/runtime"
    "k8s.io/apimachinery/pkg/runtime/schema"
    "k8s.io/apimachinery/pkg/api/meta"
    "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"

)

func main() {
    var kubeconfig *string
    if home := 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()

    // use the current context in kubeconfig
    config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
    if err != nil {
        panic(err.Error())
    }

    // create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    if err != nil {
        panic(err.Error())
    }

    f,err := os.Open("namespace.yaml")
    if err!=nil {
        log.Fatal(err)
    }
    d := yaml.NewYAMLOrJSONDecoder(f,4096)
    dd := clientset.Discovery()
    apigroups,err := discovery.GetAPIGroupResources(dd)
    if err != nil {
        log.Fatal(err)
    }

    restmapper := discovery.NewRESTMapper(apigroups,meta.InterfacesForUnstructured)


    for {
        // https://github.com/kubernetes/apimachinery/blob/master/pkg/runtime/types.go
        ext := runtime.RawExtension{}
        if err := d.Decode(&ext); err!=nil {
            if err == io.EOF {
                break
            }
            log.Fatal(err)
        }
        fmt.Println("raw: ",string(ext.Raw))
        versions := &runtime.VersionedObjects{}
        //_, gvk, err := objectdecoder.Decode(ext.Raw,nil,versions)
        obj, gvk, err := unstructured.UnstructuredJSONScheme.Decode(ext.Raw,nil,versions)
        fmt.Println("obj: ",obj)

        // https://github.com/kubernetes/apimachinery/blob/master/pkg/api/meta/interfaces.go
        mapping, err := restmapper.RESTMapping(gvk.GroupKind(), gvk.Version)
        if err != nil {
            log.Fatal(err)
        }

        restconfig := config
        restconfig.GroupVersion = &schema.GroupVersion {
            Group: mapping.GroupVersionKind.Group,
            Version: mapping.GroupVersionKind.Version,
        } 
        dclient,err := dynamic.NewClient(restconfig)
        if err != nil {
            log.Fatal(err)
        }

        // https://github.com/kubernetes/client-go/blob/master/discovery/discovery_client.go
        apiresourcelist, err := dd.ServerResources()
        if err != nil {
            log.Fatal(err)
        }
        var myapiresource metav1.APIResource
        for _,apiresourcegroup := range(apiresourcelist) {
            if apiresourcegroup.GroupVersion == mapping.GroupVersionKind.Version {
                for _,apiresource := range(apiresourcegroup.APIResources) {
                    //fmt.Println(apiresource)

                    if apiresource.Name == mapping.Resource && apiresource.Kind == mapping.GroupVersionKind.Kind {
                        myapiresource = apiresource
                    }
                }
            }
        }
        fmt.Println(myapiresource)
        // https://github.com/kubernetes/client-go/blob/master/dynamic/client.go

        var unstruct unstructured.Unstructured
        unstruct.Object = make(map[string]interface{})
        var blob interface{}
        if err := json.Unmarshal(ext.Raw,&blob); err != nil {
            log.Fatal(err)
        }
        unstruct.Object = blob.(map[string]interface{})
        fmt.Println("unstruct:",unstruct)
        ns := "default"
        if md,ok := unstruct.Object["metadata"]; ok {
            metadata := md.(map[string]interface{})
            if internalns,ok := metadata["namespace"]; ok {
                ns = internalns.(string)
            }
        }
        res := dclient.Resource(&myapiresource,ns)
        fmt.Println(res)
        us,err := res.Create(&unstruct)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println("unstruct response:",us)


    }
}

func homeDir() string {
    if h := os.Getenv("HOME"); h != "" {
        return h
    }
    return os.Getenv("USERPROFILE") // windows
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

client-go:将 kubernetes json 文件解析为 k8s 结构 的相关文章

  • 使用 PHP 将表单数据发送/发布到 URL [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个通过 POST 提交的表单 提交表单后我捕获变量 如何连接表单数据 然后将其 POST 到 url 然后重新定向到感谢页面 这不是确
  • 在 Go 中生成随机、固定长度的字节数组

    我有一个字节数组 固定长度为4 token make byte 4 我需要将每个字节设置为随机字节 我怎样才能以最有效的方式做到这一点 这math rand就我而言 方法不提供随机字节函数 也许有一种内置的方法 或者我应该生成一个随机字符串
  • 无法使用 minikube 设置 Istio

    我按照 Istio 的官方文档为带有 minikube 的示例 bookinfo 应用程序设置了 Istio 但我得到了无法连接到服务器 net http TLS 握手超时错误 这些是我遵循的步骤 我安装了 kubectl 和 miniku
  • 如何在 Visual Studio Code 中使用 Delve 调试器进行远程调试

    我已经问过了 得到了很好的答复answer https stackoverflow com questions 39058823 how to use delve debugger in visual studio code用于使用 del
  • 通过API更新Twitter背景

    我在通过 Twitter 的 API 更新背景时遇到了一些问题 target url http www google com logos 11th birthday gif ch curl init curl setopt ch CURLO
  • API Gateway POST 方法在测试期间工作,但不适用于邮递员

    我会尽力清楚地解释我的问题 我有一个 API 它使用 Node js 编写的 lambda 函数在 DynamoDB 中编写一些内容 当我在 AWS 控制台中调用它时 API 按预期工作 我发送这样的正文 user id 4dz545zd
  • 如何为某些节点分配命名空间?

    有什么办法可以配置吗nodeSelector在命名空间级别 我只想在此命名空间的某些节点上运行工作负载 为了达到这个目的 你可以使用PodNodeSelector准入控制器 首先 您需要在您的kubernetes apiserver Edi
  • GAE Go — 如何对不存在的实体键使用 GetMulti?

    我发现自己需要做一个GetMulti使用键数组进行操作 其中某些实体存在 但有些实体不存在 我当前的代码 如下 返回错误 datastore no such entity err datastore GetMulti c keys info
  • 如何成功使用RDAP协议代替whois

    我对新的 RDAP 协议有点困惑 也不知道何时进一步追求它有意义 在我看来 每个人都同意它是 whois 的继承者 但他们的数据库似乎是空的 在 ubuntu 上我尝试了 rdapper nicinfo 甚至他们的 RESTful API
  • 如何在运行“go test”时排除或跳过特定目录[重复]

    这个问题在这里已经有答案了 go test go list grep v vendor coverprofile testCoverage txt 我正在使用上述命令来测试文件 但有 1 个名为 Store 的文件夹我想从测试中排除 怎样才
  • GOPATH值设置

    我用go1 3 1 windows amd64 msi安装go 安装后GOROOT是默认设置 我发现 D Programs Go bin 在 PATH 中 然后我创建一个 GOPATH 环境变量 使用 go get 命令时 出现错误 软件包
  • 适用于 iPhone 和 HTTP 直播的实时视频聊天

    所以一般来说 我想为 iPhone 制作一个具有视频聊天功能的应用程序 但经过多次搜索 我仍然找不到任何成功的结果 是否有任何公共或私有 API 可用于在 iPhone 上执行此操作 如果您的答案是 是 请帮助我 基本上 我想要的是读取连接
  • 使用 PRAW 帮助获取 Reddit 帖子链接到的 URL

    我正在尝试使用 Praw 获取 Reddit 提交标题中链接的帖子 例如提交 http www reddit com r AdviceAnimals comments 1adu71 apparently people still need
  • PHP 版本如何匹配“API=yyyymmdd”签名/标签?

    是否有明确且可靠的来源来找出哪个 PHP 发行版本 x y z 携带 使用哪个 API yyyymmdd 签名 标签 PHP 的版本控制存储库是 PHP 版本与其 API 日期版本之间相关性的权威来源 请记住 仅主要版本PHP 的版本 例如
  • 有没有办法在 VSCode 中保存时运行 go 测试,并将其输出到终端?

    现在我有几个项目在VSCode中运行 运行起来相当繁琐go test每次我编写新代码时 我宁愿立即看看我是否破坏了某些东西 我知道在 Javascript 中我可以在每次保存文件时运行测试 并将输出发送到终端 现在我正在使用 保存时运行 h
  • 使用 HTTPS GRC 从 AWS Codecommit 获取私有存储库

    我正在尝试导入位于 AWS codecommit 中的模块 为了克隆存储库 我使用 HTTPS GRC Git 远程代码提交 方法 该方法使用 Google Suite 凭证来访问 AWS 控制台 我用来克隆存储库的命令是 git clon
  • kubernetes,提示符在端口转发命令处冻结

    我想在在线指南之后设置从本地端口 节点 到 pod redis master 的端口转发库伯内特斯 https kubernetes io docs tasks access application cluster port forward
  • 这两种方式哪一种是惯用的方式? time.Sleep() 还是自动收报机?

    我必须每分钟执行一些语句 我不确定我应该遵循以下哪一项 如果有人能解释内存和 CPU 方面的优缺点 那就太好了 时间 Sleep func main go func for time Sleep time Minute fmt Printl
  • Spotify Apps API:库类不会返回用户播放列表

    我试图获取一个包含用户库中所有播放列表的数组 http developer spotify com download spotify apps api reference dcdebc652c html 其他类属性 专辑 艺术家 加星标的播
  • 让我们加密证书颁发

    我正在尝试获取 Let s Encrypt 颁发的证书 已经过去了 3 个半小时 我不小心最初将我的 SecretName 设置为 echo tls 然后将其切换到我想使用的正确的 pandaist tls 我目前有这个 kubectl g

随机推荐

  • 永久监控代码放在哪里?

    我正在尝试设置永久监视器 我将其添加到我的 app js 中 var forever require forever monitor var child new forever Monitor app js max 3 silent tru
  • 将行旋转为列

    我有一个 SQL 查询 它生成以下内容 col1 col2 col3 item1 key1 value1 item1 key2 value2 这是查询 SELECT t1 col1 t2 col2 t2 col3 FROM table1 t
  • 从窗口服务显示窗口窗体

    我正在创建一个窗口服务 我的要求是按特定时间间隔显示 Windows NT 服务的窗口窗体 出于测试目的 我只想在服务启动时显示表单 protected override void OnStart string args eventLog1
  • 如果图像是背景,TabControl 会闪烁

    我注意到 如果我在具有图像背景的面板中有一个 TabControl 当鼠标悬停在选项卡上时 它会闪烁并重绘 有没有解决方法可以防止这种情况发生 我看到了 发生这种情况是因为 TabControl 通过要求父控件在其自己的窗口内绘制自身来部分
  • Swift - 如果小数等于 0,如何从浮点数中删除小数?

    我显示的距离为一位小数 如果它等于 0 例如 1200 0Km 我想删除该小数 我该如何快速做到这一点 我这样显示这个数字 let distanceFloat Float currentUser distance as NSString f
  • Google Chrome 的 Javascript 控制台键盘快捷键

    我想使用调试我的 javascript 应用程序谷歌浏览器3的开发者工具 一切都很好 直到我真正想开始调试 我可以设置断点等 但我不想使用鼠标而是使用键盘进行调试 In Firefox Firebug I can use F10 F11 a
  • HttpClient.GetAsync 在具有锁屏访问以及 TimeTrigger 或 MaintenanceTrigger 的后台任务中失败

    在 Windows 8 Metro 应用程序的后台任务中运行时 Client GetAsync 对我来说似乎失败 我尝试同时使用 TimeTrigger 和 MaintenanceTrigger 看来也不例外 调试它时 它只是在该行退出 如
  • 具有多个选项的警报

    只是想知道 是否可以创建具有多个选项的警报 例如 在 Facebook 中 当您在未完成输入消息的情况下尝试关闭选项卡 窗口时 会弹出一条带有 离开此页面 和 留在此页面 选项的警报 以表单为例 您正在寻找 window onbeforeu
  • 在机器人框架中连接两个字符串的最简单方法。?

    给定两个字符串 a b 连接它们并分配给机器人框架中的新变量的最简单方法是什么 我尝试了这种简单的Pythonic方式 但它不起作用 var a b 您可以使用Catenate http robotframework org robotfr
  • 适用于 iPhone 的 Google Talk API

    有谁知道如何使用 GData API 连接到 Google Talk 是否有更好的 iphone 开发 API 用于连接 Google Talk 我一直在查看为 API 下载的示例 但没有看到任何支持 This http code goog
  • 用于演示的 R 演示 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 计算 3D 平面的 Voronoi 图

    是否有代码 库可以计算 3D 平面 平行四边形 的 Voronoi 图 我检查了 Qhull 它似乎只能处理点 在它的示例中 Voro 可以处理不同大小的球体 但我找不到任何多边形 在这张图片中 3d 中的样本平面 https i stac
  • Ruby 无法解析 CSV 文件:CSV::MalformedCSVError(第 1 行中的非法引用。)

    Ubuntu 12 04 LTS Ruby ruby 1 9 3dev 2011 09 23 修订版 33323 i686 linux 轨道 3 2 9 以下是我收到的 CSV 文件的内容 date time settlement id t
  • oAuth 和 Codeigniter 与 MongoDB

    我正在使用 Alex Bilbie 制作的 Codeigniter 的 oAuth 库 它是为 MySQL 设计的 有人用过 MongoDB 吗 我将尝试将其 转换 为 MongoDB 但存储库中有很多文件 服务器设置只需要其中很少的文件
  • 从不平衡二叉树中随机选择一个节点

    我的一位朋友遇到了以下面试问题 我们都不太确定正确答案是什么 有谁知道如何解决这个问题 给定一个不平衡二叉树 描述一种随机选择节点的算法 使得每个节点被选择的概率相等 您只需遍历树一次即可完成此操作 该算法与列表相同 当您看到树中的第一个项
  • 您可以使用 POST 而不是 GET 进行 struts2 操作重定向吗?

  • MySQLDataReader在c#中检索Null值问题

    我目前正在开发一个 C 项目 该项目将导出 MySQL 数据 导出适用于服务器内的任何数据库 因此我不会知道表中的字段和数据类型 也不会知道表中的字段是否允许空值 在测试过程中 我发现导出工作正常 但如果字段允许 null 则当 mysql
  • 康威与 Python 的生命游戏

    我喜欢上了 Conway 的 生命游戏 并开始尝试用 Python 编写它 目前我还没有为程序的边界编写任何代码 所以我只是就我现在拥有的东西寻求帮助 我在初始化 闪烁器 阵型时似乎遇到了麻烦 它没有像应有的那样振荡 而是似乎将自己变成了立
  • 使用 buildozer 打包 kivy 应用程序时如何修复“java.lang.module.FindException:未找到模块 java.se.ee”错误

    我正在尝试打包我的 kivy 应用程序 python3 但是当我运行命令时buildozer v android debug看到这个错误 Cwd home javier buildozer android platform android
  • client-go:将 kubernetes json 文件解析为 k8s 结构

    我想解析 kubernetes 清单文件 json yaml 并能够将它们转换为 k8s 结构 以便稍后操作它们 我知道有 NewYAMLOrJSONDecoder Decode 函数 https github com kubernetes