使用以下代码:
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.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
答案 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())