client-go:将 kubernetes json 文件解析为 k8s 结构

Nic*_*Zin 5 api client go kubernetes kubernetes-go-client

我想解析 kubernetes 清单文件(json/yaml)并能够将它们转换为 k8s 结构(稍后操作它们)

我知道有 NewYAMLOrJSONDecoder().Decode() 函数(https://github.com/kubernetes/apimachinery/blob/master/pkg/util/yaml/decoder.go)来读取 json/yaml 文件,但是下一步是:如何将它们转换为 k8s 结构/类型?

即,如果我读取带有 Namespace 对象的 yaml 文件,例如如何将其转换为 core/v1/namespace 接口

问候,

sve*_*ltr 2

这个问题与How to deserialize Kubernetes YAML file非常相似,但是这个问题有点过时,因为包名称发生了变化。

而且它不直接使用 go 客户端,这意味着可能还有另一种解决方案。

这是一个例子:

package main

import (
    "fmt"

    "k8s.io/kubernetes/pkg/api"
    _ "k8s.io/kubernetes/pkg/api/install"
    _ "k8s.io/kubernetes/pkg/apis/extensions/install"
    "k8s.io/kubernetes/pkg/apis/extensions/v1beta1"
)

var json = `
{
  "apiVersion": "extensions/v1beta1",
  "kind": "Deployment",
  "metadata": null,
  "name": "my-nginx",
  "replicas": 2,
  "spec": null,
  "template": {
    "metadata": {
      "labels": {
        "run": "my-nginx"
      }
    },
    "spec": {
      "containers": [
        {
          "image": "nginx",
          "name": "my-nginx",
          "ports": [
            {
              "containerPort": 80
            }
          ]
        }
      ]
    }
  }
}
`

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

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

    deployment := obj.(*v1beta1.Deployment)

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

笔记

  • .../install很重要,因为它们定义了可以解码哪些类型
  • 它能够解码 JSON、YAML 以及可能还有所有其他支持的文件类型
  • 不确定UniversalDecoderUniversalDeserializer之间的区别在哪里