理解Go中Kubernetes API框架的逻辑

eri*_*ork 10 api rest go kubernetes

我目前正试图围绕学习Go,我之前没有使用的kubernetes API的一些细节和Go的kubernetes api框架,并且非常感谢你帮助理解该框架的语法和为什么人们仍然使用它.

老实说,如果它包含与REST端点相同的信息,我不确定为什么首先使用框架.仅通过http库直接调用API会不会更有意义?

这是一个例子(取自一些真实的代码):

pod, err := kubecli.CoreV1().Pods(namespace).Get(name, metav1.GetOptions{})
Run Code Online (Sandbox Code Playgroud)

我觉得麻烦的是,我必须在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"},
                    },
            },
    },
 }
Run Code Online (Sandbox Code Playgroud)

API文档不知道这事TypeMeta的对象.并且第二个元素被调用ObjectMeta:而不是metadata.我的意思是,我不是魔术师.我怎么知道这个.

sil*_*fox 4

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

为什么使用client-go而不是http

有很多专业人士client-go

  1. Kubernetes资源被定义为强类型类,意味着更少的拼写错误调试并且易于重构。

  2. 当我们操作一些资源时,它会自动向集群进行身份验证doc),它只需要一个有效的配置。而且我们不需要知道身份验证到底是如何完成的。

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

我如何知道应该调用哪个类和方法

API 参考中,每个资源都有最新的 Group 和 Version 标签。例如,Pod在 v1.10 中是 group core、 version v1、 kind Pod

GoDoc列出了每个类(如Pod)的所有属性和详细解释链接。

CoreV1()所以可以通过调用, then Pods(namespace string), then找到 pod 列表List(opts meta_v1.ListOptions)