理解Go中Kubernetes API框架的逻辑

时间:2018-05-10 21:48:27

标签: rest api go kubernetes

我目前正在尝试围绕学习Go,我之前没有使用的kubernetes API的一些细节以及同时用于Go的kubernetes api框架,并且非常感谢您帮助理解语法该框架以及人们为何仍然使用它。

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

这是一个例子(取自some real code):

pod, err := kubecli.CoreV1().Pods(namespace).Get(name, metav1.GetOptions{})

我觉得麻烦的是我必须look up everything in the API docs然后我还要弄清/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"},
                    },
            },
    },
 }

API docs对这个TypeMeta对象一无所知。第二个元素称为ObjectMeta:而不是metadata。我的意思是,我不是魔术师。我该怎么知道呢。

3 个答案:

答案 0 :(得分:1)

一位同事建议实际上有一个名为godoc的自动生成的文档。虽然它没有回答所有问题,但它已经提高了我使用API​​库的能力。

答案 1 :(得分:1)

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

为什么要使用client-go代替http

client-go的serval职业选手。

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

  2. 当我们操纵某些资源时,它自动对群集进行身份验证doc),它只需要一个有效的配置。我们不需要知道验证的确切程度。

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

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

    API Reference中,每个资源都有最新的Group和Version标记。 例如,Pod是群组core,版本v1,种类Pod在v1.10中。

    GoDoc列出了所有属性以及指向Pod等每个类的详细说明的链接。

    因此,可以通过调用CoreV1(),然后Pods(namespace string),然后List(opts meta_v1.ListOptions)来找到广告连播列表。

答案 2 :(得分:1)

到目前为止提到的内容中添加了一些内容:

您确实可以简单地对apiserver进行http调用,但client-go已经为您完成了所有艰苦的工作!以此为例,观看'终点:

https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.10/#watch-202

您可以自己编写功能代码,或者使用例如SharedInformer界面

https://github.com/kubernetes/client-go/blob/master/tools/cache/shared_informer.go#L34-L41

client-go中的代码已经过测试,并且相对没有错误。

如果你为golang正确设置编辑器,当你开始输入golang API调用时,它会给你提供类型提示和可用的函数调用。

我先学习golang,然后尝试一下client-go