为什么解码返回结果为空

时间:2019-05-04 04:42:00

标签: go kubernetes

我有以下代码,我想将yaml转换为客户端go数据结构并从中获取对象名称

package main

import (
  "fmt"

  "k8s.io/api/extensions/v1beta1"
  "k8s.io/client-go/kubernetes/scheme"
)

var yml = `
apiVersion: extensions/v1beta1
kind: Deployment
metadata: 
name: testnginx
replicas: 1
spec: 
template:
  metadata:
    labels:
      run: testnginx
  spec:
    containers:
    - image: nginx
      name: testnginx
      ports:
      - containerPort: 8080
`

func main() {
    decode := scheme.Codecs.UniversalDeserializer().Decode

    obj, _, err := decode([]byte(yml), nil, nil)
    if err != nil {
        fmt.Printf("%#v", err)
    }

  //fmt.Printf("%#v\n", obj)
  deployment := obj.(*v1beta1.Deployment)

    fmt.Printf("%#v\n", deployment.ObjectMeta.Name)
}

返回结果应该是testnginx,但为空

$ ./decode-k8s-exercise 
""

不知道为什么。谢谢

1 个答案:

答案 0 :(得分:4)

问题出在yaml中。 name字段应该是metadata内的一个属性,但是它们当前处于同一级别。如果您在空格上缩进该名称,则该名称应起作用(稍后对template也是如此)。 relicas也应放在spec内:

var yml = `
apiVersion: extensions/v1beta1
kind: Deployment
metadata: 
  name: testnginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        run: testnginx
    spec:
      containers:
      - image: nginx
        name: testnginx
        ports:
        - containerPort: 8080
`