Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 未在core.v1.Pod.PodSpec中填充cpu/内存量_Go_Kubernetes - Fatal编程技术网

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
是如何打印完整的规范的,但我还没有找到实现这一点的代码。