使用以下代码:
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 spec yaml?上面的过程我做错了什么?
更新
我注意到 Pod.String
和 Pod.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
最佳答案
您可以简单地在数量字段上调用 String() 方法,它会返回类似于“100m”的内容
Quantity
类型似乎没有任何 yaml 标签。
关于go - core.v1.Pod.PodSpec 中未填充 cpu/内存量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50734067/