我目前正在尝试围绕学习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
。我的意思是,我不是魔术师。我该怎么知道呢。
答案 0 :(得分:1)
一位同事建议实际上有一个名为godoc的自动生成的文档。虽然它没有回答所有问题,但它已经提高了我使用API库的能力。
答案 1 :(得分:1)
我有点晚了,但这是我的2美分。
client-go
代替http
库有client-go
的serval职业选手。
Kubernetes资源被定义为强类型类,意味着更少拼写错误的调试并且易于重构。
当我们操纵某些资源时,它自动对群集进行身份验证(doc),它只需要一个有效的配置。我们不需要知道验证的确切程度。
它有多个版本兼容,具有不同的Kubernetes版本。它使我们的代码更容易指定kubernetes版本,而不了解API更改的每个细节。
在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