Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rest 理解Go中Kubernetes API框架的逻辑_Rest_Api_Go_Kubernetes - Fatal编程技术网

Rest 理解Go中Kubernetes API框架的逻辑

Rest 理解Go中Kubernetes API框架的逻辑,rest,api,go,kubernetes,Rest,Api,Go,Kubernetes,我目前正在努力学习Go,一些我以前没有使用过的kubernetes API的细节,以及同时学习Go的kubernetes API框架,非常感谢您帮助我理解该框架的语法以及人们为什么要使用它 老实说,如果框架包含与REST端点相同的信息,我不知道为什么要首先使用它。直接通过http库调用API不是更有意义吗 这里有一个例子(摘自): 我感到困扰的是,我必须这样做,然后我还需要弄清楚/v1/转换成CoreV1()。我甚至不知道在哪里可以找到它。另外,整个块metav1.GetOptions{}似乎完

我目前正在努力学习Go,一些我以前没有使用过的kubernetes API的细节,以及同时学习Go的kubernetes API框架,非常感谢您帮助我理解该框架的语法以及人们为什么要使用它

老实说,如果框架包含与REST端点相同的信息,我不知道为什么要首先使用它。直接通过
http
库调用API不是更有意义吗

这里有一个例子(摘自):

我感到困扰的是,我必须这样做,然后我还需要弄清楚
/v1/
转换成
CoreV1()
。我甚至不知道在哪里可以找到它。另外,整个块
metav1.GetOptions{}
似乎完全没有必要,或者HTTP请求的哪个部分由它表示

我希望我能弄清楚困惑是什么,并希望你能帮助我澄清

编辑: 这里还有一个例子,它是由新的运营商框架生成的,遗憾的是,这并没有使它变得更好:

 return &v1.Pod{
    TypeMeta: metav1.TypeMeta{
            Kind:       "Pod",
            APIVersion: "v1",
    },
    ObjectMeta: metav1.ObjectMeta{
            Name:      "busy-box",
            Namespace: cr.Namespace,
            OwnerReferences: []metav1.OwnerReference{
                    *metav1.NewControllerRef(cr, schema.GroupVersionKind{
                            Group:   v1alpha1.SchemeGroupVersion.Group,
                            Version: v1alpha1.SchemeGroupVersion.Version,
                            Kind:    "Memcached",
                    }),
            },
            Labels: labels,
    },
    Spec: v1.PodSpec{
            Containers: []v1.Container{
                    {
                            Name:    "busybox",
                            Image:   "busybox",
                            Command: []string{"sleep", "3600"},
                    },
            },
    },
 }

用户对这个
TypeMeta
对象一无所知。第二个元素称为
ObjectMeta:
,而不是
元数据
。我是说,我不是魔术师。我怎么知道这一点呢。

一位同事建议说,实际上有一些自动生成的文档叫做。虽然它不能回答所有问题,但它已经提高了我使用API库的能力。

我有点晚了,但这是我的2美分

为什么要使用
client go
而不是
http
库 客户机go有几个优点

  • Kubernetes资源被定义为强类型类,意味着更少的拼写错误调试和易于重构

  • 当我们操作一些资源时,它会自动用集群进行身份验证,它只需要一个有效的配置。我们不需要知道身份验证是如何完成的

  • 它有多个版本与不同的Kubernetes版本兼容。它使我们的代码更容易与指定的kubernetes版本保持一致,而不需要知道API更改的每个细节

  • 我如何知道应该调用哪个类和方法 在中,每个资源都有最新的组和版本标记。 例如,在v1.10中是组
    核心
    、版本
    v1
    、种类
    Pod

    列出了每个类的所有属性和详细解释的链接,如


    因此,可以通过调用,然后,然后找到pod列表。

    在前面提到的内容中添加一些内容:

    您确实可以简单地对apiserver进行http调用,但是
    client go
    已经为您完成了所有艰苦的工作!以“监视”端点为例:

    您可以自己编写功能代码,或使用
    SharedInfo
    界面等

    client go中的代码已经过测试,应该相对没有bug

    如果您为golang正确设置编辑器,当您开始键入golang API调用时,它将为您提供类型提示和可用的函数调用


    我会先学习golang,然后根据您想要做的事情尝试摸索
    客户机go

    ,也许其他端点是有意义的。但是,如果您需要轻松地操作Go中返回的api对象,那么使用客户机无疑是最好的解决方案。但是,您如何找到要操作的对象呢?例如,您如何了解被称为
    CoreV1
    而不是
    v1
    CoreV1
    ?我想知道是否大多数人使用代码完成的编辑器,所以他们甚至不知道这个痛点。与k8s一样好、一样流行的是,我不知道kubecli包是否是惯用Go的一个好例子。特别是,创建这样的可链接方法是一个很长、很难阅读和在上下文中推理的代码行的诀窍。它似乎是特意编写的,以匹配CLI语法。如果您在cli命令和Go之间进行转换,这会减少认知负载,但如果您试图学习Go,则不会。@voutasaurus重点不是学习Go。重点是学习编写与API对话的Go代码。我不是GO的专家,只是一个知道如何做到这一点的人的暗示,所以他们可以思考非GO程序员可能不考虑的方式。对于阅读代码块来说,知道什么样的结构也是很有趣的。老实说,没有人期望得到这样一个好的解释,但这正是我所要寻找的。一些甜美的资源节约支持,如使用相同的代码块、格式良好的多个kubernetes api版本,以及一个示例。感谢您显示真正的stackoverflow仍然存在!
     return &v1.Pod{
        TypeMeta: metav1.TypeMeta{
                Kind:       "Pod",
                APIVersion: "v1",
        },
        ObjectMeta: metav1.ObjectMeta{
                Name:      "busy-box",
                Namespace: cr.Namespace,
                OwnerReferences: []metav1.OwnerReference{
                        *metav1.NewControllerRef(cr, schema.GroupVersionKind{
                                Group:   v1alpha1.SchemeGroupVersion.Group,
                                Version: v1alpha1.SchemeGroupVersion.Version,
                                Kind:    "Memcached",
                        }),
                },
                Labels: labels,
        },
        Spec: v1.PodSpec{
                Containers: []v1.Container{
                        {
                                Name:    "busybox",
                                Image:   "busybox",
                                Command: []string{"sleep", "3600"},
                        },
                },
        },
     }