如何反序列化 Kubernetes YAML 文件

sve*_*ltr 8 go kubernetes kubernetes-go-client

如何将 Kubernetes YAML 文件反序列化为 Go 结构?我查看了kubectl代码,但不知何故我收到每个 YAML 文件的错误:

no kind "Deployment" is registered for version "apps/v1beta1"
Run Code Online (Sandbox Code Playgroud)

这是一个 MWE:

package main

import (
    "fmt"

    "k8s.io/client-go/pkg/api"
)

var service = `
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: nginx
        ports:
        - containerPort: 80
`

func main() {
    decode := api.Codecs.UniversalDecoder().Decode
    //decode := api.Codecs.UniversalDeserializer().Decode

    obj, _, err := decode([]byte(service), nil, nil)
    if err != nil {
        panic(err)
    }

    fmt.Printf("%#v\n", obj)
}
Run Code Online (Sandbox Code Playgroud)

我正在使用客户端版本2.0.0。该glide.yaml如下所示:

package: test/stackoverflow
import:
- package: k8s.io/client-go
  version: ^2.0.0
Run Code Online (Sandbox Code Playgroud)

这些是参考kubectl

不幸的是,这些文档让我很困惑,所以我不知道如何解决这个问题。

编辑:

其他资源类型也存在此问题:

  • no kind "Service" is registered for version "v1"

Mic*_*las 5

您需要导入,_ "k8s.io/client-go/pkg/apis/extensions/install"否则架构为空,另请参阅docs

完整的工作示例是:

$ go get -u github.com/golang/dep/cmd/dep
$ dep init
$ go run main.go
Run Code Online (Sandbox Code Playgroud)

具有以下内容main.go

package main

import (
    "fmt"

    "k8s.io/client-go/pkg/api"
    _ "k8s.io/client-go/pkg/api/install"
    _ "k8s.io/client-go/pkg/apis/extensions/install"
)

var deployment = `
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: my-nginx
spec:
replicas: 2
template:
  metadata:
    labels:
      run: my-nginx
  spec:
    containers:
    - name: my-nginx
      image: nginx
      ports:
      - containerPort: 80
`

func main() {
    // decode := api.Codecs.UniversalDecoder().Decode
    decode := api.Codecs.UniversalDeserializer().Decode

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

    fmt.Printf("%#v\n", obj)
}
Run Code Online (Sandbox Code Playgroud)

请注意,我还_ "k8s.io/client-go/pkg/api/install"为您导入,以便您可以使用v1pod 或服务等对象。

编辑:感谢我的同事Stefan Schimanski,他提出了最初的解决方案。

  • 接受的答案已过时 - 不再有 `k8s.io/client-go/api/install` 包。请参阅带有更正版本的 github 讨论:https://github.com/kubernetes/client-go/issues/193#issuecomment-377140518 (6认同)