核心.v1.Pod.PodSpec中未填充cpu /内存量

时间:2018-06-07 06:12:42

标签: go kubernetes

使用以下代码:

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
    }
return list.Items, nil
}

然后使用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.StringPod.Marshal方法。

pod.String()输出似乎是core.v1.Pod实例的格式化字符串,这对我来说没什么用,因为它没有被序列化。

Pod.Marshal()给出一个字节数组,打印时包含大量乱码。该方法本身是k8s.io/api/core/v1/generated.pb.go内部未记录的方法之一,我真的不知道如何处理它的输出:

func (p *PodResolver) SpecYaml() (string, error) {
    bs, err := p.pod.Marshal()
    fmt.Println(string(bs))
    return string(bs), err
}
// prints a whole lot of gibberish like 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

4 个答案:

答案 0 :(得分:1)

您可以简单地在数量字段上调用String()方法,这将返回类似“100m”

的内容

似乎Quantity类型上没有任何yaml标记。

答案 1 :(得分:0)

因此,我应该使用json.Marshal代替使用kubectl,而是提供包括cpu和内存数量在内的所有信息。

如@ user2326871所述,Quantity struct缺少yaml标签。

多么奇怪的库及其所有奇怪的方法,我确信Pod必须使用相同的Maximum&Minimum结构来生成所有的yaml输出。

答案 2 :(得分:0)

尝试一下:

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的文档记录不尽如人意,在这种情况下,我的建议是打开调试控制台并浏览组件树,这些树肯定会指示使用哪个接口及其结构。

答案 3 :(得分:0)

您可以使用“k8s.io/apimachinery/pkg/runtime/serializer/json”将部署(或 pod)对象编组到 YAML(清单)字符串中。

试试这个。

import k8sJson "k8s.io/apimachinery/pkg/runtime/serializer/json"

e := k8sJson.NewYAMLSerializer(k8sJson.DefaultMetaFactory, nil, nil)
yamlDeployment := new(bytes.Buffer)
err = e.Encode(deployment, yamlDeployment)

fmt.Println(yamlDeployment.String())