我目前正在努力学习 Go,我之前没有使用过的 kubernetes API 的一些细节以及 Go 的 kubernetes api 框架,希望您能帮助理解 Go 的语法该框架以及人们为什么要使用它。
老实说,如果框架包含与 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()
。而且我什至不确定在哪里可以找到它。整个 block 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
。我的意思是,我不是魔术师。我怎么会知道。
最佳答案
我有点晚了,但这是我的 2 美分。
为什么要使用 client-go
而不是 http
库
client-go
有很多专业人士。
Kubernetes 资源被定义为强类型类,意味着更少的拼写错误调试和易于重构。
当我们操作一些资源时,它自动通过集群进行身份验证(doc),它只需要一个有效的配置。而且我们不需要知道身份验证是如何完成的。
它有多个版本兼容与不同的 Kubernetes 版本。它使我们的代码更容易与指定的 kubernetes 版本保持一致,而无需了解 API 更改的每一个细节。
我怎么知道应该调用哪个类和方法
在 API Reference ,每个资源都有最新的 Group 和 Version 标签。
例如,Pod是组 core
,版本 v1
,种类 Pod
在 v1.10 中。
GoDoc列出了每个类的所有属性和详细说明的链接,例如 Pod .
所以调用 CoreV1()
可以找到 pod 列表,然后 Pods(namespace string)
,然后 List(opts meta_v1.ListOptions)
.
关于rest - 理解 Go 中 Kubernetes API 框架的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50281984/