如何反序列化Kubernetes YAML文件 [英] How to deserialize Kubernetes YAML file

查看:2074
本文介绍了如何反序列化Kubernetes YAML文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

  no kindDeployment已注册版本apps / v1beta1

这是一个MWE:

  package main 

import(
fmt

k8s.io/client-go/pkg/api


var service =`
apiVersion:apps / v1beta1
kind :部署
元数据:
名称:my-nginx
规格:
副本:2
模板:
元数据:
标签:
run:my-nginx
spec:
containers:
- name:my-nginx
image:nginx
ports:
- containerPort:80


func main(){
decode:= api.Codecs.UniversalDecoder()。解码
// decode:= api.Codecs.UniversalDeserializer()解码
$ b obj,_,err:= decode([] byte(service),nil,nil)
if err!= nil {
panic(err)


fmt.Printf(%#v \ n,obj)
}

我正在使用客户端版本 2.0.0 glide.yaml 看起来像这样:

  package:test / stackoverflow 
导入:
- 包:k8s.io/client-go
版本:^ 2.0.0

这些是对 kubectl 的引用:





不幸的是,

编辑:



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


  • no kindService已注册版本v1


解决方案

您需要导入 _k8s.io/client-go/pkg/apis/extensions/install否则模式为空,另请参阅 docs



完整的工作示例是:

  $ go get -u github.com/golang/dep/cmd/dep 
$ dep init
$ go run main.go

使用以下 main.go

 包主

导入(
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
元数据:
名称:my-nginx
规格:
副本:2
模板:
元数据:
标签:
运行:my-nginx
spec:
containers:
- name:my-nginx
image:nginx
ports:
- containerPort:80


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

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

fmt.Printf(%#v \ n,obj)
}
pre>

请注意,我还导入了 _k8s.io/client-go/pkg/api/install你可以在 v1 中使用对象,例如pod或services。



编辑:给我的同事的荣誉 Stefan Schimanski 谁提出了初步解决方案。


How can I deserialize a Kubernetes YAML file into an Go struct? I took a look into the kubectl code, but somehow I get an error for every YAML file:

no kind "Deployment" is registered for version "apps/v1beta1"

This is an 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)
}

I am using client version 2.0.0. The glide.yaml looks like this:

package: test/stackoverflow
import:
- package: k8s.io/client-go
  version: ^2.0.0

These are the references to kubectl:

Unfortunately, the docs are very confusing to me, so I have no idea how to tackle this problem.

Edit:

This problem also exists with other resource types:

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

解决方案

You need to import _ "k8s.io/client-go/pkg/apis/extensions/install" otherwise the schema is empty, see also docs.

The complete working example is:

$ go get -u github.com/golang/dep/cmd/dep
$ dep init
$ go run main.go

With the following 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)
}

Note that I also imported _ "k8s.io/client-go/pkg/api/install" for you so that you can use objects in v1 such as pods or services.

EDIT: Kudos to my colleague Stefan Schimanski who proposed the initial solution.

这篇关于如何反序列化Kubernetes YAML文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆