登录
首页 >  Golang >  Go问答

获取特定 k8s 资源的 JSON 格式的 schema.GroupVersionResource

来源:stackoverflow

时间:2024-02-24 19:15:28 217浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《获取特定 k8s 资源的 JSON 格式的 schema.GroupVersionResource》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

  • client-go v0.19.2
  • golang 1.13

我正在构建一个工具来从 json 创建 k8s 资源(就像 kubectl create -f 一样)。

我发现动态客户端可以做这样的事情,但是当我将它与下面的代码一起使用时,我发现很难找到给定资源的 json 的 schema.groupversionresource 。我是否缺少某些内容或者获取资源的唯一方法是通过休息映射器?

container := &unstructured.unstructured{}
if err := container.unmarshaljson([]byte(jsonstring); err != nil {
    return err
}

_, err := k8sclient.dynamic.resource(?).create(ctx, container, metav1.createoptions{})
if err != nil {
    return err
}

我知道解决方法是编写一些如下所示的代码,但我确信这不是最佳实践,而且除了 crd 之外还有太多代码。

var kindResourceMap = map[string]schema.GroupVersionResource{
    "Deployment": {
        Group:    "apps",
        Version:  "v1",
        Resource: "deployments",
    },
    "ConfigMap": {
        Group:    "apps",
        Version:  "v1",
        Resource: "configmaps",
    },
    "Job": {
        Group:    "batch",
        Version:  "v1",
        Resource: "jobs",
    },
    "Secret": {
        Group:    "api",
        Version:  "v1",
        Resource: "secrets",
    },
    "Service": {
        Group:    "api",
        Version:  "v1",
        Resource: "services",
    },
    "StatefulSet": {
        Group:    "apps",
        Version:  "v1",
        Resource: "statefulsets",
    },
    "PersistentVolume": {
        Group:    "api",
        Version:  "v1",
        Resource: "persistentvolumes",
    },
    "CustomResourceDefinition": {
        Group:    "apiextensions.k8s.io",
        Version:  "v1beta1",
        Resource: "customresourcedefinitions",
    },
}

正确答案


您可以使用 restmapper,通过 discovery 客户端直接查询来自 metav1 的定义。

import (
    "k8s.io/client-go/rest"
    "k8s.io/client-go/discovery"
    "k8s.io/client-go/restmapper"
    "k8s.io/apimachinery/pkg/runtime/schema"
)

 ...

c := discovery.newdiscoveryclientforconfigordie(&rest.config{})

groupresources, err := restmapper.getapigroupresources(c)
mapper := restmapper.newdiscoveryrestmapper(groupresources)

mapping, err := mapper.restmapping(schema.parsegroupkind("apps.deployment"))
fmt.println(mapping.resource)

这是在 sigs.k8s.io/controller-runtime/pkg/client 中编写的

mapping, err := c.RESTMapper().RESTMapping(schema.ParseGroupKind("apps.Deployment"))
fmt.Println(mapping.Resource)

看看这里是如何完成的: https://github.com/kubernetes-sigs/controller-runtime/blob/master/pkg/client/apiutil/dynamicrestmapper.go#L77

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

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