Go 未在core.v1.Pod.PodSpec中填充cpu/内存量
使用以下代码:Go 未在core.v1.Pod.PodSpec中填充cpu/内存量,go,kubernetes,Go,Kubernetes,使用以下代码: func GetPods(clientset*kubernetes.clientset,名称,命名空间字符串)([]corev1.Pod,错误){ list,err:=clientset.CoreV1().Pods(命名空间).list(metav1.ListOptions{ 标签选择器:fmt.Sprintf(“应用程序=%s”,名称), }) 如果错误!=零{ 返回零,错误 } 返回列表。项目,无 } 然后使用gopkg.in/yaml.v2将结果转储到yaml中,下面是描
func GetPods(clientset*kubernetes.clientset,名称,命名空间字符串)([]corev1.Pod,错误){
list,err:=clientset.CoreV1().Pods(命名空间).list(metav1.ListOptions{
标签选择器:fmt.Sprintf(“应用程序=%s”,名称),
})
如果错误!=零{
返回零,错误
}
返回列表。项目,无
}
然后使用gopkg.in/yaml.v2
将结果转储到yaml中,下面是描述容器资源的yaml子句:
resources:
limits:
cpu:
format: DecimalSI
memory:
format: BinarySI
requests:
cpu:
format: DecimalSI
memory:
format: BinarySI
这不包括我真正感兴趣的实际资源量,使用kubectl get pod xxx-o yaml应该是这样的:
resources:
limits:
cpu: "4"
memory: 8Gi
requests:
cpu: 200m
memory: 100Mi
那么,我如何使用golang库正确地获取包含所有资源信息的pod规范yaml呢?在上述过程中,我做错了什么
使现代化
我注意到了它的特点和方法
pod.String()
输出似乎是core.v1.pod
实例的格式化字符串,这对我没有多大用处,因为它没有序列化
Pod.marshall()
给出一个字节数组,打印时包含大量乱码。该方法本身是k8s.io/api/core/v1/generated.pb.go
中未记录的方法之一,我真的不知道如何处理其输出:
func(p*PodResolver)SpecYaml()(字符串,错误){
bs,err:=p.pod.Marshal()
格式打印项次(字符串(bs))
返回字符串(bs),错误
}
//打印大量胡言乱语,如cpu\x12\x03\n\x014\n\x0f\n\x06memory\x12\x05\n\x038Gi\x12\r\n\x03cpu\x12\x06\n\x04200m\x12\x11\n\x06memory\x12\a\n\x05100MiJ-\n\n
您只需对quantity字段调用String()方法,该字段将返回类似“100m”的值
Quantity
类型上似乎没有任何yaml标记。因此,我应该使用json.Marshal
,而不是使用yaml.Marshal
,这将提供包括cpu和内存数量在内的所有信息
如@user2326871所述,Quantity结构缺少yaml标记
多么奇怪的库及其所有奇怪的方法,我确信kubectl
必须使用相同的Pod
结构来生成其所有yaml输出。尝试一下:
func GetPods(clientset *kubernetes.Clientset, name, namespace string) ([]corev1.Pod, error) {
list, err := clientset.CoreV1().Pods(namespace).List(metav1.ListOptions{
LabelSelector: fmt.Sprintf("app=%s", name),
})
if err != nil {
return nil, err
}
for _, l := range list.Items {
fmt.Println("Request CPU ==> ", l.Spec.Containers[0].Resources.Requests.Cpu(), " Request Memory ==> ", l.Spec.Containers[0].Resources.Requests.Memory())
fmt.Println("Limit CPU ==> ", l.Spec.Containers[0].Resources.Limits.Cpu(), " Limit Memory ==> ", l.Spec.Containers[0].Resources.Limits.Memory()) } return list.Items, nil }
记住,每当事情变得复杂时,是时候
选择另一条路
k8s API的文档记录不是很好,在这种情况下,我的建议是打开调试控制台并浏览组件树,组件树肯定会指示使用哪种接口及其结构。如何将结果转储到YAML中?我刚刚使用了“gopkg.in/YAML.v2”@VishalBiyaniTrue,Pod.String()
包含正确的信息,但我无法使用它,因为它没有序列化。至于缺少的yaml标记,我很好奇kubectl
是如何打印完整的规范的,但我还没有找到实现这一点的代码。